From d6b7f5161d6303f2bd2e085e38f4820b2b145856 Mon Sep 17 00:00:00 2001 From: KrisDavie Date: Tue, 22 Apr 2025 09:53:26 +0200 Subject: [PATCH 01/20] More glitched fixes --- Fill.py | 2 +- ItemList.py | 12 +++++++++++- Rom.py | 7 +++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Fill.py b/Fill.py index 79af1403..c6189460 100644 --- a/Fill.py +++ b/Fill.py @@ -83,7 +83,7 @@ def fill_dungeons_restrictive(world, shuffled_locations): shuffled_locations.pop(i) # place 2 HMG keys hybrid_state_base = all_state_base.copy() - for x in bigs + smalls + prizes + others: + for x in bigs + smalls + others: hybrid_state_base.collect(x, True) hybrid_smalls = [ItemFactory('Small Key (Swamp Palace)', player)] * 2 fill(hybrid_state_base, hybrid_smalls, hybrid_locations, unplaced_smalls) diff --git a/ItemList.py b/ItemList.py index 5889e4d0..3dce2da3 100644 --- a/ItemList.py +++ b/ItemList.py @@ -368,7 +368,17 @@ def generate_itempool(world, player): or (item.map and world.mapshuffle[player]) or (item.compass and world.compassshuffle[player]))]) - + if world.logic[player] == 'hybridglitches' and world.pottery[player] not in ['none', 'cave']: + keys_to_remove = 2 + to_remove = [] + for wix, wi in enumerate(world.itempool): + if wi.name == 'Small Key (Swamp Palace)' and wi.player == player: + to_remove.append(wix) + if keys_to_remove == len(to_remove): + break + for wix in reversed(to_remove): + del world.itempool[wix] + # logic has some branches where having 4 hearts is one possible requirement (of several alternatives) # rather than making all hearts/heart pieces progression items (which slows down generation considerably) # We mark one random heart container as an advancement item (or 4 heart pieces in expert mode) diff --git a/Rom.py b/Rom.py index 4fd43122..984ac066 100644 --- a/Rom.py +++ b/Rom.py @@ -463,6 +463,13 @@ def patch_rom(world, rom, player, team, is_mystery=False): rom.write_byte(location.player_address, location.item.player) else: itemid = 0x5A + + if not location.locked and ((location.item.smallkey and world.keyshuffle[player] == 'none') or ( + location.item.bigkey and world.bigkeyshuffle[player] == 'none') or ( + location.item.map and world.mapshuffle[player] == 'none') or ( + location.item.compass and world.compassshuffle[player] == 'none')): + itemid = handle_native_dungeon(location, itemid) + rom.write_byte(location.address, itemid) else: # crystals From e63f686308a6c4572312a4640185cfe751585871 Mon Sep 17 00:00:00 2001 From: theclearmouse <105736589+theclearmouse@users.noreply.github.com> Date: Mon, 2 Jun 2025 23:52:43 -0400 Subject: [PATCH 02/20] Update Text.py updated ladder to stepladder because ladder is no more --- Text.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Text.py b/Text.py index f698eae2..59c5e716 100644 --- a/Text.py +++ b/Text.py @@ -192,8 +192,8 @@ Blind_texts = [ "Gloves open\na handful\nof checks", "Red mail?\nReturn to\nsender.", "For sale:\nBaby boots,\nNever found", - "SRL or rtGG?\nI prefer the\nLadder", - "Ladders are\nalways up\nto something", + "SRL or rtGG?\nI prefer the\nStepladder", + "Stepladders are\nalways up\nto something", "Zelda's\nfashion is\nvery chic", "Zombie geese\nare waterfoul.\n", "I bought some\ncuccos for a\npoultry sum.", From 97199581192d0dddf9e22b1b0798b251d6e06dc1 Mon Sep 17 00:00:00 2001 From: theclearmouse <105736589+theclearmouse@users.noreply.github.com> Date: Mon, 2 Jun 2025 23:55:23 -0400 Subject: [PATCH 03/20] revert --- Text.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Text.py b/Text.py index 59c5e716..72ee9c28 100644 --- a/Text.py +++ b/Text.py @@ -193,7 +193,7 @@ Blind_texts = [ "Red mail?\nReturn to\nsender.", "For sale:\nBaby boots,\nNever found", "SRL or rtGG?\nI prefer the\nStepladder", - "Stepladders are\nalways up\nto something", + "Ladders are\nalways up\nto something", "Zelda's\nfashion is\nvery chic", "Zombie geese\nare waterfoul.\n", "I bought some\ncuccos for a\npoultry sum.", From e00c0ee88da6a5bbe4860c3903402e1d3d869db2 Mon Sep 17 00:00:00 2001 From: theclearmouse <105736589+theclearmouse@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:55:14 -0500 Subject: [PATCH 04/20] update tournament winners in telepathy tiles --- Text.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Text.py b/Text.py index f698eae2..f328ae1f 100644 --- a/Text.py +++ b/Text.py @@ -1780,6 +1780,8 @@ class TextTable(object): text['hylian_text_2'] = CompressedTextMapper.convert("%%^= %==%\n ^ =%^=\n==%= ^^%^") text['desert_entry_translated'] = CompressedTextMapper.convert("Kneel before this stone, and magic will move around you.") text['telepathic_tile_under_ganon'] = CompressedTextMapper.convert("Doors Async League winners\n{HARP}\n" + " ~~~2025~~~\nSchulzer\n\n" + " ~~~2024~~~\nhumbugh\n\n" " ~~~2023~~~\nEriror\n\n" " ~~~2022~~~\nAndy\n\n" " ~~~2021~~~\nprdwong") @@ -1793,7 +1795,8 @@ class TextTable(object): text['telepathic_tile_ice_stalfos_knights_room'] = CompressedTextMapper.convert("{NOBORDER}\nKnock 'em down and then bomb them dead.") text['telepathic_tile_tower_of_hera_entrance'] = CompressedTextMapper.convert("{NOBORDER}\nThis is a bad place, with a guy who will make you fall…\n\n\na lot.") text['houlihan_room'] = CompressedTextMapper.convert("Randomizer tournament winners\n{HARP}\n" - " ~~~2023~~~\nnGanonsGoneWild\n\n" + " ~~~2024~~~\nnGammachuu\n\n" + " ~~~2023~~~\nGanonsGoneWild\n\n" " ~~~2022~~~\nObscure\n\n" " ~~~2021~~~\nDaaanty\n\n" " ~~~2019~~~\nJet082\n\n" @@ -2027,6 +2030,7 @@ class TextTable(object): text['ganon_phase_3_alt'] = CompressedTextMapper.convert("Got wax in your ears? I cannot die!") # 190 text['sign_east_death_mountain_bridge'] = CompressedTextMapper.convert("Glitched\ntournament\nwinners\n{HARP}\n" + "~~~HMG 2025~~~\nSkelen\n" "~~~No Logic 2024~~~\ntam\n\n" "~~~HMG 2023~~~\ntam\n\n" "~~~No Logic 2022~~~\nChexhuman\n\n" From 61dd76e7ea88ca0f99629f6a620318b969738345 Mon Sep 17 00:00:00 2001 From: theclearmouse <105736589+theclearmouse@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:56:55 -0500 Subject: [PATCH 05/20] typo --- Text.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Text.py b/Text.py index f328ae1f..2f27304c 100644 --- a/Text.py +++ b/Text.py @@ -1795,7 +1795,7 @@ class TextTable(object): text['telepathic_tile_ice_stalfos_knights_room'] = CompressedTextMapper.convert("{NOBORDER}\nKnock 'em down and then bomb them dead.") text['telepathic_tile_tower_of_hera_entrance'] = CompressedTextMapper.convert("{NOBORDER}\nThis is a bad place, with a guy who will make you fall…\n\n\na lot.") text['houlihan_room'] = CompressedTextMapper.convert("Randomizer tournament winners\n{HARP}\n" - " ~~~2024~~~\nnGammachuu\n\n" + " ~~~2024~~~\nGammachuu\n\n" " ~~~2023~~~\nGanonsGoneWild\n\n" " ~~~2022~~~\nObscure\n\n" " ~~~2021~~~\nDaaanty\n\n" From 8b75aeb78f68c417b16e37285bbf3e05e528f454 Mon Sep 17 00:00:00 2001 From: theclearmouse <105736589+theclearmouse@users.noreply.github.com> Date: Mon, 3 Nov 2025 11:35:10 -0500 Subject: [PATCH 06/20] fix typo --- Text.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Text.py b/Text.py index 2f27304c..df662575 100644 --- a/Text.py +++ b/Text.py @@ -2030,7 +2030,7 @@ class TextTable(object): text['ganon_phase_3_alt'] = CompressedTextMapper.convert("Got wax in your ears? I cannot die!") # 190 text['sign_east_death_mountain_bridge'] = CompressedTextMapper.convert("Glitched\ntournament\nwinners\n{HARP}\n" - "~~~HMG 2025~~~\nSkelen\n" + "~~~HMG 2025~~~\nSkele\n" "~~~No Logic 2024~~~\ntam\n\n" "~~~HMG 2023~~~\ntam\n\n" "~~~No Logic 2022~~~\nChexhuman\n\n" From 96e48b2892984efc93c357e9e65fdf554235a929 Mon Sep 17 00:00:00 2001 From: aerinon Date: Tue, 11 Nov 2025 15:32:00 -0700 Subject: [PATCH 07/20] fix: pot drops at sprite limit fix: music silence DR fix: kondongo AI in vanilla rooms --- Rom.py | 4 ++-- data/base2current.bps | Bin 117959 -> 118114 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Rom.py b/Rom.py index 71f65ef2..36c989fc 100644 --- a/Rom.py +++ b/Rom.py @@ -42,7 +42,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '54eaa40cc69c54b9d790b9c4ea107f4d' +RANDOMIZERBASEHASH = 'd55c23b3e6d92eeff28ca3724573f4ff' class JsonRom(object): @@ -469,7 +469,7 @@ def patch_rom(world, rom, player, team, is_mystery=False): location.item.map and world.mapshuffle[player] == 'none') or ( location.item.compass and world.compassshuffle[player] == 'none')): itemid = handle_native_dungeon(location, itemid) - + rom.write_byte(location.address, itemid) else: # crystals diff --git a/data/base2current.bps b/data/base2current.bps index d0cdd7d679a902d0d1b30607297ef54cbdf0ebed..ac39aaeff42839a87f46b102710c935e5b0ab167 100644 GIT binary patch delta 2051 zcmWkuc~nzp7XQ91CXf(<>^r=I3JL~P6tF@BE3~+Q3sSAxqC|qYzzirV-wTU8BpUM? zJ|Re=C=!r?`bL6A8VLmj<%kYCj?-GV9+g9f%uxrlY9_sZ-1EEJx%b@ddL8d+J+Jde z2$#`jI0rsp#-Rt~WSA}_)6>`rxQ3zF2cYA@at#sG-O}kY#c;WM*szQFD?b=cCo2$# zUSOc=M)hX|x=uQ?k=8oIvw(tr;4ld{Gb4`qfBGhfs+`4x#C~H7;uDVDEnCON#t8b3 ze-JTT)pda^6OyD-Ri{K80$ouSlT`cjGua9f@kz>wqFn2PF+1xsA{q($7UH&@@+KNS-VN6^Dj{l7=`x%c$%?&+)U>#6&Cd508r z(hFnIDU0OHCU3(Czt)+hxSp0w(l4(pi{6<3{*TQ3_oSl$DYS)(fBZ#J8YSp~8`$xxZ{X5Uje-ss_osFbG?oF344^a3>{lWFIaKKsEUk$H*a zJtIz5$06~Qu6V8H6+V#*{X%$~t4{-^igya}WDlF70(2+ZemP^2FmrpUb``HSzNDIB z@SR-f?Ys0_9aEa4A>ECNI!lnDx}#|IM12u7XJh$w@K*B{#_+c1D@D3YmO2N{{R(>x>GL?}`-m>1*^#k6=UG%^LEw(V+*9 z!WCy0dn!T^v7@TXD(=xc`JB=_4RTamne5G)UirDxBcgNqL2oO6aHf?rSY!qAwuo)L z!(1|EgiE|1Xq5K^i3TS+q5M^z&O5dqJDFiRJ8Gj9e`|(atT+PuT!a2G(l8d%B!I1$h>!KcC|1~d+}jIr_|}wn&EIj3XeKhpv&OSp zWt<~)Qs^)anLVsb1c|_MOal;*0!h;btgyfe7O?<3^uZM@X*ka8gT!>Vq+6DN6iUrK zSV=Bw`U+{k#x;E~Au>9pzHt@QSkj=zIR@?aNQ_p-}=z@#f5gAy&F#TnRpB+}% zY;>uv0-&blIQcqU=^3*<0`>UYifxZ#C%kR^Nq$jPQPu4NY`6|10);8=sQ2yLJ=UqI zh7WfmKS5w`{+KDS?BV`nO`%!%?R6OKSUBr8b)78bOrb5eBF zA@B#Y<7#VuijI!Y>84D;#H`2nZouF;m&LbrGyHDX`=mBDyQDVOJ4q`rtn4UAqm(v4 z0;4~LS8k%zqLhm!*LV>!yKNRBOA_}2y$VYPVFGJu2;MsggM5nZdUezGN8-Amxth?T(8LK$a2i&d-=Hde5;D~-Q4jjP@`-1+2bLV>Z+!7F)QprSbr1FhWqiYn{Z)DNM1KtO7BK(B@N9dn^tX{iMnjyr;FXu@emVEEhj(RlqXjk4}M-<0f2dnOoVXmb`fd}&MB+^#wyr@zq$nr O`NclpSC4=5arpn6A7;1! delta 1826 zcmWktdr*^i7X95X34~V&N&v$n5I_axr7kGo07YI?U!dZP6)ITKs6m#lQbd1WkVlX} z$k*_zAS5j-8d*jCMuMAS;6p(k7Pm!b>(;8B)w+%rI@V{^Z1$fs=iYPg%(-*s{@m&~ za@_I!6@Z0|6&8Y(eF|Q{Fa1NqXB>Dc;IV4n=Rk>TST{il58Bzo!XV(Qn00FAf>Q!j z-p2gu^a|YBN6!2HuWk_4xjSp*<>u4f{zVNM=9zyWoMA)(GU`bk6BQ5v43i%)EzqrM zQWr4UvNCGZa&|`RhKTJieCZ#9c<~ z{@cc%#qtxicyP+dO&POq8SmdRDsLN0ZW|RnDfs*-%z%Q6{yJ}t>87y7ol=d6#BZ2j zOWK@y``-RBci&su*#)cG%2eNfrfP{ze&~xG8QS70a5(tX>cq5KeBlDqYYDUCeM`6? zE`i>X#=3vw4v@jh`h5Tj*riv-J$+XuS}!I~>Gl`tPfCy+1)&vaHR8&O^h^>P@V%aL zmS)|(BAC@X8|Sk9w-!~xaq~)Jb36lBN&U8;NMNC##@CA$iFBq>h+gUO~aB`*~6X80$B zJcS8s?0D9$c^z`Z&lJQ%0e&H?&@W#hjn=UpI~L#RT#(e%+NLDmQ?G`fYC;-8s!8mQ3*cyVu|kP+BCpY3npL!LHdfh_(i=5iL8kce2HI$@ z?T0Dw>0ItpCBgkhH)*@kZIrJS6c_)VJ*em*S}RC+0_q2H+6pk2vu!jM(ewDbKXudNPs_Caz?9 z0DK^n2nS(@=uqyMuCAwEjXt1Ll|oW62oVmMZm!tiLe34s=MYQ6IEbMNH;_CINVqif zO;;hmRzJPz>6WKk&J^=&naYqGWLx+RO|sns*QiGrrJ(3e58^)r)l}XR^0y&aMOB26 z=R+W$wfdt8E+A8_6CA3cmv(-P+azS(RY;2T%4qFa1A1;H=q<43$6;;Dx;?t%Li<5N zgt)bPbX_ikLS*=O^!Q8w>s@ifUU5@J#j*wF2SE~stDM)rwLl2Si0Hf)vh zu_1t*9|4JU>t7|9mbJ#^JnqT0(`uWIIbx_rxD&{|5m@bAQWSyv{cQ(rKP{V{V-vm- z9;iD|HyJ@zT!#o*dWHlKzIahG^ZNCPci%;R0Avs2iA7d*r@XN2fuheghj^C#6l zD3MJGArsf33c|_SQSf&9?9)EA1zA`zDH(;J_>U7N4F$fFtX9Qlj5M7a)5+yA$fAk@2!9+R<-QKy zSe=h-JbKf5FU-vguh%Ur9i^W$;a1HMszL@gvVI&YSLZ~`!d#=p_i~f?)EO2B_UGsg`WJePtcCW9c$Vy1{p8UElnEDG%^fjTOUVBK D&VK2} From b64b7d9d6d3b979670f56bc91e164f6bc810e269 Mon Sep 17 00:00:00 2001 From: aerinon Date: Tue, 11 Nov 2025 15:33:32 -0700 Subject: [PATCH 08/20] fix: ban swamola enemies --- source/enemizer/SpriteSheets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/enemizer/SpriteSheets.py b/source/enemizer/SpriteSheets.py index 001bc79e..abc2387c 100644 --- a/source/enemizer/SpriteSheets.py +++ b/source/enemizer/SpriteSheets.py @@ -363,7 +363,7 @@ def init_sprite_requirements(): SpriteRequirement(EnemySprite.TrinexxFireHead).exalt().sub_group(0, 0x40).sub_group(3, 0x3f), SpriteRequirement(EnemySprite.TrinexxIceHead).exalt().sub_group(0, 0x40).sub_group(3, 0x3f), SpriteRequirement(EnemySprite.Blind).exalt().sub_group(1, 0x2c).sub_group(2, 0x3b), - SpriteRequirement(EnemySprite.Swamola).no_drop().sub_group(3, 0x19), + SpriteRequirement(EnemySprite.Swamola).skip().no_drop().sub_group(3, 0x19), SpriteRequirement(EnemySprite.Lynel).sub_group(3, 0x14), SpriteRequirement(EnemySprite.BunnyBeam).no_drop().ow_skip(), SpriteRequirement(EnemySprite.FloppingFish).uw_skip().immune(), From 58daf424f346bc4367ccd43dbd744511c77d1eb8 Mon Sep 17 00:00:00 2001 From: aerinon Date: Tue, 11 Nov 2025 16:38:49 -0700 Subject: [PATCH 09/20] fix: enemy bans doc: version information --- CHANGELOG.md | 420 -------------------------------- Main.py | 2 +- PastReleaseNotes.md | 6 +- RELEASENOTES.md | 15 +- source/enemizer/enemy_deny.yaml | 12 +- 5 files changed, 25 insertions(+), 430 deletions(-) delete mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 6d9c32af..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,420 +0,0 @@ -(Note: these will be moving to PastReleaseNotes.md) - -# Feature Notes - -1.4.3: File Select/End Game screen: Mirror Scroll and Pseudoboots added (Thanks Hiimcody!) - - -# Patch Notes - -Changelog archive - -* 1.4.8.1 - - Fixed broken doors generation - - Fixed bomb/arrow upgrade ignoring custom pricing - - Extended `money_balance` to apply to price balancing for non-custom shops. -* 1.4.8 - - New option: Mirror Scroll - to add the item to the starting inventory in non-doors modes (Thanks Telethar!) - - Customizer: Ability to customize shop prices and control money balancing. `money_balance` is a percentage betwen 0 and 100 that attempts to ensure you have that much percentage of money available for purchases. (100 is default, 0 essentially ignores money considerations) - - Fixed a key logic bug with decoupled doors when a big key door leads to a small key door (the small key door was missing appropriate logic) - - Fixed an ER bug where Bonk Fairy could be used for a mandatory connector in standard mode (boots could allow escape to be skipped) - - Fixed an issue with flute activation in rain mode. (thanks Codemann!) - - Fixed an issue with enemies in TR Dark Ride room not requiring Somaria. (Refactored the room for decoupled logic better) - - More HMG fixes by Muffins - - Fixed an issue with multi-player HMG - - Fixed an issue limiting number of items specified in the item pool on the GUI - - Minor documentation fixes (thanks Codemann!) -* 1.4.7.2 - - Fixed an issue with shuffle_ganon/fix_gtower_exit causing a generation failure - - More HMG fixes by Muffins -* 1.4.7.1 - - Fixed an issue with the repaired "beemizer" setting not being backwards compatible -* 1.4.7 - - Fixed generation error with Big Key in starting inventory (thanks Cody!) - - HMG/NL logic fixes by Muffins - - Enemizer: Disabled Walking Zora in the UW due to crash with Swamola (they ignore a lot of collison anyway) - - Enemizer: Fixed an issue with enemizer bush sprites - - Enemizer: Banned new Mimics from being the randomized bush sprite due to crash - - "Beatable" or "accessibility: none" can now use randomized trap doors to seal off entire parts of dungeons (was intended, bug prevented the logic skip) - - Logic error with enemizer and standard should use new enemy logic rules - - Fixed a bug with the inconsistent treatment of the beemizer setting - - Fixed an issue with returning Blacksmith in Simple shuffle (when blacksmith is at Link's House) - - Fixed an issue with dark sanctuary spawn at tavern north door (thanks Codemann!) - - Various enemy bans for the last few months -* 1.4.6 - - Restores original Sanc & Quit behavior, if Aga1 is not dead, then no quick pyramid warp - - Fixed problem with Lite/Lean shuffling some fairy caves unnecessarily - - The 300 Rupees item is now marked as priority, so it will not be used as GT junk fill (this matches a change in the VT randomizer) - - Murahdahla is now logically accessible in inverted mode as a bunny. May affect some beatable-only TFH seeds by allowing Moon Pearl to be inaccessible. - - Fixed an issue around PreferredLocationGroups in customizer which would not work with pre-activated Ocraina or priority items. - - Minor fix on triforce text - - Enemy bans for poor placements -* 1.4.5 - - Logic: Added appropriate enemy logic to GT Mimics 1 and 2 rooms - - Logic: Added appropriate enemy logic to Mire 2 room. Note this does change the default logical strats, due to how enemy kill logic works. - - Ice Rod + 1 Bomb is now out of logic - - Fire Rod + 1 Bomb is now out of logic - - Fire Rod + 1 magic extension is still in logic - - Byrna + 1 magic extension is newly in logic - - (One magic extension is either half magic or a bottle with the ability to purchase a blue or green potion) In general, making up for a lack of magic extension with a few bombs is something that could be added to the logic. Using the ice rod to freeze an enemy and then using that enemy to deal blunt damage and then using bombs to clear the frozen enemy is another strategy that could be added to the logic someday. If these are important to you, let me know. - - Generation: Fixed an issue with dungeonsfull shuffle -* 1.4.4 - - Fixed a crash near the end of the credits when total collection rate was over 1000 -* 1.4.3 - * Key Logic Algorithm: Renamed "Default" to "Dangerous" to indicate the potential soft-lock issues - * Hera Basement Cage: Fix for small key counting multiple times (again) - * Generation: Fixed several generation problems with ER and intensity 3 - * Customizer: Generation bug when attempting to place small keys - * Hints: Updated pedestal/tablet text to be more clear - * Enemizer: Various enemy bans -* 1.4.2 - * New ER Options: - * [Skull Woods shuffle options](#skull-woods-shuffle) - * [New option](#linked-drops-override) to override linked drop down behavior - * Customizer: You can now start with a "RandomWeapon" in the start inventory section - * Customizer: You may now start with "Big Magic" or "Small Magic" items - * Customizer: Suppress warning for missing items if they are in start inventory - * MultiClient: change default port to 23074 for newer SNI versions - * Generation: Fixed typo causing ER gen failure with Bomb Shop at Graveyard Ledge -* 1.4.1.12u - * New Entrance Shuffle Algorithm no longer experimental - * Back of Tavern Shuffle now on by default - * Enemizer: Wallmasters banned from tiles where spiral staircases are. (Softlock issue) - * Packaged build of unstable now available - * Customizer: New PreferredLocationGroup for putting a set of items in a set of locations. See customizer docs. - * Customizer: Fixed an issue with starting with `Ocarina` and flute_mode is active - * Spoiler: Some reformatting. Crystal req. for GT/Ganon moved to requirements section so randomized requirements don't show up in the meta section - * Algorithm: Major_Only. Supports up to 16 extra locations (the visible heart pieces) for when major item count exceeds major location count. Examples: Triforce Hunt, Trinity (Triforce on Ped), Bombbag shuffle - * Fix: HC Big Key drop doesn't count on Basic Doors - * Fix: Small Key for this dungeon in Hera Basement doesn't count twice for the key counter - * Fix: All cross-dungeon modes with restrict boss items should require map/compass for the boss - * Fixed a small bug with traversal algorithm - * Enemizer: Enemy bans+ -* 1.4.1.11u - * New Feature: Several spoiler levels added: None, Settings-only, Semi, Full, Debug - * Semi includes only entrances, prizes, and medallions (potential new spoiler mode being worked on, definition may change) - * Entrance: Lite/Lean support enemy drop shuffle - * Standard: Re-added tutorial guard near large rock - * Enemizer - * Fixed the overwriting of bonk fairies - * Fixed broken graphics on hyrule castle - * Enemy bans - * Customizer: Fixed bug with customizing prize packs -* 1.4.1.10u - * Vanilla key logic: Fix for vanilla layout Misery Mire which allows more complex key logic. Locations blocked by crystal switch access are only locked by 2 keys thanks to that being the minimum in Mire to reach one of two crystal switches. - * Autotracking: Fix for chest turn counter with chest containing multiworld items (Thanks Hiimcody) - * Enemizer: Enemy bans - * Rom: Code prettification and fixing byte designations by Codemann - * Support added for BPS patches via jsonout setting (Thanks Veetorp!) -* 1.4.1.9u - * Enemy Drop Underworld: Changed enemy drop indicator to not require compass - * Experimental: Moved dark world bunny spawns out of experimental. (It is now always on) - * Fix: Red/Blue pendants were swapped for autotracking. (Thanks Muffins!) - * Fix: Red square sometimes wasn't blinking - * Updated tournament winners - * Enemizer: Enemy bans -* 1.4.1.8u - * HUD: New dungeon indicators based on common abbreviations - * OWG+HMG: EG is allowed to be armed - * Drop Shuffle: Fixed an issue with minor drops counting for the wrong dungeon - * Enemizer: Trinexx ice breath should be properly disabled if Trinexx is located outside of Turtle Rock - * Enemizer: Enemy bans -* 1.4.1.7u - * Some bugs around Triforce Pieces smoothed out - * Enemizer: No exception for mimics/eyegores in vanilla rooms if enemy logic is turned to off - * Enemizer: Various enemy bans -* 1.4.1.6u - * Difficulty: Fixed some issues around item caps not being respected - * Enemezier: Tutorial guards remove from South Kakariko - * Map: Pendant colors fixed - * Minor rom code cleanup - * Enemizer: Hovers added to problematic pool near pits. Some other bans -* 1.4.1.5u - * Major Fix: Problem with Ganon's Room sprites - * HMG: Remove extra Swamp Smalls in the pool due to pottery settings - * Enemizer: Couple enemy bans -* 1.4.1.4u - * Logic: Fixed logic bugs surrounding dynammic doors missing logic from big keys and other door types - * Inverted: Castle warp should not appear after defeating Aga 1 - * Enemzier: Fixed a crash with cached sprites Zora/Swamola -* 1.4.1.3v - * Enemizer: Raven/Murderdactyls using the correct damage table - * Enemzier: Boss drops only center when boss shuffle is on -* 1.4.1.2v - * Expert/Hard Item Pool: Capacity fairy no longer gives out free crystal - * Vanilla door + Universal Keys: Generation fixed - * Boss Shuffle: Generation fixed (thanks Codemann for easy solution) - * Vanilla ER: No need for ability to check prizes on keysanity menu - * Swapped ER: Possible generation issue fixed (thanks Codemann) - * Enemizer: Roller ban - * Performance: Faster text boxes. Thanks Kan! -* 1.4.1.1v - * Logic: Moon pearl logic respects blocked doors -* 1.4.1.0v - * World Model Refactor: The overworld has been split up by screen, brings OR and DR a bit closer together in the model sense. A few OWG clips have been rewritten to fit into this new logic better. - * Logic: New logic for some bosses on ice - * Helmasaur on Ice: Bombs for mask, sword or arrows for 2nd phase - * Blind on Ice: Beam sword, Somaria, or Byrna plus magic extension for damage. Red shield or Byrna for protection. - * Kholdstare on Ice: Three options (after cracking the shell) - * Beam sword - * Fire Rod with 1.5 magic extensions - * Fire Rod & Bombos & any Sword & 1 Magic Extension - * Vitreous on Ice: Arrows and Bombs or a Beam Sword - * Trinexx on Ice: Boots always required for dodging. Damage options: - * Gold sword - * Tempered sword with magic extension - * Hammer or Master sword with 3 magic extensions (Rod spam for elemental heads, non-ideal weapon for last phase) - * Trinexx on Ice forbidden in doors seeds until we can model some health requirements. Low health Trinexx still isn't realistically feasible (bascially playing OHKO) - * Logic: Added silver arrows as Arrghus damage option when item functionality is not set to hard or expert - * Logic: Byrna not in logic for laser bridge when item functionality is set to hard or expert - * Enemizer Damage Rework: - * Shuffled: Actually shuffles the damage groups in the table instead of picking random numbers and reducing for mails from there. Enemies will still be assigned to a damage group randomly. - * There will always be at least one group which does no damage. The thief will always be in that group. Ganon always has his own group. - * Glitched modes: Aga 1 should be vulnerable in rain state for glitched modes - * Generation: Trinexx and Lanmolas room allowed as lobbies in intensity 3 (works with enemizer now) - * Enemy AI: Terrorpin AI code removed. May help with unusual enemy behavior? -* 1.4.0.1v - * Key logic: Vanilla key logic fixes. Statically set some HC logic and PoD front door - * Generation: Fix a broken tile pattern - * Inverted: Castle warp should not appear after defeating Aga 1 - * Murahdahla: Should not disappear after Aga 1. May fix other subtle issues. - * Shopsanity: Buying multiple of an item in the potion shop should no longer increase item count. -* 1.4.0.0v - * Initial support for HMG (Thanks Muffins!) - * Generation: fix for bunny walk logic taking up too much memory - * Key Logic: Partial is now the new default - * Enemizer: enemy bans -* 1.3.0.9v - * ER: New Swapped ER mode borrowed from OWR - * ER: fixed a generation error where TR chooses all "must-exits" - * Ganonhunt: playthrough no longer collects crystals - * Vanilla Fill: Uncle weapon is always a sword, medallions for Mire/TR will be vanilla - * Customizer: support shufflebosses/shuffleenemies as well as boss_shuffle/enemy_shuffle - * Enemizer: enemy bans -* 1.3.0.8v - * Enemizer: Red Mimics correctly banned from challenge rooms in appropriate logic setting - * No Logic Standard ER: Rain doors aren't blocked if no logic is enabled. - * Trinexx: attempt to fix early start - * MW Progression Balancing: Change to be percentage based instead of raw count. (80% threshold) - * Take anys: Good Bee cave chosen as take any should no longer prevent generation - * Money balancing: Fixed generation issue - * Enemizer: various enemy bans -* 1.3.0.7v - * Fix for Mimic Cave enemy drops - * Fix for Spectacle Rock Cave enemy drops (the mini-moldorms) - * Fix for multiworld lamps with incorrect graphics - * No longer shuffles fairy bonks (from trees) as part of Enemizer -* 1.3.0.6v - * Flute can't be activated in rain state (except glitched modes) (Thanks codemann!) - * Enemizer - * Arrghus at Lanmo 2 no longer prevents pot pickups - * Trinexx at Lanmo 2 requires the Cape go backwards to face him - * Lift-able Blocks require a sprite slot (should help reduce problems) - * Fixed logic issues: - * Self-locking key not allowed in Sanctuary in standard (typo fixed) - * More advanced bunny-walking logic in dungeons (multiple paths considered) - * ER: Minor fix for Link's House on DM in Insanity (escape cave should not be re-used) - * MSU: GTBK song fix for DR (Thanks codemann!) - * District Algorithm: Fails if no available location outside chosen districts - * Various enemy bans - * More Gibos near kiki and Old Man - * Bumper/AntiFairy obstacles - * Damaging roller - * Statue + Pots don't mix - * Statues on Skull Big Key Chest tile - * Toppo in challenge rooms - * Misc others -* 1.3.0.5v - * Hud/Map Counter: Collecting a keys for this dungeon of a bonk torch no longer increments the counter twice and immediately updates the hud. - * Enemizer: Hera basement item counting twice fixed by banning wallmasters on the tile. - * Enemizer: Statues banned offscreen for pull switches - * Enemizer: Several sprite producing enemies have been limited on crowded tiles. Offenders: Hinox, Sluggula, Bomb Guard, Beamos, Gibo, Wall Cannons, Probe using Guards. Others do not spam as many projectiles. - * Enemizer: More enemy bans (mostly Wizzrobes near walls where they won't spawn, couple missed firebar spots) -* 1.3.0.4v - * Enemizer: The bunny beam near Lanmo 2 and the 4 fairies near Ice Armos are not shuffled anymore. This is due to how bosses shuffle works and since it cannot be guaranteed to work within the current system, they are vanilla. (Vitreous still overwrites the fairies and Arrghus only lets two spawn, etc.) - * Dropshuffle: Pokey 1 has been fixed to drop his item - * Mystery/Customizer: true/false and on/off in yaml files should behave the same. - * More enemy bans as have been reported -* 1.3.0.3v - * Faeries now part of the enemy shuffle pool. Take note, this will increase enemy drop locations to include fairy pools both in dungeons and in caves. - * Enemy drop indicator (blue square) now works in caves based on entrance used - * Fixes: - * Collection rate counter is properly hidden in mystery seeds - * Sprite limit lowered where possible to allow for lifting of pots - * Hovers in Swamp Waterway properly do not drop items anymore - * Lots more bans (thanks to jsd in particular but also thanks to all the reports) - * Minor issue with customizer/mystery files not allowing "true" for booleans -* 1.3.0.2v - * Fix for multiworld received keys not counting correctly - * Fix for multiworld lamps incorrect graphics - * Fix for collection rate decreasing on item "pickup" - * Fix for pendants as prizes counting as items - * Fix for castle barrier gfx in rain state - * Enemizer fixes and bans: - * Fixed a generation issue where ChainChomp placement would cause a failure. (Invincible enemies banned in Sprial Cave for early game traversal for now) - * Skull Pot Prison should not be blocked by "impassable" enemies - * Bumpers banned in Ice Hookshot room - * Fixed issue in GT Spike Crystal room - * Fixed blockage issues in TT Ambush and Compass rooms - * Forbid Bumper in Fairy Ascension cave; needed to clip into wall weirdly to pass. - * Enemy Drop bans - * Forbid Stals in many places where they cannot be woken up. Behind rails and on top of blocks, for example. - * A couple minor wizzrobes bans because of despawns. - * Enemies over pits and on conveyors near pits have been issued standard bans for falling enemies. Mimics join the ranks here as they don't work well on pits or on conveyors. - * Mimics banned where conveyors touch walls and could clip out unintentionally -* 1.3.0.1v - * Fixed bugs with item duping and disappearing drops - * Fixed multiworld crash - * Fixed assured sword missing when using start inventory (via GUI/CLI) - * Forbid extra statues in Swamp Push Statue room - * Forbid bumpers on OW water - * Forbid Stal on pits - * Text fix on sprite author (thanks Synack) -* 1.2.0.23u - * Generation: fix for bunny walk logic taking up too much memory - * Key Logic: Partial is now the new default -* 1.2.0.22u - * Flute can't be activated in rain state (except glitched modes) (Thanks codemann!) - * ER: Minor fix for Link's House on DM in Insanity (escape cave should not be re-used) - * Logic issues: - * Self-locking key not allowed in Sanctuary in standard (typo fixed) - * More advanced bunny-walking logic in dungeons (multiple paths considred) - * MSU: GTBK song fix for DR (Thanks codemann!) -* 1.2.0.21u - * Fix that should force items needed for leaving Zelda's cell to before the throne room, so S&Q isn't mandatory - * Small fix for Tavern Shuffle (thanks Catobat) - * Several small generation fixes -* 1.2.0.20u - * New generation feature that allows Spiral Stair to link to themselves (thank Catobat) - * Added logic for trap doors that could be opened using existing room triggers - * Fixed a problem with inverted generation and the experimental flag - * Added a notes field for user added notes either via CLI or Customizer (thanks Hiimcody and Codemann) - * Fixed a typo for a specific pot hint - * Fix for Hera Boss music (thanks Codemann) -* 1.1.6 (from Stable) - * Minor issue with dungeon counter hud interfering with timer -* 1.2.0.19u - * Added min/max for triforce pool, goal, and difference for CLI and Customizer. (Thanks Catobat) - * Fixed a bug with dungeon generation - * Multiworld: Fixed /missing command to not list all the pots - * Changed the "Ganonhunt" goal to use open pyramid on the Auto setting - * Customizer: Fixed the example yaml for shopsanity -* 1.2.0.18u - * Fixed an issue with pyramid hole being in logic when it is not opened. - * Crystal cutscene at GT use new symmetrical layouts (thanks Codemann) - * Fix for Hera Boss music (thanks Codemann) - * Fixed an issue where certain vanilla door types would not allow other types to be placed. - * Customizer: fixed an issue where last ditch placements would move customized items. Those are now locked and the generation will fail instead if no alternatives are found. - * Customizer: fixed an issue with assured sword and start_inventory - * Customizer: warns when trying to specifically place an item that's not in the item pool - * Fixed "accessibility: none" displaying a spoiling message - * Fixed warning message about custom item pool when it is fine -* 1.2.0.17u - * Fixed logic bug that allowed Pearl to be behind Graveyard Cave or King's Tomb entrances with only Mirror and West Dark World access (cross world shuffles only) - * Removed backup locations for Dungeon Only and Major Only algorithms. If item cannot be placed in the appropriate location, the seed will fail to generate instead - * Fix for Non-ER Inverted Experimental (Aga and GT weren't logically swapped) - * Fix for customizer setting crystals to 0 for either GT/Ganon -* 1.2.0.16u - * Fix for partial key logic on vanilla Mire - * Fix for Kholdstare Shell collision when at Lanmo 2 - * Fix for Mire Attic Hint door (direction was swapped) - * Dungeon at Chest Game displays correctly on OW map option -* 1.2.0.15u - * GUI reorganization - * Logic fix for pots in GT conveyor cross - * Auto option for pyramid open (trinity or ER + crystals goal) - * World model refactor (combining inverted and normal world models) - * Partitioned fix for lamp logic and links house - * Fix starting flute logic - * Reduced universal keys in pool slightly for non-vanilla dungeons - * Fake world fix finally - * Some extra restrictions on links house placement for lite/lean - * Collection_rate works in customizer files -* 1.2.0.14u - * Small fix for key logic validation (got rid of a false negative) - * Customized doors in ice cross work properly now -* 1.2.0.13u - * Allow green/blue potion refills to be customized - * OW Map showing dungeon entrance at Snitch Lady (West) fixed (instead of @ HC Courtyard) - * Standing item data is cleared on transition to overworld (enemy drops won't bleed to overworld sprites) - * Escape assist won't give you a free quiver in retro bow mode - * Fixed an issue where a door would be opened magically (due to original pairing) - * MultiServer can now disable forfeits if desired -* 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) - * 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 algorithm -* 1.2.0.10u - * Fixed overrun issues with edge transitions - * Better support for customized start_inventory with dungeon items - * Colorized pots now available with lottery. Default is on. - * Dungeon_only support pottery - * Fix AllowAccidentalGlitches flag in OWG - * Potential fix for mirror portal and entering cave on same frame - * A few other minor issues, generation and graphical -* 1.2.0.9-u - * Disallowed standard exits (due to ER) are now graphically half blocked instead of missing - * Graphical issues with Sanctuary and Swamp Hub lobbies are fixed - * Fixes an issue surrounding door state and decoupled doors leading to blocked doors - * Customizer improvements: - * Better logic around customized lobbies - * Better logic around customized door types - * Fix to key doors that was causing extra key doors - * Generation improvement around crystal switches - * Fix bug in dungeon_only that wasn't using pot key locations (known issue still exists in pottery modes) - * Fixes for multiworld: - * Fixes an issue when keys are found in own dungeon for another player when using the bizhawk plugin. - * Fixes an issue with absorbables for another player also being received by the player picking it up. -* 1.2.0.8-u - * New Features: trap_door_mode and key_logic_algorithm - * Change S&Q in door shuffle + standard during escape to spawn as Uncle - * Fix for vanilla doors + certain ER modes - * Fix for unintentional decoupled door in standard - * Fix a problem with BK doors being one-sided - * Change to how wilds keys are placed in standard, better randomization - * Removed a Triforce text - * Fix for Desert Tiles 1 key door -* 1.2.0.7-u - * Fix for some misery mire key logic - * Minor standard generation fix - * Fix for inactive flute start - * Settingsfile for multiworld generation support - * Fix for duped HC/AT Maps/Compasses -* 1.2.0.6-u - * Fix for light cone in Escape when entering from Dark World post-zelda - * Fix for light cone in Escape when lighting a torch with fire rod -* 1.2.0.5.u - * Logic fix for Sanctuary mirror (it wasn't resetting the crystal state) - * Minor bugfixes for customizer -* 1.2.0.4-u - * Starting inventory fixes if item not present in the item pool. - * Support for Assured sword setting and OWG Boots when using a custom item pool. (Customizer or GUI) - * Logic fix for the skull woods star tile that lets you into the X pot room. Now accounts for small key or big key door there blocking the way from the star tile. A trap door is not allowed there. - * Standard logic improvement that requires a path from Zelda to the start so that you cannot get softlocked by rescuing Zelda. Standard mirror scroll change may need to be reverted if impossible seed are still generated. -* 1.2.0.3-u - * Starting inventory taken into account with default item pool. (Custom pools must do this themselves) - * Fast ROM update - * Fix for restricted boss item counting maps & compasses as vital - * Bug fix for vanilla ER + inverted + experimental -* 1.2.0.2-u - * Fixed a bug with certain trap doors missing - * Added a hint reference for district hints -* 1.2.0.1-u - * Added new ganonhunt and completionist goals - * Fixed the issue when defeating Agahnim and standing in the doorway can cause door state to linger. - * Fix for Inverted Lean/Lite ER - * Fix for vanilla Doors + Standard + ER - * Added a limit per dungeon on small key doors to ensure reasonable generation - * Fixed many small bugs - -# Known Issues - -* Decoupled doors can lead to situations where you aren't logically supposed to go back through a door without a big key or small key, but you can if you press the correct direction back through the door first. There are some transitions where you may get stuck without a bomb. These problems are planned to be fixed. -* Logic getting to Skull X room may be wrong if a trap door, big key door, or bombable wall is shuffled there. A bomb jump to get to those pot may be required if you don't have boots to bonk across. \ No newline at end of file diff --git a/Main.py b/Main.py index 225a74d4..3c4d8c9b 100644 --- a/Main.py +++ b/Main.py @@ -38,7 +38,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.4.10' +version_number = '1.4.11' version_branch = '-u' __version__ = f'{version_number}{version_branch}' diff --git a/PastReleaseNotes.md b/PastReleaseNotes.md index 68b6b381..fa8d1286 100644 --- a/PastReleaseNotes.md +++ b/PastReleaseNotes.md @@ -5,7 +5,11 @@ # Patch Notes Changelog archive - +* 1.4.10 + * Logic: Changed the rule surrounding the Bumper Cave Ledge Drop (the murderdactyl) to only require Pearl AND (Cape OR Byrna OR a Sword) in OHKO mode for now. This is a temporary solution until a better way to prevent needing to use a framerule to get past the bird is invented. + * Helmacopter Fix. + * Fixed a bug in shopsanity that caused the generation to fail with certain prices. + * Enemizer: fairies were invalid on the overworld (unless a bonk occurred nearby), so they will no longer be randomized there. * 1.4.9 * Attempted fix for Moth conveyor room timing. Thanks for many people's input. Unsure if Helmacopter is still acceptable. * Mirror scroll will show up on file start screen if enabled (thanks Clearmouse!) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ec57a296..29af9f02 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,7 +1,12 @@ # Patch Notes -* 1.4.10 - * Logic: Changed the rule surrounding the Bumper Cave Ledge Drop (the murderdactyl) to only require Pearl AND (Cape OR Byrna OR a Sword) in OHKO mode for now. This is a temporary solution until a better way to prevent needing to use a framerule to get past the bird is invented. - * Helmacopter Fix. - * Fixed a bug in shopsanity that caused the generation to fail with certain prices. - * Enemizer: fairies were invalid on the overworld (unless a bonk occurred nearby), so they will no longer be randomized there. +* 1.4.11 + * Rom fixes (all thanks to Codemann, I believe) + * Pot bug when at sprite limit + * Kodongo AI vanilla in vanilla rooms + * Issue with music silencing across certain room transitions + * Gltiched: Some HMG logic fixed. Thanks Muffins! (Sorry it took me forever to get this PR in) + * Text: Updated tourney winners. Thanks clearmouse! + * Enemizer: Banned Swamola enemy everywhere as they may be causing crashes + * Enemizer: Enemy bans from Q2 and Q3. Thank you for all the reports. + diff --git a/source/enemizer/enemy_deny.yaml b/source/enemizer/enemy_deny.yaml index ea92264d..1e89ec3e 100644 --- a/source/enemizer/enemy_deny.yaml +++ b/source/enemizer/enemy_deny.yaml @@ -84,7 +84,7 @@ UwGeneralDeny: - [ 0x0039, 4, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "FirebarCW", "FirebarCCW" ] ] #"Skull Woods - Play Pen - Spike Trap 1" - [0x0039, 5, ["RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "Bumper", "AntiFairyCircle"]] #"Skull Woods - Play Pen - Hardhat Beetle" - [ 0x0039, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "FirebarCW", "FirebarCCW" ] ] #"Skull Woods - Play Pen - Spike Trap 2" - - [0x003a, 1, ["RollerVerticalUp"]] + - [0x003a, 1, ["RollerVerticalUp", "RollerVerticalDown"]] - [ 0x003b, 1, [ "Bumper", "AntiFairyCircle" ]] - [ 0x003b, 4, ["RollerVerticalUp", "RollerVerticalDown"]] - [ 0x003c, 0, ["BigSpike"]] @@ -339,7 +339,11 @@ UwGeneralDeny: - [ 0x00c2, 5, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots - [ 0x00c5, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Turtle Rock - Catwalk - Mini Helmasaur" - [ 0x00c5, 7, [ "Statue" ] ] #"Turtle Rock - Catwalk - Laser Eye (Left) 4" + - [0x00c6, 2, ["Bumper", "AntiFairyCircle"]] + - [0x00c6, 3, ["Bumper", "AntiFairyCircle"]] + - [0x00c6, 4, ["Bumper", "AntiFairyCircle"]] - [0x00c6, 5, ["Bumper", "AntiFairyCircle"]] + - [0x00c6, 6, ["Bumper", "AntiFairyCircle"]] - [ 0x00cb, 0, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots - [ 0x00cb, 3, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Grand Room NW - Zol 1" - [ 0x00cb, 5, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Grand Room NW - Zol 2" @@ -397,6 +401,7 @@ UwGeneralDeny: - [ 0x00e4, 2, [ "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Old Man Home - Keese 3" - [ 0x00e5, 4, [ "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Old Man Home Circle - Keese 5" - [ 0x00e5, 5, [ "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Old Man Home Circle - Keese 6" + - [0x00e6, 0, ["Statue"]] # Death Mountain Descent Cave Left - Keese 1 - Statue blocking pot access - [ 0x00e7, 0, [ "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Death Mountain Descent Cave Right - Keese 1" - [ 0x00e7, 1, [ "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Death Mountain Descent Cave Right - Keese 2" - [ 0x00e7, 2, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalRight" ] ] #"Death Mountain Descent Cave Right - Keese 3" @@ -441,7 +446,7 @@ OwGeneralDeny: - [0x05, 10, ["Bumper", "AntiFairyCircle"]] # Blocks path - [0x05, 11, ["Bumper", "AntiFairyCircle"]] # Blocks path to portal - [0x07, 3, ["Bumper", "AntiFairyCircle", "RollerHorizontalRight", "RollerHorizontalLeft"]] # Blocks path to ladder - - [0x07, 4, ["RollerHorizontalLeft"]] # Blocks path to ladder + - [0x07, 4, ["Bumper", "AntiFairyCircle", "RollerHorizontalLeft"]] # Blocks path to ladder - [0x1e, 3, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle"]] # forbid a beamos here - [0x35, 8, ["RollerVerticalUp", "RollerVerticalDown"]] # blocks the dock - [0x37, 5, ["RollerVerticalUp"]] # combines with a roller above to make the way impassable @@ -450,7 +455,7 @@ OwGeneralDeny: - [0x40, 13, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle", "Thief"]] - [0x40, 14, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle", "Thief"]] - [0x40, 16, ["RollerVerticalUp", "RollerVerticalDown"]] # Ropa near back hole is really large as a roller - - [0x55, 6, ["BigSpike"]] + - [0x55, 6, ["BigSpike", "Bumper", "AntiFairyCircle"]] - [0x57, 5, ["RollerVerticalUp", "RollerVerticalDown"]] - [0x5b, 0, ["AntiFairyCircle", "Bumper"]] # ropa on pyramid - [0x5e, 0, ["Gibo"]] # kiki eating Gibo @@ -480,6 +485,7 @@ OwGeneralDeny: - [0x77, 1, ["Bumper", "AntiFairyCircle"]] # soft-lock potential near ladder - [0x7f, 1, ["Bumper", "AntiFairyCircle"]] # soft-lock potential near ladder UwEnemyDrop: + - [0x0015, 8, ["Zoro"]] # layer issues - [0x0085, 9, ["Babasu"]] # ran off the edge and didn't return - [0x00cb, 3, ["Zoro"]] # layer issues - [0x00cb, 5, ["Zoro"]] # layer issues From 9847b71a0244133d57a2738437a2c5544b7cdad5 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 13 Nov 2025 08:57:15 -0700 Subject: [PATCH 10/20] fix: blind vram fight fix --- RELEASENOTES.md | 3 ++- Rom.py | 2 +- data/base2current.bps | Bin 118114 -> 118123 bytes 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 29af9f02..9e672645 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -5,7 +5,8 @@ * Pot bug when at sprite limit * Kodongo AI vanilla in vanilla rooms * Issue with music silencing across certain room transitions - * Gltiched: Some HMG logic fixed. Thanks Muffins! (Sorry it took me forever to get this PR in) + * Glitched: Some HMG logic fixed. Thanks Muffins! (Sorry it took me forever to get this PR in) + * Glitched: Blind fight VRAM fix. Thanks Mufffins! * Text: Updated tourney winners. Thanks clearmouse! * Enemizer: Banned Swamola enemy everywhere as they may be causing crashes * Enemizer: Enemy bans from Q2 and Q3. Thank you for all the reports. diff --git a/Rom.py b/Rom.py index 36c989fc..fc343d7e 100644 --- a/Rom.py +++ b/Rom.py @@ -42,7 +42,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'd55c23b3e6d92eeff28ca3724573f4ff' +RANDOMIZERBASEHASH = 'f0881c7ccde2f0d0cd5e9cfe481633ad' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index ac39aaeff42839a87f46b102710c935e5b0ab167..e919637df15e2adc47a00eb2383ceb334378988b 100644 GIT binary patch delta 51 zcmV-30L=g5ng{Ee2e1MI1ZcXKMY9G2NOujXji~{RDgm4TAL{DxgHn38QhEUhQwZeW JxTe&emx&s<7Eb^G delta 42 ycmaDoi~Z3o_6 Date: Thu, 13 Nov 2025 19:17:01 -0600 Subject: [PATCH 11/20] Fix to allow VRAM corruption in boss fights --- Rom.py | 2 +- data/base2current.bps | Bin 137207 -> 137216 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index c0335ec8..ea2930a2 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '2039c11b935d3b81f78810d9f4be19d6' +RANDOMIZERBASEHASH = '62eafe64b2673b686bc66abd42d68b71' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index d052e425fa889e07974906a91a5ceaa7ae87a070..aaaea0f03dff7dba31d8fe1f4ee3b2206fbe3673 100644 GIT binary patch delta 50 zcmV-20L}mRuLyv!2(T&x0}kHtvn>Oddkv|LsR4~D0h|CI>gw==$$q!VegP(#2o-c~ I1iIV{4Oddjx@v7=VM)ez($o0VbIUilQ1rv!Lt@arF_p From 3e9070f30d30844fdf80d03ef04bf517bd492a83 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Tue, 18 Nov 2025 05:47:14 -0600 Subject: [PATCH 12/20] Added missing entries to OWR vanilla preset --- presets/world/owr_vanilla.yaml | 143 ++++++++++++--------------------- 1 file changed, 53 insertions(+), 90 deletions(-) diff --git a/presets/world/owr_vanilla.yaml b/presets/world/owr_vanilla.yaml index d26bb8fa..9c86cc79 100644 --- a/presets/world/owr_vanilla.yaml +++ b/presets/world/owr_vanilla.yaml @@ -1,14 +1,36 @@ ow-edges: 1: two-way: + Lost Woods NW: Master Sword Meadow SC + Lost Woods SW*: Lost Woods Pass NW* + Lost Woods SC*: Lost Woods Pass NE* + Lost Woods SE*: Kakariko Fortune NE* + Lost Woods EN*: Lumberjack WN* + Skull Woods SW*: Skull Woods Pass NW* + Skull Woods SC*: Skull Woods Pass NE* + Skull Woods SE*: Dark Fortune NE* + Skull Woods EN*: Dark Lumberjack WN* Lumberjack SW*: Mountain Pass NW* Dark Lumberjack SW*: Bumper Cave NW* + West Death Mountain EN*: East Death Mountain WN* + West Death Mountain ES*: East Death Mountain WS* + West Dark Death Mountain EN*: East Dark Death Mountain WN* + West Dark Death Mountain ES*: East Dark Death Mountain WS* + East Death Mountain EN*: Death Mountain TR Pegs WN* + East Dark Death Mountain EN*: Turtle Rock WN* Mountain Pass SE*: Kakariko Pond NE* Bumper Cave SE*: Outcast Pond NE* + Zora Waterfall NE: Zoras Domain SW Zora Waterfall SE*: Zora Approach NE* Catfish SE*: Catfish Approach NE* + Lost Woods Pass SW*: Kakariko NW* + Lost Woods Pass SE*: Kakariko NC* + Skull Woods Pass SW*: Village of Outcasts NW* + Skull Woods Pass SE*: Village of Outcasts NC* + Kakariko Fortune SC*: Kakariko NE* Kakariko Fortune EN*: Kakariko Pond WN* Kakariko Fortune ES*: Kakariko Pond WS* + Dark Fortune SC*: Village of Outcasts NE* Dark Fortune EN*: Outcast Pond WN* Dark Fortune ES*: Outcast Pond WS* Kakariko Pond EN*: Sanctuary WN* @@ -39,8 +61,25 @@ ow-edges: Potion Shop EC*: Zora Approach WC* Dark Witch EN*: Catfish Approach WN* Dark Witch EC*: Catfish Approach WC* + Zora Approach NE*: Zora Waterfall SE* + Catfish Approach NE*: Catfish SE* + Kakariko SE*: Kakariko Suburb NE* + Kakariko ES*: Blacksmith WS* + Village of Outcasts SE*: Frog NE* + Village of Outcasts ES*: Hammer Pegs WS* + Forgotten Forest ES: Hyrule Castle WN + Hyrule Castle SW*: Central Bonk Rocks NW* + Hyrule Castle SE*: Links House NE* + Hyrule Castle ES*: Sand Dunes WN* + Pyramid SW*: Dark Bonk Rocks NW* + Pyramid SE*: Big Bomb Shop NE* + Pyramid ES*: Dark Dunes WN* Wooden Bridge SW*: Sand Dunes NW* Broken Bridge SW*: Dark Dunes NW* + Eastern Palace SW*: Tree Line NW* + Eastern Palace SE*: Eastern Nook NE* + Palace of Darkness SW*: Dark Tree Line NW* + Palace of Darkness SE*: Palace of Darkness Nook NE* Sand Dunes SC*: Stone Bridge NC* Dark Dunes SC*: Hammer Bridge NC* Maze Race ES*: Kakariko Suburb WS* @@ -65,10 +104,18 @@ ow-edges: Big Bomb Shop SC*: Hype Cave NC* Big Bomb Shop ES*: Hammer Bridge WS* Stone Bridge WC: Hobo EC + Stone Bridge SC*: Lake Hylia NW* Stone Bridge EN*: Tree Line WN* Stone Bridge EC*: Tree Line WC* + Hammer Bridge SC*: Ice Lake NW* Hammer Bridge EN*: Dark Tree Line WN* Hammer Bridge EC*: Dark Tree Line WC* + Tree Line SC*: Lake Hylia NC* + Tree Line SE*: Lake Hylia NE* + Dark Tree Line SC*: Ice Lake NC* + Dark Tree Line SE*: Ice Lake NE* + Desert EC: Desert Pass WC + Desert ES: Desert Pass WS Flute Boy Approach EC*: C Whirlpool WC* Stumpy Approach EC*: Dark C Whirlpool WC* C Whirlpool EN*: Statues WN* @@ -81,6 +128,10 @@ ow-edges: Dark C Whirlpool SC*: Swamp NC* Statues SC*: South Pass NC* Hype Cave SC*: Dark South Pass NC* + Lake Hylia EC*: Octoballoon WC* + Lake Hylia ES*: Octoballoon WS* + Ice Lake EC*: Bomber Corner WC* + Ice Lake ES*: Bomber Corner WS* Ice Cave SW*: Octoballoon NW* Ice Cave SE*: Octoballoon NE* Shopping Mall SW*: Bomber Corner NW* @@ -91,96 +142,8 @@ ow-edges: Swamp Nook ES*: Swamp WS* Dam EC*: South Pass WC* Swamp EC*: Dark South Pass WC* - Lumberjack SW*: Mountain Pass NW* - Dark Lumberjack SW*: Bumper Cave NW* - Mountain Pass SE*: Kakariko Pond NE* - Bumper Cave SE*: Outcast Pond NE* - Zora Waterfall SE*: Zora Approach NE* - Catfish SE*: Catfish Approach NE* - Kakariko Fortune EN*: Kakariko Pond WN* - Kakariko Fortune ES*: Kakariko Pond WS* - Dark Fortune EN*: Outcast Pond WN* - Dark Fortune ES*: Outcast Pond WS* - Kakariko Pond EN*: Sanctuary WN* - Kakariko Pond ES*: Sanctuary WS* - Kakariko Pond SW*: Forgotten Forest NW* - Kakariko Pond SE*: Forgotten Forest NE* - Outcast Pond EN*: Dark Chapel WN* - Outcast Pond ES*: Dark Chapel WS* - Outcast Pond SW*: Shield Shop NW* - Outcast Pond SE*: Shield Shop NE* - Sanctuary EC*: Graveyard WC* - Dark Chapel EC*: Dark Graveyard WC* - Graveyard EC*: River Bend WC* - Dark Graveyard EC*: Qirn Jump WC* - River Bend EN*: Potion Shop WN* - River Bend EC*: Potion Shop WC* - River Bend ES*: Potion Shop WS* - River Bend SW*: Wooden Bridge NW* - River Bend SC*: Wooden Bridge NC* - River Bend SE*: Wooden Bridge NE* - Qirn Jump EN*: Dark Witch WN* - Qirn Jump EC*: Dark Witch WC* - Qirn Jump ES*: Dark Witch WS* - Qirn Jump SW*: Broken Bridge NW* - Qirn Jump SC*: Broken Bridge NC* - Qirn Jump SE*: Broken Bridge NE* - Potion Shop EN*: Zora Approach WN* - Potion Shop EC*: Zora Approach WC* - Dark Witch EN*: Catfish Approach WN* - Dark Witch EC*: Catfish Approach WC* - Wooden Bridge SW*: Sand Dunes NW* - Broken Bridge SW*: Dark Dunes NW* - Sand Dunes SC*: Stone Bridge NC* - Dark Dunes SC*: Hammer Bridge NC* - Maze Race ES*: Kakariko Suburb WS* - Dig Game EC: Frog WC - Dig Game ES*: Frog WS* - Kakariko Suburb ES*: Flute Boy WS* - Frog ES*: Stumpy WS* - Flute Boy SW*: Flute Boy Approach NW* - Flute Boy SC*: Flute Boy Approach NC* - Stumpy SW*: Stumpy Approach NW* - Stumpy SC*: Stumpy Approach NC* - Central Bonk Rocks EN*: Links House WN* - Central Bonk Rocks EC*: Links House WC* - Central Bonk Rocks ES*: Links House WS* - Central Bonk Rocks SW*: C Whirlpool NW* - Dark Bonk Rocks EN*: Big Bomb Shop WN* - Dark Bonk Rocks EC*: Big Bomb Shop WC* - Dark Bonk Rocks ES*: Big Bomb Shop WS* - Dark Bonk Rocks SW*: Dark C Whirlpool NW* - Links House SC*: Statues NC* - Links House ES*: Stone Bridge WS* - Big Bomb Shop SC*: Hype Cave NC* - Big Bomb Shop ES*: Hammer Bridge WS* - Stone Bridge WC: Hobo EC - Stone Bridge EN*: Tree Line WN* - Stone Bridge EC*: Tree Line WC* - Hammer Bridge EN*: Dark Tree Line WN* - Hammer Bridge EC*: Dark Tree Line WC* - Flute Boy Approach EC*: C Whirlpool WC* - Stumpy Approach EC*: Dark C Whirlpool WC* - C Whirlpool EN*: Statues WN* - C Whirlpool EC*: Statues WC* - C Whirlpool ES*: Statues WS* - C Whirlpool SC*: Dam NC* - Dark C Whirlpool EN*: Hype Cave WN* - Dark C Whirlpool EC*: Hype Cave WC* - Dark C Whirlpool ES*: Hype Cave WS* - Dark C Whirlpool SC*: Swamp NC* - Statues SC*: South Pass NC* - Hype Cave SC*: Dark South Pass NC* - Ice Cave SW*: Octoballoon NW* - Ice Cave SE*: Octoballoon NE* - Shopping Mall SW*: Bomber Corner NW* - Shopping Mall SE*: Bomber Corner NE* - Desert Pass EC*: Dam WC* - Desert Pass ES*: Dam WS* - Swamp Nook EC*: Swamp WC* - Swamp Nook ES*: Swamp WS* - Dam EC*: South Pass WC* - Swamp EC*: Dark South Pass WC* + South Pass ES*: Lake Hylia WS* + Dark South Pass ES*: Ice Lake WS* ow-whirlpools: 1: two-way: From 2b7a9e3bf8696d6e9d60f9ee9f13bfef31a0ff10 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Tue, 18 Nov 2025 23:57:27 -0600 Subject: [PATCH 13/20] Added new gfx for 10/11 keys rather than A/B keys --- Rom.py | 2 +- data/base2current.bps | Bin 137216 -> 138220 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index ea2930a2..44381bb7 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '62eafe64b2673b686bc66abd42d68b71' +RANDOMIZERBASEHASH = '4397d4085a981cf416b0e8b4f57584a0' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index aaaea0f03dff7dba31d8fe1f4ee3b2206fbe3673..9dd44444d33227ac5abf8cdcf27c031194e8e0c8 100644 GIT binary patch delta 5184 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 delta 4153 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 From fb99d33007af96c08e5f8ad505e896f7a4e3baad Mon Sep 17 00:00:00 2001 From: codemann8 Date: Wed, 19 Nov 2025 09:54:31 -0600 Subject: [PATCH 14/20] Added new post-gen option to change TF Piece GFX --- Adjuster.py | 1 + AdjusterMain.py | 10 +- CLI.py | 3 +- Main.py | 2 +- Plando.py | 2 +- Rom.py | 18 +- Tables.py | 225 +++++++++++++---------- data/base2current.bps | Bin 138220 -> 138220 bytes data/itemgfx/Apples.gif | Bin 0 -> 268 bytes data/itemgfx/Arrow Upgrade (+10).gif | Bin 0 -> 260 bytes data/itemgfx/Arrow Upgrade (+5).gif | Bin 0 -> 260 bytes data/itemgfx/Arrow Upgrade (70).gif | Bin 0 -> 263 bytes data/itemgfx/Arrow.gif | Bin 0 -> 194 bytes data/itemgfx/Arrows (10).gif | Bin 0 -> 266 bytes data/itemgfx/Bee Trap.gif | Bin 0 -> 254 bytes data/itemgfx/Big Key.gif | Bin 0 -> 287 bytes data/itemgfx/Blacksmith.gif | Bin 0 -> 330 bytes data/itemgfx/Blue Clock.gif | Bin 0 -> 288 bytes data/itemgfx/Blue Maiden (Body).gif | Bin 0 -> 313 bytes data/itemgfx/Blue Mail.gif | Bin 0 -> 301 bytes data/itemgfx/Blue Pendant.gif | Bin 0 -> 310 bytes data/itemgfx/Blue Potion (B).gif | Bin 0 -> 320 bytes data/itemgfx/Blue Potion.gif | Bin 0 -> 301 bytes data/itemgfx/Blue Shield (Thin).gif | Bin 0 -> 190 bytes data/itemgfx/Blue Shield.gif | Bin 0 -> 212 bytes data/itemgfx/Bomb Upgrade (+10).gif | Bin 0 -> 292 bytes data/itemgfx/Bomb Upgrade (+5).gif | Bin 0 -> 296 bytes data/itemgfx/Bomb Upgrade (50).gif | Bin 0 -> 291 bytes data/itemgfx/Bomb.gif | Bin 0 -> 269 bytes data/itemgfx/Bombbag.gif | Bin 0 -> 305 bytes data/itemgfx/Bombos.gif | Bin 0 -> 271 bytes data/itemgfx/Bombs (10).gif | Bin 0 -> 296 bytes data/itemgfx/Bombs (3).gif | Bin 0 -> 326 bytes data/itemgfx/Book of Mudora.gif | Bin 0 -> 292 bytes data/itemgfx/Boomerang.gif | Bin 0 -> 167 bytes data/itemgfx/Bottle (Bee).gif | Bin 0 -> 277 bytes data/itemgfx/Bottle (Blue Potion).gif | Bin 0 -> 287 bytes data/itemgfx/Bottle (Fairy).gif | Bin 0 -> 297 bytes data/itemgfx/Bottle (Green Potion).gif | Bin 0 -> 287 bytes data/itemgfx/Bottle (Red Potion).gif | Bin 0 -> 287 bytes data/itemgfx/Bottle.gif | Bin 0 -> 247 bytes data/itemgfx/Bow.gif | Bin 0 -> 188 bytes data/itemgfx/Bug Net.gif | Bin 0 -> 295 bytes data/itemgfx/Byrna.gif | Bin 0 -> 189 bytes data/itemgfx/Chest.gif | Bin 0 -> 289 bytes data/itemgfx/Chicken.gif | Bin 0 -> 329 bytes data/itemgfx/Compass.gif | Bin 0 -> 333 bytes data/itemgfx/Crystal.gif | Bin 0 -> 230 bytes data/itemgfx/Duck.gif | Bin 0 -> 297 bytes data/itemgfx/Egg.gif | Bin 0 -> 231 bytes data/itemgfx/Ether.gif | Bin 0 -> 267 bytes data/itemgfx/Fairy.gif | Bin 0 -> 336 bytes data/itemgfx/Fighter Sword (Thin).gif | Bin 0 -> 154 bytes data/itemgfx/Fighter Sword.gif | Bin 0 -> 233 bytes data/itemgfx/Fire Rod.gif | Bin 0 -> 215 bytes data/itemgfx/Fire Shield.gif | Bin 0 -> 254 bytes data/itemgfx/Fire.gif | Bin 0 -> 292 bytes data/itemgfx/Flippers.gif | Bin 0 -> 306 bytes data/itemgfx/Frog.gif | Bin 0 -> 342 bytes data/itemgfx/Full Magic.gif | Bin 0 -> 209 bytes data/itemgfx/Golden Sword (Thin).gif | Bin 0 -> 180 bytes data/itemgfx/Golden Sword.gif | Bin 0 -> 283 bytes data/itemgfx/Green Clock.gif | Bin 0 -> 288 bytes data/itemgfx/Green Maiden (Body).gif | Bin 0 -> 313 bytes data/itemgfx/Green Mail.gif | Bin 0 -> 301 bytes data/itemgfx/Green Pendant.gif | Bin 0 -> 326 bytes data/itemgfx/Green Potion (G).gif | Bin 0 -> 316 bytes data/itemgfx/Green Potion.gif | Bin 0 -> 301 bytes data/itemgfx/Green Rupees (20).gif | Bin 0 -> 298 bytes data/itemgfx/Half Magic.gif | Bin 0 -> 301 bytes data/itemgfx/Hammer.gif | Bin 0 -> 198 bytes data/itemgfx/Heart (Blue).gif | Bin 0 -> 146 bytes data/itemgfx/Heart (Green).gif | Bin 0 -> 146 bytes data/itemgfx/Heart Container (Blue).gif | Bin 0 -> 232 bytes data/itemgfx/Heart Container (Green).gif | Bin 0 -> 232 bytes data/itemgfx/Heart Container.gif | Bin 0 -> 232 bytes data/itemgfx/Heart.gif | Bin 0 -> 146 bytes data/itemgfx/Hookshot.gif | Bin 0 -> 211 bytes data/itemgfx/Ice Rod.gif | Bin 0 -> 215 bytes data/itemgfx/Kiki (Body).gif | Bin 0 -> 238 bytes data/itemgfx/Kiki (Head).gif | Bin 0 -> 279 bytes data/itemgfx/Lamp.gif | Bin 0 -> 286 bytes data/itemgfx/Locksmith (Body).gif | Bin 0 -> 311 bytes data/itemgfx/Locksmith (Head).gif | Bin 0 -> 279 bytes data/itemgfx/Lumberjack (Head).gif | Bin 0 -> 332 bytes data/itemgfx/Magic Cape.gif | Bin 0 -> 306 bytes data/itemgfx/Magic Mirror.gif | Bin 0 -> 293 bytes data/itemgfx/Magic Powder.gif | Bin 0 -> 317 bytes data/itemgfx/Maiden (Head).gif | Bin 0 -> 282 bytes data/itemgfx/Map.gif | Bin 0 -> 313 bytes data/itemgfx/Master Key.gif | Bin 0 -> 256 bytes data/itemgfx/Master Sword (Thin).gif | Bin 0 -> 180 bytes data/itemgfx/Master Sword.gif | Bin 0 -> 287 bytes data/itemgfx/Mirror Shield.gif | Bin 0 -> 320 bytes data/itemgfx/Moon Pearl.gif | Bin 0 -> 260 bytes data/itemgfx/Mushroom.gif | Bin 0 -> 287 bytes data/itemgfx/Ocarina.gif | Bin 0 -> 274 bytes data/itemgfx/Old Man (Body).gif | Bin 0 -> 263 bytes data/itemgfx/Old Man (Head).gif | Bin 0 -> 313 bytes data/itemgfx/Open Chest.gif | Bin 0 -> 236 bytes data/itemgfx/Pegasus Boots.gif | Bin 0 -> 286 bytes data/itemgfx/Piece of Heart.gif | Bin 0 -> 255 bytes data/itemgfx/Power Glove.gif | Bin 0 -> 317 bytes data/itemgfx/Power Star.gif | Bin 0 -> 278 bytes data/itemgfx/Progressive Bow.gif | Bin 0 -> 308 bytes data/itemgfx/Pseudoboots.gif | Bin 0 -> 286 bytes data/itemgfx/Pseudolamp.gif | Bin 0 -> 286 bytes data/itemgfx/Purple Chest.gif | Bin 0 -> 316 bytes data/itemgfx/Quake.gif | Bin 0 -> 262 bytes data/itemgfx/Quarter Magic.gif | Bin 0 -> 296 bytes data/itemgfx/Red Boomerang.gif | Bin 0 -> 167 bytes data/itemgfx/Red Clock.gif | Bin 0 -> 288 bytes data/itemgfx/Red Crystal.gif | Bin 0 -> 272 bytes data/itemgfx/Red Maiden (Body).gif | Bin 0 -> 313 bytes data/itemgfx/Red Mail.gif | Bin 0 -> 301 bytes data/itemgfx/Red Pendant.gif | Bin 0 -> 310 bytes data/itemgfx/Red Potion (R).gif | Bin 0 -> 319 bytes data/itemgfx/Red Potion.gif | Bin 0 -> 301 bytes data/itemgfx/Rupee (1).gif | Bin 0 -> 193 bytes data/itemgfx/Rupee (20).gif | Bin 0 -> 193 bytes data/itemgfx/Rupee (5).gif | Bin 0 -> 193 bytes data/itemgfx/Rupees (100).gif | Bin 0 -> 299 bytes data/itemgfx/Rupees (300).gif | Bin 0 -> 298 bytes data/itemgfx/Rupees (50).gif | Bin 0 -> 299 bytes data/itemgfx/Shovel.gif | Bin 0 -> 209 bytes data/itemgfx/Silver Arrows (Ag).gif | Bin 0 -> 263 bytes data/itemgfx/Silver Arrows.gif | Bin 0 -> 305 bytes data/itemgfx/Small Key.gif | Bin 0 -> 188 bytes data/itemgfx/Small Magic.gif | Bin 0 -> 173 bytes data/itemgfx/Somaria.gif | Bin 0 -> 189 bytes data/itemgfx/Super Bomb.gif | Bin 0 -> 299 bytes data/itemgfx/Sword and Shield.gif | Bin 0 -> 271 bytes data/itemgfx/Tempered Sword (Thin).gif | Bin 0 -> 180 bytes data/itemgfx/Tempered Sword.gif | Bin 0 -> 286 bytes data/itemgfx/Titans Mitt.gif | Bin 0 -> 317 bytes data/itemgfx/Triforce.gif | Bin 0 -> 207 bytes data/itemgfx/Warp Tile.gif | Bin 0 -> 272 bytes data/itemgfx/Whirlpool.gif | Bin 0 -> 376 bytes data/itemgfx/Zelda (Body).gif | Bin 0 -> 323 bytes data/itemgfx/Zelda (Head).gif | Bin 0 -> 309 bytes resources/app/cli/args.json | 1 + resources/app/gui/lang/en.json | 5 +- source/classes/CustomSettings.py | 1 + source/classes/ItemGfxSelector.py | 121 ++++++++++++ source/gui/adjust/overview.py | 27 +++ source/gui/bottom.py | 3 + source/gui/loadcliargs.py | 7 + source/gui/randomize/gameoptions.py | 29 +++ source/tools/MysteryUtils.py | 1 + 149 files changed, 354 insertions(+), 102 deletions(-) create mode 100644 data/itemgfx/Apples.gif create mode 100644 data/itemgfx/Arrow Upgrade (+10).gif create mode 100644 data/itemgfx/Arrow Upgrade (+5).gif create mode 100644 data/itemgfx/Arrow Upgrade (70).gif create mode 100644 data/itemgfx/Arrow.gif create mode 100644 data/itemgfx/Arrows (10).gif create mode 100644 data/itemgfx/Bee Trap.gif create mode 100644 data/itemgfx/Big Key.gif create mode 100644 data/itemgfx/Blacksmith.gif create mode 100644 data/itemgfx/Blue Clock.gif create mode 100644 data/itemgfx/Blue Maiden (Body).gif create mode 100644 data/itemgfx/Blue Mail.gif create mode 100644 data/itemgfx/Blue Pendant.gif create mode 100644 data/itemgfx/Blue Potion (B).gif create mode 100644 data/itemgfx/Blue Potion.gif create mode 100644 data/itemgfx/Blue Shield (Thin).gif create mode 100644 data/itemgfx/Blue Shield.gif create mode 100644 data/itemgfx/Bomb Upgrade (+10).gif create mode 100644 data/itemgfx/Bomb Upgrade (+5).gif create mode 100644 data/itemgfx/Bomb Upgrade (50).gif create mode 100644 data/itemgfx/Bomb.gif create mode 100644 data/itemgfx/Bombbag.gif create mode 100644 data/itemgfx/Bombos.gif create mode 100644 data/itemgfx/Bombs (10).gif create mode 100644 data/itemgfx/Bombs (3).gif create mode 100644 data/itemgfx/Book of Mudora.gif create mode 100644 data/itemgfx/Boomerang.gif create mode 100644 data/itemgfx/Bottle (Bee).gif create mode 100644 data/itemgfx/Bottle (Blue Potion).gif create mode 100644 data/itemgfx/Bottle (Fairy).gif create mode 100644 data/itemgfx/Bottle (Green Potion).gif create mode 100644 data/itemgfx/Bottle (Red Potion).gif create mode 100644 data/itemgfx/Bottle.gif create mode 100644 data/itemgfx/Bow.gif create mode 100644 data/itemgfx/Bug Net.gif create mode 100644 data/itemgfx/Byrna.gif create mode 100644 data/itemgfx/Chest.gif create mode 100644 data/itemgfx/Chicken.gif create mode 100644 data/itemgfx/Compass.gif create mode 100644 data/itemgfx/Crystal.gif create mode 100644 data/itemgfx/Duck.gif create mode 100644 data/itemgfx/Egg.gif create mode 100644 data/itemgfx/Ether.gif create mode 100644 data/itemgfx/Fairy.gif create mode 100644 data/itemgfx/Fighter Sword (Thin).gif create mode 100644 data/itemgfx/Fighter Sword.gif create mode 100644 data/itemgfx/Fire Rod.gif create mode 100644 data/itemgfx/Fire Shield.gif create mode 100644 data/itemgfx/Fire.gif create mode 100644 data/itemgfx/Flippers.gif create mode 100644 data/itemgfx/Frog.gif create mode 100644 data/itemgfx/Full Magic.gif create mode 100644 data/itemgfx/Golden Sword (Thin).gif create mode 100644 data/itemgfx/Golden Sword.gif create mode 100644 data/itemgfx/Green Clock.gif create mode 100644 data/itemgfx/Green Maiden (Body).gif create mode 100644 data/itemgfx/Green Mail.gif create mode 100644 data/itemgfx/Green Pendant.gif create mode 100644 data/itemgfx/Green Potion (G).gif create mode 100644 data/itemgfx/Green Potion.gif create mode 100644 data/itemgfx/Green Rupees (20).gif create mode 100644 data/itemgfx/Half Magic.gif create mode 100644 data/itemgfx/Hammer.gif create mode 100644 data/itemgfx/Heart (Blue).gif create mode 100644 data/itemgfx/Heart (Green).gif create mode 100644 data/itemgfx/Heart Container (Blue).gif create mode 100644 data/itemgfx/Heart Container (Green).gif create mode 100644 data/itemgfx/Heart Container.gif create mode 100644 data/itemgfx/Heart.gif create mode 100644 data/itemgfx/Hookshot.gif create mode 100644 data/itemgfx/Ice Rod.gif create mode 100644 data/itemgfx/Kiki (Body).gif create mode 100644 data/itemgfx/Kiki (Head).gif create mode 100644 data/itemgfx/Lamp.gif create mode 100644 data/itemgfx/Locksmith (Body).gif create mode 100644 data/itemgfx/Locksmith (Head).gif create mode 100644 data/itemgfx/Lumberjack (Head).gif create mode 100644 data/itemgfx/Magic Cape.gif create mode 100644 data/itemgfx/Magic Mirror.gif create mode 100644 data/itemgfx/Magic Powder.gif create mode 100644 data/itemgfx/Maiden (Head).gif create mode 100644 data/itemgfx/Map.gif create mode 100644 data/itemgfx/Master Key.gif create mode 100644 data/itemgfx/Master Sword (Thin).gif create mode 100644 data/itemgfx/Master Sword.gif create mode 100644 data/itemgfx/Mirror Shield.gif create mode 100644 data/itemgfx/Moon Pearl.gif create mode 100644 data/itemgfx/Mushroom.gif create mode 100644 data/itemgfx/Ocarina.gif create mode 100644 data/itemgfx/Old Man (Body).gif create mode 100644 data/itemgfx/Old Man (Head).gif create mode 100644 data/itemgfx/Open Chest.gif create mode 100644 data/itemgfx/Pegasus Boots.gif create mode 100644 data/itemgfx/Piece of Heart.gif create mode 100644 data/itemgfx/Power Glove.gif create mode 100644 data/itemgfx/Power Star.gif create mode 100644 data/itemgfx/Progressive Bow.gif create mode 100644 data/itemgfx/Pseudoboots.gif create mode 100644 data/itemgfx/Pseudolamp.gif create mode 100644 data/itemgfx/Purple Chest.gif create mode 100644 data/itemgfx/Quake.gif create mode 100644 data/itemgfx/Quarter Magic.gif create mode 100644 data/itemgfx/Red Boomerang.gif create mode 100644 data/itemgfx/Red Clock.gif create mode 100644 data/itemgfx/Red Crystal.gif create mode 100644 data/itemgfx/Red Maiden (Body).gif create mode 100644 data/itemgfx/Red Mail.gif create mode 100644 data/itemgfx/Red Pendant.gif create mode 100644 data/itemgfx/Red Potion (R).gif create mode 100644 data/itemgfx/Red Potion.gif create mode 100644 data/itemgfx/Rupee (1).gif create mode 100644 data/itemgfx/Rupee (20).gif create mode 100644 data/itemgfx/Rupee (5).gif create mode 100644 data/itemgfx/Rupees (100).gif create mode 100644 data/itemgfx/Rupees (300).gif create mode 100644 data/itemgfx/Rupees (50).gif create mode 100644 data/itemgfx/Shovel.gif create mode 100644 data/itemgfx/Silver Arrows (Ag).gif create mode 100644 data/itemgfx/Silver Arrows.gif create mode 100644 data/itemgfx/Small Key.gif create mode 100644 data/itemgfx/Small Magic.gif create mode 100644 data/itemgfx/Somaria.gif create mode 100644 data/itemgfx/Super Bomb.gif create mode 100644 data/itemgfx/Sword and Shield.gif create mode 100644 data/itemgfx/Tempered Sword (Thin).gif create mode 100644 data/itemgfx/Tempered Sword.gif create mode 100644 data/itemgfx/Titans Mitt.gif create mode 100644 data/itemgfx/Triforce.gif create mode 100644 data/itemgfx/Warp Tile.gif create mode 100644 data/itemgfx/Whirlpool.gif create mode 100644 data/itemgfx/Zelda (Body).gif create mode 100644 data/itemgfx/Zelda (Head).gif create mode 100644 source/classes/ItemGfxSelector.py diff --git a/Adjuster.py b/Adjuster.py index 68ac73ad..ba502c8a 100755 --- a/Adjuster.py +++ b/Adjuster.py @@ -47,6 +47,7 @@ def main(): Alternatively, can be a ALttP Rom patched with a Link sprite that will be extracted. ''') + parser.add_argument('--triforce_gfx', help='Name of the triforce graphics to use.') parser.add_argument('--names', default='', type=str) args = parser.parse_args() diff --git a/AdjusterMain.py b/AdjusterMain.py index 803bed24..6b886a4b 100644 --- a/AdjusterMain.py +++ b/AdjusterMain.py @@ -30,9 +30,11 @@ def adjust(args): if not hasattr(args,"sprite"): args.sprite = None + if not hasattr(args,"triforce_gfx"): + args.triforce_gfx = None apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, - args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx, + args.sprite, args.triforce_gfx, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx, args.shuffle_sfxinstruments, args.shuffle_songinstruments, args.msu_resume) output_path.cached_path = args.outputpath @@ -65,10 +67,12 @@ def patch(args): if not hasattr(args, "sprite"): args.sprite = None + if not hasattr(args, "triforce_gfx"): + args.triforce_gfx = None apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, - args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx, - args.shuffle_sfxinstruments, args.shuffle_songinstruments, args.msu_resume) + args.sprite, args.triforce_gfx, args.ow_palettes, args.uw_palettes, args.reduce_flashing, + args.shuffle_sfx, args.shuffle_sfxinstruments, args.shuffle_songinstruments, args.msu_resume) output_path.cached_path = args.outputpath rom.write_to_file(output_path('%s.sfc' % outfile_base)) diff --git a/CLI.py b/CLI.py index c6ae7d9f..5eb4f3e2 100644 --- a/CLI.py +++ b/CLI.py @@ -141,7 +141,7 @@ def parse_cli(argv, no_defaults=False): 'skullwoods', 'linked_drops', 'pseudoboots', 'mirrorscroll', 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', - 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', + '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', @@ -264,6 +264,7 @@ def parse_settings(): "heartcolor": "red", "heartbeep": "normal", "sprite": None, + "triforce_gfx": None, "fastmenu": "normal", "ow_palettes": "default", "uw_palettes": "default", diff --git a/Main.py b/Main.py index 2c242384..6b587bf6 100644 --- a/Main.py +++ b/Main.py @@ -299,7 +299,7 @@ def main(args, seed=None, fish=None): world.spoiler.hashes[(player, team)] = get_hash_string(rom.hash) apply_rom_settings(rom, args.heartbeep[player], args.heartcolor[player], args.quickswap[player], - args.fastmenu[player], args.disablemusic[player], args.sprite[player], + args.fastmenu[player], args.disablemusic[player], args.sprite[player], args.triforce_gfx[player], args.ow_palettes[player], args.uw_palettes[player], args.reduce_flashing[player], args.shuffle_sfx[player], args.shuffle_sfxinstruments[player], args.shuffle_songinstruments[player], args.msu_resume[player]) diff --git a/Plando.py b/Plando.py index 2c948435..25003f24 100755 --- a/Plando.py +++ b/Plando.py @@ -76,7 +76,7 @@ def main(args): rom = LocalRom(args.rom) patch_rom(world, rom, 1, 1, False, str(args.rom_header) if args.rom_header else None) - apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, args.sprite, args.ow_palettes, args.uw_palettes) + apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, args.sprite, args.triforce_gfx, args.ow_palettes, args.uw_palettes) for textname, texttype, text in text_patches: if texttype == 'text': diff --git a/Rom.py b/Rom.py index 44381bb7..ad5e488b 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '4397d4085a981cf416b0e8b4f57584a0' +RANDOMIZERBASEHASH = 'fea650d598f4399db790903d9eb16186' class JsonRom(object): @@ -1875,7 +1875,7 @@ def hud_format_text(text): return output[:32] -def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite, +def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite, triforce_gfx, ow_palettes, uw_palettes, reduce_flashing, shuffle_sfx, shuffle_sfxinstruments, shuffle_songinstruments, msu_resume): @@ -1933,6 +1933,20 @@ def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, spr # write link sprite if required if sprite is not None: write_sprite(rom, sprite) + + if triforce_gfx is not None: + from Tables import item_gfx_table + if triforce_gfx in item_gfx_table.keys(): + (is_custom, address, palette, pal_addr, size) = item_gfx_table[triforce_gfx] + address = address if is_custom else 0x8000 + address + write_int16(rom, snes_to_pc(0xA2C600+(0x6C*2)), address) + write_int16(rom, snes_to_pc(0xA2C800+(0x6C*2)), address) + rom.write_byte(snes_to_pc(0xA2B100+0x6C), 0 if size == 2 else 4) + rom.write_byte(snes_to_pc(0xA2BA00+0x6C), size) + rom.write_byte(snes_to_pc(0xA2BB00+0x6C), size) + rom.write_byte(snes_to_pc(0xA2BC00+0x6C), palette) + rom.write_byte(snes_to_pc(0xA2BD00+0x6C), palette) + write_int16(rom, snes_to_pc(0xA2BE00+(0x6C*2)), pal_addr) # sprite author credits padded_author = sprite.author_name if sprite is not None else "Nintendo" diff --git a/Tables.py b/Tables.py index 33e1e230..5272f586 100644 --- a/Tables.py +++ b/Tables.py @@ -147,101 +147,140 @@ bonk_prize_lookup = { 'Fairy': (0xe3, 15, None) } -# item name: (custom gfx, address offset, palette) +# item name: (custom gfx, address offset, palette, palette address, size) # decompressed gfx loaded at $7F8000 # custom gfx loaded at $228000 item_gfx_table = { - 'Green Rupees (20)': (False, 0x0000, 0x04), - 'Pegasus Boots': (False, 0x0040, 0x01), - 'Psuedoboots': (False, 0x0040, 0x02), - 'Blue Pendant': (False, 0x0080, 0x02), - 'Red Pendant': (False, 0x0080, 0x01), - 'Warp Tile': (False, 0x00C0, 0x04), - 'Open Chest': (False, 0x0100, 0x02), - 'Chicken': (False, 0x0140, 0x04), - 'Duck': (False, 0x0180, 0x01), - 'Chest': (False, 0x0400, 0x02), - 'Frog': (False, 0x0440, 0x04), - 'Kiki (Head)': (False, 0x0480, 0x04), - 'Purple Chest': (False, 0x0500, 0x04), - 'Super Bomb': (False, 0x0540, 0x04), - 'Blacksmith': (False, 0x0580, 0x04), - 'Bug Net': (False, 0x0860, 0x01), - 'Crystal': (False, 0x08A0, 0x06), - 'Silver Arrows': (False, 0x08E0, 0x01), - 'Bow': (False, 0x0920, 0x02), - 'Bottle (Fairy)': (False, 0x0960, 0x02), - 'Bottle (Bee)': (False, 0x09A0, 0x02), - 'Piece of Heart': (False, 0x0C00, 0x01), - 'Ocarina': (False, 0x0C40, 0x02), - 'Mirror Shield': (False, 0x0C80, 0x04), - 'Rupees (100)': (False, 0x0D20, 0x04), - 'Rupees (50)': (False, 0x0D60, 0x04), - 'Rupees (300)': (False, 0x0DA0, 0x04), - 'Flippers': (False, 0x1000, 0x02), - 'Mirror': (False, 0x1040, 0x02), - 'Bomb': (False, 0x1080, 0x02), - 'Lamp': (False, 0x10C0, 0x01), - 'Psuedolamp': (False, 0x10C0, 0x02), - 'Magic Cape': (False, 0x1100, 0x01), - 'Compass': (False, 0x1140, 0x02), - 'Moon Pearl': (False, 0x1180, 0x01), - 'Ether': (False, 0x1400, 0x04), - 'Bombos': (False, 0x1440, 0x04), - 'Quake': (False, 0x1480, 0x04), - 'Bottle': (False, 0x14C0, 0x01), - 'Bottle (Red Potion)': (False, 0x1500, 0x01), - 'Bottle (Green Potion)': (False, 0x1500, 0x04), - 'Bottle (Blue Potion)': (False, 0x1500, 0x02), - 'Mushroom': (False, 0x1540, 0x04), - 'Map': (False, 0x1580, 0x04), - 'Big Key': (False, 0x15C0, 0x04), - 'Bombs (3)': (False, 0x1840, 0x02), - 'Arrows (10)': (False, 0x1880, 0x02), - 'Heart Container': (False, 0x18C0, 0x01), - 'Green Mail': (False, 0x1900, 0x04), - 'Blue Mail': (False, 0x1900, 0x02), - 'Red Mail': (False, 0x1900, 0x01), - 'Fire Sheild': (False, 0x1980, 0x04), - 'Blue Shield': (False, 0x19C0, 0x02), - 'Magic Powder': (False, 0x1CC0, 0x02), - 'Bombs (10)': (False, 0x1D00, 0x02), - 'Power Glove': (False, 0x1D40, 0x01), - 'Titans Mitts': (False, 0x1D40, 0x04), - 'Book of Mudora': (False, 0x1D80, 0x04), - 'Maiden (Head)': (False, 0x2000, 0x04), - 'Zelda (Head)': (False, 0x2080, 0x04), - 'Old Man (Head)': (False, 0x2140, 0x04), - 'Locksmith (Head)': (False, 0x2180, 0x04), - 'Fire': (False, 0x25C0, 0x04), - 'Apples': (False, 0x30A0, 0x04), - 'Fairy': (False, 0x3140, 0x01), - 'Whirlpool': (False, 0x31C0, 0x01), + 'Green Rupees (20)': (False, 0x0000, 0x04, 0x0000, 2), + 'Pegasus Boots': (False, 0x0040, 0x01, 0x0000, 2), + 'Psuedoboots': (False, 0x0040, 0x02, 0x0000, 2), + 'Blue Pendant': (False, 0x0080, 0x02, 0x0000, 2), + 'Red Pendant': (False, 0x0080, 0x01, 0x0000, 2), + 'Warp Tile': (False, 0x00C0, 0x04, 0x0000, 2), + 'Open Chest': (False, 0x0100, 0x02, 0x0000, 2), + 'Chicken': (False, 0x0140, 0x04, 0x0000, 2), + 'Duck': (False, 0x0180, 0x01, 0x0000, 2), + 'Chest': (False, 0x0400, 0x02, 0x0000, 2), + 'Frog': (False, 0x0440, 0x04, 0x0000, 2), + 'Kiki (Head)': (False, 0x0480, 0x04, 0x0000, 2), + 'Purple Chest': (False, 0x0500, 0x04, 0x0000, 2), + 'Super Bomb': (False, 0x0540, 0x04, 0x0000, 2), + 'Blacksmith': (False, 0x0580, 0x04, 0x0000, 2), + 'Bug Net': (False, 0x0860, 0x01, 0x0000, 2), + 'Crystal': (False, 0x08A0, 0x86, 0xB240, 2), + 'Silver Arrows': (False, 0x08E0, 0x01, 0x0000, 2), + 'Progressive Bow': (False, 0x0920, 0x02, 0x0000, 2), + 'Bottle (Fairy)': (False, 0x0960, 0x02, 0x0000, 2), + 'Bottle (Bee)': (False, 0x09A0, 0x02, 0x0000, 2), + 'Piece of Heart': (False, 0x0C00, 0x01, 0x0000, 2), + 'Ocarina': (False, 0x0C40, 0x02, 0x0000, 2), + 'Mirror Shield': (False, 0x0C80, 0x80, 0xB230, 2), + 'Rupees (100)': (False, 0x0D20, 0x04, 0x0000, 2), + 'Rupees (50)': (False, 0x0D60, 0x04, 0x0000, 2), + 'Rupees (300)': (False, 0x0DA0, 0x04, 0x0000, 2), + 'Flippers': (False, 0x1000, 0x02, 0x0000, 2), + 'Magic Mirror': (False, 0x1040, 0x02, 0x0000, 2), + 'Bomb': (False, 0x1080, 0x02, 0x0000, 2), + 'Lamp': (False, 0x10C0, 0x01, 0x0000, 2), + 'Psuedolamp': (False, 0x10C0, 0x02, 0x0000, 2), + 'Magic Cape': (False, 0x1100, 0x01, 0x0000, 2), + 'Compass': (False, 0x1140, 0x02, 0x0000, 2), + 'Moon Pearl': (False, 0x1180, 0x01, 0x0000, 2), + 'Ether': (False, 0x1400, 0x04, 0x0000, 2), + 'Bombos': (False, 0x1440, 0x04, 0x0000, 2), + 'Quake': (False, 0x1480, 0x04, 0x0000, 2), + 'Bottle': (False, 0x14C0, 0x01, 0x0000, 2), + 'Bottle (Red Potion)': (False, 0x1500, 0x01, 0x0000, 2), + 'Bottle (Green Potion)': (False, 0x1500, 0x04, 0x0000, 2), + 'Bottle (Blue Potion)': (False, 0x1500, 0x02, 0x0000, 2), + 'Mushroom': (False, 0x1540, 0x04, 0x0000, 2), + 'Map': (False, 0x1580, 0x04, 0x0000, 2), + 'Big Key': (False, 0x15C0, 0x04, 0x0000, 2), + 'Green Potion': (False, 0x1800, 0x04, 0x0000, 2), + 'Blue Potion': (False, 0x1800, 0x02, 0x0000, 2), + 'Red Potion': (False, 0x1800, 0x01, 0x0000, 2), + 'Bombs (3)': (False, 0x1840, 0x02, 0x0000, 2), + 'Arrows (10)': (False, 0x1880, 0x02, 0x0000, 2), + 'Heart Container': (False, 0x18C0, 0x01, 0x0000, 2), + 'Heart Container (Green)': (False, 0x18C0, 0x04, 0x0000, 2), + 'Heart Container (Blue)': (False, 0x18C0, 0x02, 0x0000, 2), + 'Green Mail': (False, 0x1900, 0x04, 0x0000, 2), + 'Blue Mail': (False, 0x1900, 0x02, 0x0000, 2), + 'Red Mail': (False, 0x1900, 0x01, 0x0000, 2), + 'Fire Shield': (False, 0x1940, 0x80, 0xB220, 2), + 'Blue Shield': (False, 0x19C0, 0x02, 0x0000, 2), + 'Magic Powder': (False, 0x1CC0, 0x02, 0x0000, 2), + 'Bombs (10)': (False, 0x1D00, 0x02, 0x0000, 2), + 'Power Glove': (False, 0x1D40, 0x01, 0x0000, 2), + 'Titans Mitt': (False, 0x1D40, 0x04, 0x0000, 2), + 'Book of Mudora': (False, 0x1D80, 0x04, 0x0000, 2), + 'Maiden (Head)': (False, 0x2000, 0x04, 0x0000, 2), + 'Zelda (Head)': (False, 0x2080, 0x04, 0x0000, 2), + 'Old Man (Head)': (False, 0x2140, 0x04, 0x0000, 2), + 'Locksmith (Head)': (False, 0x2180, 0x04, 0x0000, 2), + 'Fire': (False, 0x25C0, 0x04, 0x0000, 2), + 'Apples': (False, 0x30A0, 0x04, 0x0000, 2), + 'Fairy': (False, 0x3140, 0x01, 0x0000, 2), + 'Whirlpool': (False, 0x31C0, 0x02, 0x0000, 2), - 'Triforce': (True, 0x0060, 0x04), - 'Fighter Sword': (True, 0x00A0, 0x02), - 'Master Sword': (True, 0x00E0, 0x02), - 'Tempered Sword': (True, 0x0120, 0x01), - 'Golden Sword': (True, 0x0160, 0x04), - 'Half Magic': (True, 0x01A0, 0x04), - 'Quarter Magic': (True, 0x01E0, 0x04), - 'Bomb Upgrade (+5)': (True, 0x0420, 0x04), - 'Bomb Upgrade (+10)': (True, 0x0460, 0x04), - 'Bomb Upgrade (50)': (True, 0x04A0, 0x04), - 'Bombbag': (True, 0x04E0, 0x02), - 'Arrow Upgrade (+5)': (True, 0x0520, 0x02), - 'Arrow Upgrade (+10)': (True, 0x0560, 0x02), - 'Arrows (70)': (True, 0x05A0, 0x02), - 'Silver Arrows (Ag)': (True, 0x05E0, 0x01), - 'Green Pendant': (True, 0x0820, 0x04), - 'Sword and Shield': (True, 0x0860, 0x02), - 'Green Potion': (True, 0x08A0, 0x04), - 'Blue Potion': (True, 0x08E0, 0x02), - 'Red Potion': (True, 0x0920, 0x01), - 'Bee Trap': (True, 0x0960, 0x02), - 'Red Crystal': (True, 0x0C60, 0x01), - 'Egg': (True, 0x1020, 0x02), - 'Master Key': (True, 0x1060, 0x02), - 'Lumberjack (Head)': (True, 0x11A0, 0x02), - 'Power Star': (True, 0x11E0, 0x04), + 'Nothing': (True, 0x0020, 0x01, 0x0000, 2), + 'Triforce': (True, 0x0060, 0x04, 0x0000, 2), + 'Fighter Sword': (True, 0x00A0, 0x02, 0x0000, 2), + 'Master Sword': (True, 0x00E0, 0x02, 0x0000, 2), + 'Tempered Sword': (True, 0x0120, 0x01, 0x0000, 2), + 'Golden Sword': (True, 0x0160, 0x04, 0x0000, 2), + 'Half Magic': (True, 0x01A0, 0x04, 0x0000, 2), + 'Quarter Magic': (True, 0x01E0, 0x04, 0x0000, 2), + 'Bomb Upgrade (+5)': (True, 0x0420, 0x04, 0x0000, 2), + 'Bomb Upgrade (+10)': (True, 0x0460, 0x04, 0x0000, 2), + 'Bomb Upgrade (50)': (True, 0x04A0, 0x04, 0x0000, 2), + 'Bombbag': (True, 0x04E0, 0x02, 0x0000, 2), + 'Arrow Upgrade (+5)': (True, 0x0520, 0x02, 0x0000, 2), + 'Arrow Upgrade (+10)': (True, 0x0560, 0x02, 0x0000, 2), + 'Arrow Upgrade (70)': (True, 0x05A0, 0x02, 0x0000, 2), + 'Silver Arrows (Ag)': (True, 0x05E0, 0x01, 0x0000, 2), + 'Green Pendant': (True, 0x0820, 0x04, 0x0000, 2), + 'Sword and Shield': (True, 0x0860, 0x02, 0xD244, 2), + 'Green Potion (G)': (True, 0x08A0, 0x04, 0x0000, 2), + 'Blue Potion (B)': (True, 0x08E0, 0x02, 0x0000, 2), + 'Red Potion (R)': (True, 0x0920, 0x01, 0x0000, 2), + 'Bee Trap': (True, 0x0960, 0x02, 0x0000, 2), + 'Red Crystal': (True, 0x0C60, 0x01, 0x0000, 2), + 'Green Clock': (True, 0x0DE0, 0x04, 0x0000, 2), + 'Blue Clock': (True, 0x0DE0, 0x02, 0x0000, 2), + 'Red Clock': (True, 0x0DE0, 0x01, 0x0000, 2), + 'Egg': (True, 0x1020, 0x02, 0x0000, 2), + 'Master Key': (True, 0x1060, 0x02, 0x0000, 2), + 'Lumberjack (Head)': (True, 0x11A0, 0x02, 0x0000, 2), + 'Power Star': (True, 0x11E0, 0x04, 0x0000, 2), + + # Thin GFX + 'Rupee (1)': (False, 0x0800, 0x04, 0x0000, 0), + 'Rupees (5)': (False, 0x0800, 0x02, 0x0000, 0), + 'Rupees (20)': (False, 0x0800, 0x01, 0x0000, 0), + 'Blue Shield (Thin)': (False, 0x09E0, 0x02, 0x0000, 0), + 'Heart': (False, 0x0CC0, 0x01, 0x0000, 0), + 'Heart (Green)': (False, 0x0CC0, 0x04, 0x0000, 0), + 'Heart (Blue)': (False, 0x0CC0, 0x02, 0x0000, 0), + 'Small Magic': (False, 0x0CE0, 0x04, 0x0000, 0), + 'Arrow': (False, 0x0D00, 0x02, 0x0000, 0), + 'Nothing (Thin)': (False, 0x0DE0, 0x01, 0x0000, 0), + 'Master Sword (Thin)': (False, 0x11C0, 0x05, 0x0000, 0), + 'Tempered Sword (Thin)': (False, 0x11C0, 0x01, 0x0000, 0), + 'Golden Sword (Thin)': (False, 0x11C0, 0x04, 0x0000, 0), + 'Shovel': (False, 0x11E0, 0x01, 0x0000, 0), + 'Bow': (False, 0x1C00, 0x01, 0x0000, 0), + 'Fighter Sword (Thin)': (False, 0x1C20, 0x02, 0x0000, 0), + 'Somaria': (False, 0x1C40, 0x01, 0x0000, 0), + 'Byrna': (False, 0x1C40, 0x02, 0x0000, 0), + 'Hookshot': (False, 0x1C60, 0x01, 0x0000, 0), + 'Fire Rod': (False, 0x1C80, 0x01, 0x0000, 0), + 'Ice Rod': (False, 0x1C80, 0x02, 0x0000, 0), + 'Hammer': (False, 0x1CA0, 0x01, 0x0000, 0), + 'Small Key': (False, 0x1DC0, 0x04, 0x0000, 0), + 'Boomerang': (False, 0x1DE0, 0x02, 0x0000, 0), + 'Red Boomerang': (False, 0x1DE0, 0x01, 0x0000, 0), + + 'Full Magic': (True, 0x01A0, 0x04, 0x0000, 0), } + \ No newline at end of file diff --git a/data/base2current.bps b/data/base2current.bps index 9dd44444d33227ac5abf8cdcf27c031194e8e0c8..00911e4ea0b104984649b1e074fe0a91c66def38 100644 GIT binary patch delta 38 wcmV+>0NMZSw+QUF2(T&x1Cx(zvn>OX<^f8B!0ETZ=>a4%2%+Hpp^$$oG+Qtc;{X5v delta 38 wcmV+>0NMZSw+QUF2(T&x1C)OX<^f5A!0ETZ=>a4%2t$@P4r?-oz)o!tRsaA1 diff --git a/data/itemgfx/Apples.gif b/data/itemgfx/Apples.gif new file mode 100644 index 0000000000000000000000000000000000000000..53cb2725c786f1f09357f418fdac5beeff391675 GIT binary patch literal 268 zcmV+n0rUPxNk%w1VITk?0D=Gj`1ttv&^VaTa7d6axQHOgFc>H(C;$KeA^8LW000L7 zEC2ui03ZM$06+-Q01pTpNU)&6g9r&4Sjcd|0EP?`7F<}MqQ!~}2@nVnKqE#25(QGc zNb=&skO?84L^;ub$%YRZdMvOK;mDF2HFBI;lO;rv5m^cy8gik4qey!Sy-Cx6!;Azz zqGb9JV$P^dB~rDhGXMYp9Hka@S+c-Yu}jH*d`Yye+qZDz9#jcZ?g67nk18EX_o+&v zOc(m)Sy!vtrh;QaMLYL!Rhc;%8{GP_D`CTB&2IDxHh|=onXm4|x_7c;u936)Je|38 S%EN&RxBYoHsNJ^#0RTIp7HjeV literal 0 HcmV?d00001 diff --git a/data/itemgfx/Arrow Upgrade (+10).gif b/data/itemgfx/Arrow Upgrade (+10).gif new file mode 100644 index 0000000000000000000000000000000000000000..8b9c158b6fa60ee4b8643d4250a1b7a64c2f9802 GIT binary patch literal 260 zcmZ?wbhEHbRA5kGXkuXa0R$H;c62CcXlO7X0mYvzj0_Ac3_2h&kXi?hlMI|3G8zR3 z7@9bQwR|!R92lCpmECfFd{}U#n~jyjfMda8_huQ!2AK)@pN_>oUDwr`#%Gm4lNV)-EdP5?*#; zoyq1V*`GygLRLg@PKd3V`u57U^!s_GD<&AT7&8-tH2^Ky BV!Z$W literal 0 HcmV?d00001 diff --git a/data/itemgfx/Arrow Upgrade (70).gif b/data/itemgfx/Arrow Upgrade (70).gif new file mode 100644 index 0000000000000000000000000000000000000000..db7cff10e413caa30935be527090eaed55ef4019 GIT binary patch literal 263 zcmZ?wbhEHbRA5kGXkuXa0R$H;c62CcXlO7X0mYvzj0_Ac3_2h&kXi?hGYp&@G8zR3 z7@9bQwR|!R92lCpmECfFd{}U#n~jy@#Ey#(fNE{3STZLpacvTjoweu0B!`m|)T535 za9n=qJwYx1QH#ZdbjNP}%2zQf4KjRYa$Ej#nN`wocCnA3RBzOk$H5c5H##lN2ubmq z6BwVp23k6kYM@!THm8%ysT(qP>G z_jY*pqiu!0c1L#>tE6sDQa`M7`sap-y;ZxT_)cF-&N%P(K8>|&mfF*!!rPNnB?K6( E0f~WWYXATM literal 0 HcmV?d00001 diff --git a/data/itemgfx/Arrow.gif b/data/itemgfx/Arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb3656a47e778aa60ecf1e8f3a8a66bffed161d9 GIT binary patch literal 194 zcmZ?wbhEHb6kt$bXkuXa0R$TYCaic7kg-BTLxTYZ6o0ZXGBB_*=zs)3Y8^P*8MrxQ zJQ@xhXy)K%;|LH)bYkL`wv#b%P;_PzQRUjQLx6#ymtR?`M#G`uXp^dHQ;g-O1jl{_ z*?BoHHyk)Ki$yW+NMwQ9=^iU?rn@&Tr~A+G$UYY0#h~Up-O9SIW>#>@rP&@EKk;~p muDZG=X1i4DtV!9CiyU0}wsvk*y1v!5ch!=UMw;gu7_0$7m_dR7 literal 0 HcmV?d00001 diff --git a/data/itemgfx/Arrows (10).gif b/data/itemgfx/Arrows (10).gif new file mode 100644 index 0000000000000000000000000000000000000000..54f0962c9c7c48b9f0e560911f33010277dc92b5 GIT binary patch literal 266 zcmZ?wbhEHbRA5kGXkuXa0R$TYCaic7kg-BTLxTYZ6o0ZXGBB_*=zs)3Y8^PvGjMar zXiQ*WY~m2s^2so8U})x6cFXzkVZo7ZHg=u`GYXY~T6m;bERB}9Hi^hivZ)MIa-XIv zDI}oqK=te-CHtm3oP`PJn{*1h?wk}}=0Ddyd6&uqgO!(B_2(z0Lz_Bu!kkHA*2fe6i6@Jyq@LtDUE+y}q?}Rr&hhy@9{w&T3T{+&|R# zd)C?;mvh5sny-}VnKMlzc7fEvS8H-U6-6`6RBirtA~GX#O;7tQnc3ep!q?5|{FnRE KLj7O^gEasdNM>pP literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bee Trap.gif b/data/itemgfx/Bee Trap.gif new file mode 100644 index 0000000000000000000000000000000000000000..b170637305d17a76c8258596e291afc137aad247 GIT binary patch literal 254 zcmVeQY)SvHh8 zF{sI#2diq_`V{NXuo1~(oq5z^(z9*j%5@8OF3hNQ-?EL{bSB=FeL0qGNl_|Up*p$N z1$vdIW3hz|LiRe-C)&eb#|lP_(`wGijXP^r>{#pO%xO>mm7MzX)V)M0gU$Oka>9TB EJKv;givR!s literal 0 HcmV?d00001 diff --git a/data/itemgfx/Big Key.gif b/data/itemgfx/Big Key.gif new file mode 100644 index 0000000000000000000000000000000000000000..026b6ae55da2a264af00ffc814a19c4c738ebeb5 GIT binary patch literal 287 zcmZ?wbhEHbRA5kGXkuXa0R$H;c62CcXlO7X0mYvzj0_Ac3_2h&kXi?hCk&h%G8PF3 z4m5M{i}|c5XkcJuRPvg`!EoS6JGUg4&W{bsM>-j8(ypwS`1p92pu3UD%uNfN`(YI89?r@w*}!)ZjIVC4L)=m&uF6)9gLPWV{@fo#{0$zLit4B|UUPnEf@KpGBHs zD}8pxv1(t`_MIO*bythz<%H^ov+EWIUn4fnqRmlP4W7OVmAU@) f&Bf5v`^Rc8ExK}d&+A3^?nav2-{Z>6#9$2oeh77E literal 0 HcmV?d00001 diff --git a/data/itemgfx/Blacksmith.gif b/data/itemgfx/Blacksmith.gif new file mode 100644 index 0000000000000000000000000000000000000000..30b372d83cca376c6ee7b926c6e15e8cb87a8ce5 GIT binary patch literal 330 zcmV-Q0k!@|Nk%w1VITk?0D=Gj`1ttnplGm=_}E}zuwW=qaL6bqC;$KeA^8LW000L7 zEC2ui03ZM$06+-;01pTpNKl}Gg9r~6T*&aC009LGBup6bp+bfR4Gh>g00002AVY%m z$Z^2Mg$Dx!h*%LK%ZDrrs62`BfWwD4b6PY|v!Q{RKLdbF8Gt5Agc}b=^vINH#Dhr@ zVmv5vBEqUXdltN@Q-D#e8C!OJnicF#sv<+4En738NR=wFe$7}iYSX4r>(V5uG-iRO zekBH-YjdJlmsY`MOh_=X;-iiqAMLtR@<6VXD@*R1ne5}6WUaO&+}Oa*v}#RzW!sZ) z(4m7_x4jw?uF%w^3zzhWdL)37U-JStaF?lYj(d@sG_bTd0J2e&0}Tw=uj`{KW5Rst cG9u8{h705m3@ueFTG&>xex6vGF~fiWJLKkw+W-In literal 0 HcmV?d00001 diff --git a/data/itemgfx/Blue Clock.gif b/data/itemgfx/Blue Clock.gif new file mode 100644 index 0000000000000000000000000000000000000000..b60111ca48e4cea9b069087eda33c15f50125824 GIT binary patch literal 288 zcmZ?wbhEHbRA5kGXkuXa0R#;j0y0);XlO7X0mYvzj0_Ac3_2h&kXi?hrwp7NG9DWi z9Bk%b=P}@5XmDy}lD3n%VDONEkx44+4hO^IBV8;GLLnW6ix2h6i7UmNEK)u_nSqIA zM#siw4V{9F0wSIbDQzfnotwJKdJvzTUK3MN-nfMfvNMYl<)6u%p877jx4csBT9kP1sgpKm7j3ovVtDMBF!>Roz>zLrMnou4q=A$WCjv;R(56Cy3QwXG5cFh9p+#95i21SU%$QK4 zGPMYkB-Nz_9ahw;aDdkVTy_2&*mEPtjyF}RRd_alO`rypDm*H*u0)<#;VKoXR;}E; z2b~IjDwS;0!iW|nNT2~<5$^zO>KNF(CaYZNx$-+NC^<{h^{(xI>a(rkL1ZcCT91sBe~ LJF(NK0RaFz@k)P= literal 0 HcmV?d00001 diff --git a/data/itemgfx/Blue Mail.gif b/data/itemgfx/Blue Mail.gif new file mode 100644 index 0000000000000000000000000000000000000000..f82bcad36031d1e8077eba8ec2973be1be29fb69 GIT binary patch literal 301 zcmV+|0n+|QNk%w1VITk?0D=Gj`1ttvuuzbw=(u1gP-v(qC@25`00000A^8LW000I6 zEC2ui03ZM$06+-x01XHnNU)&6g9r;KTu6Yx!iNPKLM%W~VZ)0A1ZdodaU(~J4k;S2 zcv0g-g&s9Z6p7H_NtP{1dc+6-08N`EQz~>>V88&77Xt_l@UZ2;i9lZ(UCOknK$1ye zCX5KO=1P)QLGBz$wV}$40vguL`n98gtw?ju)C!TO$(}yr3VrBv~fadOVQl*xt#`4+0$k9jj+yzDtO z>eX!zDy)llDAC6;3%rdh_x9|ciVK=94Kd~Dt&s6{E`AnpMTk)+4*u(WU_byn%NKl} literal 0 HcmV?d00001 diff --git a/data/itemgfx/Blue Pendant.gif b/data/itemgfx/Blue Pendant.gif new file mode 100644 index 0000000000000000000000000000000000000000..acbecc1ad9a92ff7731424fd3bf4a376dff5a1b7 GIT binary patch literal 310 zcmZ?wbhEHbRA5kGXkuXa0R$TYCaic7kg-BTLxTYZ6o0ZXGBB_*=zs)3Y8^O!GjMar zcx+g3u$hHZfJ4Axp+l>HxLJ?KgM}{b9Nca!3=E5%+GGrsLNpdEX<%gbD$>z3TI|%v zBUv?tV^i|cW_`vJOLiD1o$og1efDI>CzVr-y2e>51zR*PE%0IwYRNKObZJhoGt=D+ zZ=Eb zJC+8m$u`Y8x6%0cyS3cni>}Sj+B-}2O>xrW{uIvtEj&|7ZeHlOT_4K3tN8S>IPJ}E zU)?auy)Zd;-&V=;b&023y3IswF0EsD=wAG}ceeS{!aYUxufK8cu>APaFEB1XZbrTX GgEasN|A1Nm literal 0 HcmV?d00001 diff --git a/data/itemgfx/Blue Potion (B).gif b/data/itemgfx/Blue Potion (B).gif new file mode 100644 index 0000000000000000000000000000000000000000..31364657dbdba8fe5d4b1b118c24a8acb96f35da GIT binary patch literal 320 zcmV-G0l)r7Nk%w1VITk?0D=Gj`1ttvuuzbw=ul{=xL_zKC@25`00000A^8LW000I6 zEC2ui03ZM$06+-;01XHnD6oLRg9s54TsY9+fB^^z5C{;!pn!`45*B!9u;9jr5D$U` zi4h~hiyRAh9LaJ($%_U7$egLL;X#QMH6k3@aiPPIKXL}&j#YYBZ{(Yk<;KmLR&vg~DFp*9u(m*3p*`OQC7t=@ z(a<*Q${t!5Ceqb$@zNcgoA1!mrit=ix_I$mmW8d>q}(?-U;sUtBllatDs;$dW+Bi literal 0 HcmV?d00001 diff --git a/data/itemgfx/Blue Potion.gif b/data/itemgfx/Blue Potion.gif new file mode 100644 index 0000000000000000000000000000000000000000..8cc533e82e55e92c879576683c89f886b5fab02f GIT binary patch literal 301 zcmZ?wbhEHbRA5kGXkuXa0R$TYCaic7kg-BTLxTYZ6o0ZXGBB_*=zs)3Y8^N}F>rIp zXiR80*vug)6k~DWK?5TPGYbR5fdviSOhQ5x85$l>I4 ziD081i;auiCMsC#l}JodKh&;KEwp3B>HM5=u9+uYXoAN@4e!>#TDc`z zpVj>4YCA7`lJ#-vwGCl==b8Nc_&jhc`_wj`*CsDdFJ)P)wD-43R@e@$zg%oQp&LRr z$ww!B_1?Vd*2DzqZFi$48{A`x;#JaH`Ek>=jZ@oa&7D(T^sL|Uy4YMENrUvuovrU` xW6hS{TVC*VSE<#dypv0}SO4~to$>DC!y`*Sm7V;)>B@s}ZfQN<>je%B)&RLse^LMd literal 0 HcmV?d00001 diff --git a/data/itemgfx/Blue Shield (Thin).gif b/data/itemgfx/Blue Shield (Thin).gif new file mode 100644 index 0000000000000000000000000000000000000000..2c9f77705eec0d26f77c07e53c83600f3b9903cc GIT binary patch literal 190 zcmZ?wbhEHb6kt$bXkuXa@#DvY6)yrZR%mEwFdzZNpDc_F3@i*fATf|y2aaY2P7WE5 z4G#`5GV^e`>?iiE{Mv{ONMM91PX~b_qXF literal 0 HcmV?d00001 diff --git a/data/itemgfx/Blue Shield.gif b/data/itemgfx/Blue Shield.gif new file mode 100644 index 0000000000000000000000000000000000000000..196c216e18080f2c80ff7f60367bf4fa56c262e6 GIT binary patch literal 212 zcmZ?wbhEHbRA5kGXkuXa@#DvY6)yrZR%mEwFdzZNpDc_F3@i*fATf|y2acHxoE$P9 z8x|aF<`CA3$tXC$z#yRP)$(G3qGP)ND+k8`!v?o5W}PmX&JB+oC#x7TUAS>^F~bBE zeY>6xqh)7jTNK|4dAT9oe}-~smW-9i3Xg@-)^#iapI`Vaax4CI#dGVbtE(e6XQkdK zNeEwOT>Gnst87u^GR0;))hLnNQ(JYX*ZFpsyz}0kWvup8!~AXZ-rCYtD%x9@pJ-sP F1^_#3O#%P_ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bomb Upgrade (+10).gif b/data/itemgfx/Bomb Upgrade (+10).gif new file mode 100644 index 0000000000000000000000000000000000000000..65e0675e323aeedeea0bc9a0d88e9d8b8ca85015 GIT binary patch literal 292 zcmZ?wbhEHbRA5kGXkuXa0R$H;c62CcXlO7X0mYvzj0_Ac3_2h&kXi?hmkgX7G9DWi z9Bk&`<%_UjU}$J%k+pK!5zyeu$Y{j2VMgF0mu>-Jy)Q2&Bpz<(@t(&s^TUGU)414U zL;^l0`A%Sty0=90^0QM@R3gPpEQ?jV7R$9Bia90n@JORStDCLIlyu+8zS(I|Om(N8*BmbpHC(rfuXaD^>N*)+qm?x|;>QQD?7<~OoYJ5BFS_AKU`^V+N| j_Gne2w@-|;>bsi`nV;81SEb+Gw!eGv+1}Cw2L@{Z{4;W$ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bomb Upgrade (+5).gif b/data/itemgfx/Bomb Upgrade (+5).gif new file mode 100644 index 0000000000000000000000000000000000000000..5c9439271e31458d46c32d44218c4501e92d5d9b GIT binary patch literal 296 zcmZ?wbhEHbRA5kGXkuXa0R$H;c62CcXlO7X0mYvzj0_Ac3_2h&kXi?hw+x&dG9DWi z9Bk&`<%_UjU}$J%k+pK!5zyeu$Y{j2VMgF0mu>;!usu62EOu_=^=o*M#VTHt`CIqJoSO3VNTWZio9w9#%L3bc-P5*MEl_Tl zWtn^GiicUl;U0}}zAK($FPye$1_p^#e^$A>*mL@_qr1#v)-ruv@y#@5 m_x8y_@3JK|<8FCXE-tH{`6Fg-c)Ir;-eP^n=giDZ4Aua7sBoeH literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bomb Upgrade (50).gif b/data/itemgfx/Bomb Upgrade (50).gif new file mode 100644 index 0000000000000000000000000000000000000000..7a5b9a3817fcf80444c60597be73a8b8478e78a5 GIT binary patch literal 291 zcmZ?wbhEHbRA5kGXkuXa0R$H;c62CcXlO7X0mYvzj0_Ac3_2h&kXi?h7Yv*nG9DWi z9Bk&`<%_UjU}$J%k+pK!5zyeu$Y{j2VMgF0mu>;!usu62EOu_=m0!j)^TUGU)414U zL=1$M_)KDsx^_fj!4l6YYN0_cGcPG$m~WY=70Xrp$YD9tLOGYrVim7t%En=`7X%x8 z=bERdsmvIMjfr$nQYk2O8 zO|!b9b$D$@`nx$fF(O(e_yR++C2o9Ae`c<#x`Yn(TSbH6i@{<0!)_v)+XR9}T{ je6?X_w0c;kwf@U9rLVv3dmEMX@nP>*E){PB1qN#XrHFH@ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bomb.gif b/data/itemgfx/Bomb.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f578fe69f1995ad294930f58eaf5550a8090702 GIT binary patch literal 269 zcmZ?wbhEHbRA5kGXkuXa@#DvY6)yrZR%mEwFdzZNpDc_F3@i*fATf|y2aZb&oE$P9 z8x|aF<`CqIuwYYG>uCa&~oGfouJ<(m9FpiP$X%pS=v zi##XutzA}g^XuxHy{0?4VrPqKGA;xvo6Cu{&m|(_X8v+_Up+ zW5ZmzORN8 zHZ^IKq|%u>8BYBfHEYJLPk|cLIkhTMt0r@nC3zNPQM5QU4sFZ!ZPK(@!KM@`GOSp# z2?Hne`c<%DuVAZ|#EaPA#;S1%Yn96tt7NGKAX21g(K6wheh)V0S@-T$nsUwBh5MIj zYNLGVnijkE=xVn&@zy4)m^Vz_uW>6rdo}UO+rDSZ6#6qZfY6?q`-K{Pvf;xF0|Ed$ D3G08+ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bombos.gif b/data/itemgfx/Bombos.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5757b083b7c83c99e00f7ff13d2c74994210da7 GIT binary patch literal 271 zcmV+q0r37uNk%w1VITk?0D%Ai_|Q1Gh#)8^C;$KeA^8LW00093EC2ui03ZM$06+-f z00#&hNKl}Fg9r~6TsZI`0003Z26*^TqQ#336%KGn@!~{^AU#IRD1abGkrG3G)W~q7 z0FWw2Qe@fiB}9xjV}67QKqE(<6>(Z5+0r0Fpgj>5Wtb3Y!lg!o>hwso;K`IXhaycH zH7ib@RA(Lqs#U62nLcfzEbF!E!k=w{(u7(w;as{*?cT-f5-!N6c>Q+7>Nc<0pePG> zWxEzD&8srQIxXoEF;%(}c0@Jbl~tnJ zq5b-iai$(642Nd;vRde@DtPMAWi|CtjYW}G<5C~jCf1o@DnZLVen++by81GBi=uJg z*Q#Kx#A9)?PHlI#Cf+{PQ#$SG%`&67xk{4jYoi4l9vq!x%IwfnWb$lx=xM&Cr@y^Q zpInrE-8AyY;+IFZ`?GQIO6NrFsS*CYwrY;a<%iAx`OQ7cVLl zSwJI0g%ne&T$%Bp$B!RF%ADDfpvRXmbHXHPlB3R_IcpZg2^6SMjS7=0U8)q}&5aSG zO0|fws;u3frhZNA-`7op$3 zfBEta{57XonpX9CeW-ORSH(UDOkGKptXav8r9K{b`RvZMT_dYKEYmX9#UDqGEwEW& q=b{(Ynnvw8XkyNV1@DbpV5M)BvpL=!ZnrPd+Np0N)eW~`Kma?5r+UKx literal 0 HcmV?d00001 diff --git a/data/itemgfx/Boomerang.gif b/data/itemgfx/Boomerang.gif new file mode 100644 index 0000000000000000000000000000000000000000..fed694ba29132c73abe1a4f70405dfb681b148c3 GIT binary patch literal 167 zcmZ?wbhEHb6kt$bXk=iRu;N8P#tID$4F(1V#h)yU3=GT+IzTo9NZx^?f`Oew#$&?+ z21X_(7NF=t$7T*ut&|f2i7uU@tTuOkd{}g(mDg14ONXI~W4Ds!sy7*dswaD-J^f59 zjS^4x7&%(WR0uvhHQ%9`tM}%lWdB(Lx##Xw24#9Kvze>sEBRH~bqV|2xVtkir-!f6 S-^gXdWtw?&AuBTzgEasi%Qb@l literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bottle (Bee).gif b/data/itemgfx/Bottle (Bee).gif new file mode 100644 index 0000000000000000000000000000000000000000..d16add0f83e10a2d8060eed30c28f886ff9468c5 GIT binary patch literal 277 zcmZ?wbhEHbRA5kGXkuXa0R$TYb|h#30Rs|H{K>+|z`(+w0}=zNb>O(gz{w%wQP6O( znS)m-=0w2)M+O09ry352MCV2kK{gJB1&bLvWd;3Y4j3dKnyjQfX^+Q&C$7_VeEVD~ z3sO!p8Vl#$$(WGtJ5?w8-;^1~FMJnyG)f)q2v+r-;pl6ZoAq(U<@t)UpKW{3QX25SJ%ziej! literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bottle (Blue Potion).gif b/data/itemgfx/Bottle (Blue Potion).gif new file mode 100644 index 0000000000000000000000000000000000000000..f9c1560b588cc5418d0a5af98a260c2cfa801dc7 GIT binary patch literal 287 zcmZ?wbhEHbRA5kGXkuXa@#DvY6)yrZR%mEwFdzZNpDc_F3@i*fATf|y2aYEUoE$P9 z1q}zAIe3L)P82L~WDrnxs^M@*bZ!)3&A4+SQ29t7lNw*b48bK03>wS@B9(%V8K&`S zM(xokPI2zgOBAc&Jn-b?6b<{lE0UiVxO8$vi`kyqvdDL-N7jsp+4583F}`SG+7$j9{GLy^WW%e8rs=c4zsK>z?ALX2ntqQZs(B}%ktAb`gJ8!2*R zsPUjjgeMP<#CV`2Mwcv0A{0PVK*EX?N#eX&pa6lN1bW_F`BLS?qX=0x40#l(0i^|Z z-b_d|rc{n4t48I>k>*UBS93ZHYw#yRvt*x+ClN6p)Q=NR&PmUnN)y1jvql1jvTnM v0kmZaxHiqxCs3iCTc>pkw}9NViczXIm@@Iw)qI^&Hd;8T;LJDm1_S^*Y^r?t literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bottle (Green Potion).gif b/data/itemgfx/Bottle (Green Potion).gif new file mode 100644 index 0000000000000000000000000000000000000000..bb443f2c05e6063a50eafcf92e2b78d8219580e0 GIT binary patch literal 287 zcmZ?wbhEHbRA5kGXkuXa@#Dvg3k4n%3^X(}7?6PCPZmZ71{MY#kQhj<1IH5vP7WE5 zf`)_59K1p?CkhrgG6*O;)o?f@IyZ{2X52XusC=Z4NsTXIhTxJ01`Xx{kxIeG4AXcu zqxNVNr#N@$C5qK>9(ZzciiUmO70J&FTsk?T#cWS)S>(Iaa;}<>#}u{mD}z^C?XhxD zc3vix{Z52SXocGp?YVt#Uw%#x*d}*XulI%U%itB(%O8bynLfPNDl*$`4rl0_m_uQ% z-%NYVKLj3Y-KqEN)bvlj41t2eD_)i=MleqB-p0#WzT(abyR-j%ydz577vx9YFO4-* fjl47~Ge1N&{PV5bnOmbubFP2Cx37YkiNP8GIIL|m literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bottle (Red Potion).gif b/data/itemgfx/Bottle (Red Potion).gif new file mode 100644 index 0000000000000000000000000000000000000000..3613a148694d09fae65747f6dddbc6b72a347200 GIT binary patch literal 287 zcmZ?wbhEHbRA5kGXkuXa@#DvXf`SbiAi#hG6o0ZXGBB_(=zzpPY8^P9FmQ6ncoZ}o zZ06tz^f*{O!ZA2}K4zH4s~NRN zqd3L6LoZRRhV#IalT$S8^R7sKUf|Nn5iMqWYRe+urIvHmd_1P8onINe+G>xLgR=87 zsqA+mTtX|{rfARYd;9WpdcZcht9rdJgkJ`)uwMQsw9EA2y;hOgZgV(8-^3gWbNy!8 zWBwuVSnE!`XQ!rr@?{7V6khSNR55~ag7-FF&hiy^R@j~W=i?nw;=Uk1@_uQonQG*v cS(*7Evf-a^-Ok(^Rho1C`@MY?%uEc{02jP%6951J literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bottle.gif b/data/itemgfx/Bottle.gif new file mode 100644 index 0000000000000000000000000000000000000000..477de6cfb88d30fa5e697c6eaa45072aa1acb189 GIT binary patch literal 247 zcmZ?wbhEHbRA5kGXk=jc@#BYvh6V!|DE?$&WME)o&;jv4@(vs)7+5)EJPaBRHgoU_ z#hfTu;K(4L>{P?ykm%efq8Zl`VQ}CG1COzqOy`Hku03+vO*tB$mNZP`wcO{ExpDEy znJU4H_Ec_Ma-@SJw$10~=XBqNO2vmtW`<~Ps=6p_zyJ1J^eF z<(jhkLZ9+^qpw+EZ_g}p?O#`$6{>f7ZQRRwN3u#*-(F_<^;)iVK-!J%p~?T=WQ8s9 vY3mo1&$ascE_g;Iqk-HRvGwsQ=2>%>d3@2jdC~c&7tbrPlBk7@j11NQpVniB literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bow.gif b/data/itemgfx/Bow.gif new file mode 100644 index 0000000000000000000000000000000000000000..18ee3d6ce3584914e3c7176c21ea8020b0f45843 GIT binary patch literal 188 zcmV;t07L&rNk%w1VGsZy0D%Ai`1tt9STHCkC;$KeA^8LW00093EC2ui01yBm06++h z00#&hAfTXtfd~fz03fhnfQJDJB3y{jAw-D-C=wI^G2%gm04zSlIFaE%ksbwVY{>EA zN0cNJ!u*&pqsf^iE4Cc@aplI27=7Zj$r30{n?q|FJX(`wOr<+hHeHw$WKowne`2+I qGHOthS9z)gt5qz~u13e|OnWx0RE<^PdOb>YE>yNnH$EL05CA(OYCzWj literal 0 HcmV?d00001 diff --git a/data/itemgfx/Bug Net.gif b/data/itemgfx/Bug Net.gif new file mode 100644 index 0000000000000000000000000000000000000000..2795115f6b93e6509ab49f3998f9cb6f34ce150c GIT binary patch literal 295 zcmZ?wbhEHbRA5kGXkuXa@#Dvi9VaR(I!;6wXlQ6Kz<}aU7DfgJRt6oA07$I^#~TK2 z4jGRP35^UK!b&C?0*VX_eDYo{9t)Hh8JV<_OgaP?JGIC9GNwh{ zi7-fV>9J(~vBYwkwqw71Dc{tc7oJ?$F3Gth=hYO|;3cKr_s(XAzYE-_c6r;`*=Db< zt!xxNG-btC_0XeX@j*E`+g@Mon6z20EXVSV^MD rAMWWX0Xwq)UJB*fz9Mf=1MfRtzXFSokM{SAo2;wJESk*7$Y2csFk*7} literal 0 HcmV?d00001 diff --git a/data/itemgfx/Byrna.gif b/data/itemgfx/Byrna.gif new file mode 100644 index 0000000000000000000000000000000000000000..439ad8289c9a06b2ac5ebd65c54e9039c6a272e7 GIT binary patch literal 189 zcmV;u07CyqNk%w1VGsZy0D%Aikf`WTXs9SCC;$KeA^8LW00093EC2ui01yBm06++i z00#&hAfTYZfddN$SQtPdLjV8@B6J8*BEp0M7FHB6Q2<1S4#{YAFdzUs$Gk#U literal 0 HcmV?d00001 diff --git a/data/itemgfx/Chest.gif b/data/itemgfx/Chest.gif new file mode 100644 index 0000000000000000000000000000000000000000..68e07985a91ffde7a3686744cd68e3aad44699c4 GIT binary patch literal 289 zcmV++0p9*cNk%v~VITk?0D=Gj;NalUs4&22Xn;UKFfcFx0000000000EC2ui03ZM$ z06+-t00{^jNU)&6g9ZTr5GbIbLxBnvGIZDw;=+Le0tg(yv7^9@88>$1_)#N9lOs!l z1SygvfsiLf%6!R^fJ>J!ONvy8vnEHL19YBTxiX?r07QurOvC&rBvSDMMow;&mPpAl~#=SaMtY{`sAlU{TxpsiJz z233kQEBLP0mu@vuZRzr?SDsuSfBh>N>QSv+9a{!VQ)gkFC-d5ET34;+igXi~-5YhT zS(2-Twnn|SZ^XoAGsbN^61G9#U#IGA+ncH3$zX>Q4JxeYu%kkT5Ep{P zxKU#P0w_}sSjloFN|yvOA~dj3BuS1p3nVPi(PIILHG%T%89=5$g(z$Gta-8M#-utA z)=WvDCCr*LrPkbPG%L-aAOS?2__3i+lRZODTuTwG*{(Q!h7B8+BtfM_%Z8jQw&Xyh zDhF`o3KObHs#L8Gc)2)cRIgtL`-M!ovRBDiEi-+)ap`2O7D0{`+SIPrrfSK$HGOwz z=+SIBHihfjr_ix=owg?Gly6Ahv~%n28#ZTa;Uf3W&3yEv^qu0#w}jdi^7Zxw0|Ed$*`bab literal 0 HcmV?d00001 diff --git a/data/itemgfx/Crystal.gif b/data/itemgfx/Crystal.gif new file mode 100644 index 0000000000000000000000000000000000000000..8492f4c7309c824a5f29715ec06e671ed83dc8e4 GIT binary patch literal 230 zcmZ?wbhEHbRA5kGXkuXa@#9BY>lOcul^Plv3`junCkrD30}F!=NDQRbfnzlTCx?v3 zh6M+kIe7Ub1QZw=+8M;ue0BshxH9r8GG*Kdcyy#$)UfEwkB^TJwX1kHrJM*}XnkH5KC??`^s>@s(_6s>LHz{A5WbArPM9TQdmF0GeabF5DZnL#9c_?m8P8vhLO#@5fmsQK2tg_e$rk`#L*(!}%4a ZKdZK8{m@Q6nz;SkS*x3CPBk!C0|1p&T4n$M literal 0 HcmV?d00001 diff --git a/data/itemgfx/Duck.gif b/data/itemgfx/Duck.gif new file mode 100644 index 0000000000000000000000000000000000000000..df8edbf33ff88b2df23defc5288b5d81df1b42e5 GIT binary patch literal 297 zcmV+^0oMLUNk%w1VITk?0D=Gj`1ttv$RJR#koa&g$S@EnC@25`00000A^8LW000I6 zEC2ui03ZM$06+-t01XHnNU)&6g9Hl{2oOM_!-o(R0+>kgAwq=$GHRp<;33104GUZ> zK%gXnhzd(S9KdpbLWD36MohRc07s4wCrZ5e5+=rt6g3J^*m3~Fo(3((T*|bmOp#4d z7QpF{A=R86r)IsGHL2E#8M%hdI@6~^p;U_=h3Zvh0ii-ywp{BKBvJ!P%R1f5x3Ay7 zfbl}4=~U{~noq@xagr1_S^*wq1F8 literal 0 HcmV?d00001 diff --git a/data/itemgfx/Egg.gif b/data/itemgfx/Egg.gif new file mode 100644 index 0000000000000000000000000000000000000000..b848c53c0088045a6a134419ff7e69bccdb0eca7 GIT binary patch literal 231 zcmVn!N>(gFvPGv#1bcPqR-j5(vQ4S>=-akb!N!GYRVvo1Q1N2z`?0Q5!buI= hL`-n6MxS?gmR#9YuK=%@1EWodc`Vw*X2}Kw06R^JSup?r literal 0 HcmV?d00001 diff --git a/data/itemgfx/Ether.gif b/data/itemgfx/Ether.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd3e7294f46551e7901e23e21757681704b81561 GIT binary patch literal 267 zcmV+m0rdVyNk%w1VITk?0D%Ai_|Q1Gh#)8^C;$KeA^8LW00093EC2ui03ZM$06+-b z00#&hNKl}Fg9r~6TsZI`0003ZN__ZGqQ!{-6b^6*5hKNqATI`ZsL`N+iXumLv`A6_ z!-gj*MnpN2Vo8`ZJ<3eUGNa3lF?rU^S@Y(?gdlAqeEAY-QlCZ{aui7vW7Me^KMGZ; z5o^z?cT);lw;C_d`+%}tCX%+j67Q& zP5X6aO2s%G50%UoZPlb(i;krX7PHvHoy~q`tX8yU!IT@9y?MCo<+cS|Bd+|@?b@1? R_r~7*cWL0odie$f06V?wZJ7W7 literal 0 HcmV?d00001 diff --git a/data/itemgfx/Fairy.gif b/data/itemgfx/Fairy.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f461512290bfe38e8597c868dcf23f428be6323 GIT binary patch literal 336 zcmV-W0k8f?Nk%w1VITk?0D=Gj`1ttnplH}&V6c$*uwW=qaL6bqC;$KeA^8LW000L7 zEC2ui03ZM$06+-;01pTp2mpXU0|*leEI9B$L52+@CNw~R073y6Gh#$IpyPmu4h;@O z7$5-00R>VPm{_ut5xAGL}^(*I@J2(3TfY3A3jbsIAHVXi5 zW}2GYO08;_K;PAFAG!|P)New@O9_5%I5BW-yjkPUWZY5Z%HJ+u?j_xua!KQZC02hL i)njtP+9w_re$3k`aJ}S-FMi25ec|)&heie&5CA*FVuuj` literal 0 HcmV?d00001 diff --git a/data/itemgfx/Fighter Sword (Thin).gif b/data/itemgfx/Fighter Sword (Thin).gif new file mode 100644 index 0000000000000000000000000000000000000000..a34335f279bca60394753b5168c9fc91077473b9 GIT binary patch literal 154 zcmZ?wbhEHb6kt$bXk=jc@#9B8#tID$4F(1V#h)yU3=GT+IzTo9NZx@Xn}MA}#$&^R zgNzJ9OcoIV4-Yjnv9QeWC`@u`li;^HqfwxItV2}4NakkXLyvyRz@(5&gGJ60byb5} zI1LvuOtL6`r8D!x63;#z(|dJj=XBJFMZS2{H`8u_MEeA2l|Fh%uu{kP%HT9BDD- z$&VZ_8muUDrOSjgEdscyvZv3PEO(atDKKYEi6I9V75Z~yfQv^5f<)+)qtlv8Z&nS! z^I*=dM3tfh8@8<3vrDZfk%lrY=8g5_2g7!UwEpzd4! literal 0 HcmV?d00001 diff --git a/data/itemgfx/Fire Rod.gif b/data/itemgfx/Fire Rod.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdde5d16b7f4d83d0de0662c42b827fd07de1fde GIT binary patch literal 215 zcmZ?wbhEHb6kt$bXkuXa@#Dvi9VZ?X6l~A{0R|XQ{K>+|z`)9&0}=qKb>Nu8z|A4! zu|T1*k%g0iA)w&lp*9|VwGs(I#Y0VuOg2+0CLU;DWOCyA5wT(M!O3j8VhuY2mpb%F zY46gJ*tGO$lM3&%8czk~(;aq}>)y;XbT~PaOI9wF^Rim-BEN}xr6-GDU7lrRT_<8$ zbRc9-Txr|WofDOgOm;jgWZSiAZNNO&-hFddl<3{u6;dDNJHs&R_`b+|C*D8i&*CN* JGcz$*0{~D?O+x?x literal 0 HcmV?d00001 diff --git a/data/itemgfx/Fire Shield.gif b/data/itemgfx/Fire Shield.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4a151c7d71d07676e3007d4027d4c9b2e2719ef GIT binary patch literal 254 zcmZ?wbhEHbRA5kGXkuXaalv9ohr$U12@MSm1|*>PlZBCifrUW_BnDFJz;T#?lS9U1 z!-9j&9K3uHCpIJ=ZebN?Vo+GH=xDb%GfMBx$WDlSvS z)WfDo3OAhYlUILrrBZn5`S}ikW_NaOR&}0i5WddjS5bopqltTyisgdL5Jo9=ySbU0 zwazhyhX?V#x{!EbbH?RWv8Sgw+}s}5YNWF2a>n^7365GvcNyy4+fe=Up6U#f0@q~~ x^O=@eep?^6B3RzsEy6;(VeJHV_cOB%8$!-iSkh)iZ6gIhndqmv3};o^oaJ^w{2 z43ieS&*Uy_O1XLIna?a?=SebALeG6$MBIdeRoD!qF&Sm z=&Frxk1vQSZ#wJoz3}=mQOl~Uzi)i literal 0 HcmV?d00001 diff --git a/data/itemgfx/Flippers.gif b/data/itemgfx/Flippers.gif new file mode 100644 index 0000000000000000000000000000000000000000..c1cc581452191cc3f4effcc45711c572511d04b5 GIT binary patch literal 306 zcmZ?wbhEHbRA5kGXkuXa@#DvY6)yrZR%mEwFdzZNpDc_F3@i*fATf|y2afLyoE$P9 z1qT|M*!YEFP6#A6Ffg$&FbI5nc(_wck;|aNAj!3tO}SSBa{AC?TgE=orux(vh%KdbbMYS^J$*jlXbi{JGnRUPAFY|`Dn@4Nj$%$ zmcQxui=8Z@yZha>3q}0azH6dB-oKYudi`8<*w4(vD`(ra%`14H_NtVZorS>~0M4^` A(EtDd literal 0 HcmV?d00001 diff --git a/data/itemgfx/Frog.gif b/data/itemgfx/Frog.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3c00a4e291394f1b2059ee9477e4901b0b20af6 GIT binary patch literal 342 zcmV-c0jd5+Nk%w1VITk?0D=Gj`1ttnplGm=_)u`j*kE9=U??akC;$KeA^8LW000L7 zEC2ui03ZM$06+-;01pTpDA0hxg9HyEB*?I!0RjXR7MMtJqC$uU8#)XSz#vDC073%z z*wFyTj2aax956tDO93oZF4TCyU`U$)6y7wjlcqz92Sp0ac@Strj{$(PjCpYB0D}`x z8aQe)DMgu3DN6NOljl&KU#D{IDl{w5vSMi(gjf-)fr=Q@rhG_Xs9gYY)mCkLkfcPd zB@@2AYJjCnr-z>oHaeH1(xq9qj&&?O0?%>uRHmI_PI7< z(Tapyqom3-m;|{51Qskh+9fRNH>W~yF+&?WX8{j`(V`Rm{Kif?3WbYL zPtuXsGI?3_j zRqBA|)m3cU|DAa$oPKax>fx}~&VUye7BR0`RbufyD`+m~#eWM$!~Jtqtsj!ocq zOj1$U{PgrpQ`f#bCnqmIH_y88(4QSe8i(c>#(IfVU49m{TyC40AZum~ftrg~1vCAh$Wn literal 0 HcmV?d00001 diff --git a/data/itemgfx/Golden Sword.gif b/data/itemgfx/Golden Sword.gif new file mode 100644 index 0000000000000000000000000000000000000000..54cd4a1397359821909f704702145e2bc0c04cb6 GIT binary patch literal 283 zcmZ?wbhEHbRA5kGXkuXa0R$H;c62CcXlO7X0mYvzj0_Ac3_2h&kXi?h2MnAXG9DWi z9BgD3(({^3y|xZV`LF z3{8PWuAK_9YD-QSJ9sroh3`_CxmnR`p-Jh!J&{wEo$W9zJm>RDD9d%Fn|RjV%D}`+ z3q*p=VrQ79Ml5vf^z-e$@-%Q#R(91=t?inz%~8+qiJrW=?()*G)OWR3A6F%;YFR9| zEIYXH`oV^oerIP*-{7;~A#~N&&d8U?Hm4ZBvfZ(Hxj%#D&A!k`t9JoAR+>)dsS5cT ab<^H;U#oUl+4Eid)OU;iD=l$gum%7`T5#w9 literal 0 HcmV?d00001 diff --git a/data/itemgfx/Green Clock.gif b/data/itemgfx/Green Clock.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e5a666ea4500230fddb3d9d2d6da5da23ceee52 GIT binary patch literal 288 zcmZ?wbhEHbRA5kGXkuXa@#BZb1cMU>5*ivB3`junCkrD30}F!=NDQRbf#WFyCx?v3 zh6M+kIoNp&I2an7TA8HnWG)yyY+zuN%DThB@c2jjA8F(-?ZPfuoG z;h52}F|DCfkWoOyvmwQ;PdM{l2xsBafY}z2TCt}>R-SCv<3FS$6|&T&%c?p__U8q) z<9()y@6Kplcz%6zg1uEp7I$6c5?XdMfa9h%3X^R&pmb0=Io-a)?W;-Uy@q=Yf0C3 h-8ZWX+s~D9i*LzWHm~^f+3ueuZ}(MyW@BNn1^~#2ahCu9 literal 0 HcmV?d00001 diff --git a/data/itemgfx/Green Maiden (Body).gif b/data/itemgfx/Green Maiden (Body).gif new file mode 100644 index 0000000000000000000000000000000000000000..6c9fad9934f9e0c41d37490b94ee5566e9ab3f47 GIT binary patch literal 313 zcmV-90mlAENk%w1VITk?0D=Gj`1ttn*g%NbFz}#gs8}ERoz>zLrMnou4WPy|rCjv;R(56Cy3QwXG5cFh9p+#91i21SU%$QK4 zGPMYkB-Nz_9ahw;Fo4$pTy_2&*mEPtjyF}RRd{xQO`rvoDm*H*u0)<#;VKoXR;}E; z2b~IjDwS;0!iW|nNT2~<5$^zO>KNF(CaYZNx$-+NC^<{j5S(xI>a(rkL1ZcCT91sBe~ LJF(NK0RaFzXT^Rg literal 0 HcmV?d00001 diff --git a/data/itemgfx/Green Mail.gif b/data/itemgfx/Green Mail.gif new file mode 100644 index 0000000000000000000000000000000000000000..793ec1ad0321c4b783388dc053c776e3272458a3 GIT binary patch literal 301 zcmV+|0n+|QNk%w1VITk?0D=Gj`1ttv&^VaTaJYydNRTinC@25`00000A^8LW000I6 zEC2ui03ZM$06+-x01XHnNU)&6g9r;KTu6Yx!iNPKLM%W~VZ)0A1ZdodaU(~J4k;S2 zcv0g-g&s9Z6p7H_NtP{1dc+6-08N`EQz~>>V88&77Xt_l@UZ2;i9lZ(UCOknK$1ye zCX5KO=1P)QLGBz$wV}$40vguL`n98gtw?ju)C!TO$(}yr3VrBv~fadOVQl*xt#`4+0$k9jj+yzDtO z>eX!zDy)llDAC6;3%rdh_x9|ciVK=94Kd~Dt&s6{E`AnpMTk)+4*u(WU_bynN;iBa literal 0 HcmV?d00001 diff --git a/data/itemgfx/Green Pendant.gif b/data/itemgfx/Green Pendant.gif new file mode 100644 index 0000000000000000000000000000000000000000..9db766fef164ecd4a2f41bb1de8f2efb343719a7 GIT binary patch literal 326 zcmZ?wbhEHbRA5kGXkuXa0R$H;W?U%nm|&oxp}_zHia%Kx85md@bU*?iwGJHr8MrxQ zJQgfC*vP^w=F+htp@D%*-mZjWV#ARxCQZGR8xw#^xmY=FteBvDyos5uBSte}(eZu* z&9s`88y>j#n&t}`L@rQqo~^*Ui)GhG6~>A3uFHHZLoyiVxn)PKk@)!X{B&_ozuFa- zSDc<1y7b(iSs#*v=OoS*YhAS=`~1qhN~Ts$hnGP!1FSdsbed>fY_7boCu_4{?ftop z!rV18BHo0~uWU?n^_iF*u+yZN&35)q<;azDjwjXJF4=VYSzI64ajPb+W WY}MM_b=L{)vb`%;YT}4w^U4kTR&r*&DFs`d?3Soyu_;Nv6f4^F zS(H{`!cAFuZe6Rjo35s76gShwiwBP^eYIxRrA%KIj+&5fRpm5kBE~uRFZ1b&DdRnC Od@p3+j12?<1OPk4+=Uka literal 0 HcmV?d00001 diff --git a/data/itemgfx/Green Potion.gif b/data/itemgfx/Green Potion.gif new file mode 100644 index 0000000000000000000000000000000000000000..591fee95f10c81123d7ff385a9dda295d7a6d4c0 GIT binary patch literal 301 zcmZ?wbhEHbRA5kGXkuXa0R$H;W?U%nm|&oxp}_zHia%Kx85md@bU*?iwGJGg7`QoP zG$u40Y~~OYim|xxpn;KtnT3Jjz=DQuCLy7Uj13QtwF~e!v2+S5AL^FjtdKcb;b^Gtqzd>*)!eQF!eYm=9!m$Ix?+WXriD{P0>UoJMD&nM#-vAH6U0QV zdQKFi9cPeF4AV*46|NMIk{2I zyZ7&<8FjxZs@-cH^ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Half Magic.gif b/data/itemgfx/Half Magic.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae039e5ba6d89651654e59003fa736a3993b0f1a GIT binary patch literal 301 zcmV+|0n+|QNk%w1VITk?0D=Gj`1ttv&^VaTaJYydNRTinC@25`00000A^8LW000I6 zEC2ui03ZM$06+-x01XHnNU)&6g9ZyIT*y!%LWKYTI4sz(VgZ5>BWm2pkN^PzAVY%m zI8k6mju#Cm^ypFKNCG7XW{iokKuZBMDHezrb0tiRBvYE)xly7}l{Q%_&3RH|Pm2r@ z4o#R;>C2!sQ9i8tQz}xPM{C~9ITUKm0cZyV2!NI;)RaDz%I&IiCS0x}mmalC7HLJV zf4vGGT=Q*Mom8#5#HtglSh-i}4%J%s?N-MJ<4VphjE zhm6OD1V$zn291~%1qT>fIh4KTXiQXaVw7N2Fwqc5Z0Kh+<8yhjVadr!O4dRrR!n3# z-mGoB>`BB%g`=~D{a?u_6h1#WQ#^Io5=r65KHaX-`$8&9Rt7Keo!G=zZQ`x|sueUXFmch^EaS{u3*2tb6a6K$?$T0IPBs<>YXIC$Lx%tW literal 0 HcmV?d00001 diff --git a/data/itemgfx/Heart (Blue).gif b/data/itemgfx/Heart (Blue).gif new file mode 100644 index 0000000000000000000000000000000000000000..ead09923bcc1bb5bf529fa10cfde8284796b19e2 GIT binary patch literal 146 zcmZ?wbhEHb6kt$bXk=jc@#DvY6)yrZRxmIyDE?$&WME)s&;ha;K=KY8$qeiqG9DWi z9BgJ`)esR_u<&p@m!Q|2hyumK3}VJy9y>N9x^yWxcgbW-eC*!J%gFGdV&fBrZvIH6 y63b1?&d#xRXraRl3DY#6okkkoy@tv2-mEA|c3mc){_Be8)>j7_7_0%)bTiQa literal 0 HcmV?d00001 diff --git a/data/itemgfx/Heart (Green).gif b/data/itemgfx/Heart (Green).gif new file mode 100644 index 0000000000000000000000000000000000000000..b9cdc4b0dfe51e2537a18c5d475f1db7dfd42eb8 GIT binary patch literal 146 zcmZ?wbhEHb6kt$bXk=jc@#Dvg3k4n%3>X*~6o0ZXGB7YR=m6OaAbAIlWCnH)8IKJM z4mPu}YKRCdSa`UdOVDdhM1kUA1~FqUj~yElUAh#UyJRvZK6Y>AWn}nJvGEB*H-Ds3 yiRGqcXJ=a!w=MZuw9sLOglU@3P9qKPUc=;hZ&s8fyDpPY|8>Q4>#G9|4AuaI%rh|n literal 0 HcmV?d00001 diff --git a/data/itemgfx/Heart Container (Blue).gif b/data/itemgfx/Heart Container (Blue).gif new file mode 100644 index 0000000000000000000000000000000000000000..3fb54bfcb954be6943723a1e1216ce9b9e8e791f GIT binary patch literal 232 zcmVCMz{a2h;(^pUaLi!f z<&cS3aNs~Q3%6EGhk@eZHa0FH1%m~T8k%^yxda3hfJ!A4vqS`p79Z;6=l7c9@o|yk zL{__LK05?c8~bF_xpZcHRz1?en)B~YrE$Z#7U6KYSj&x%0vBnv+qp&rEc0LGXj#Ql zS-Qk`j@xcMnctJsZ!C0Z^*U=My2@!w+H$=uJGVFl?PhspwspnyrI%N`L~fhnEtcrO GU=08alO~U{H literal 0 HcmV?d00001 diff --git a/data/itemgfx/Kiki (Body).gif b/data/itemgfx/Kiki (Body).gif new file mode 100644 index 0000000000000000000000000000000000000000..39305489586cb0de33119022262fe044c5ae164f GIT binary patch literal 238 zcmZ?wbhEHbRA5kGXkuXaupnc@gdaB&5;i1g1QeXm(9mE21I3>#j0_BH3_2hlNUa0M zW(Hmk8IKJM4mNWLYsF-2XgJ)?qU1H_MZiL5ph}({90w9z+L>4?rbJ9!cycn2`!t`( zh9t&b#w4}^&4Sc}?H0wiTuyFYettfC`M)EcmzNx#Av{^g!OKCzu}>?WZ-#`C%Ee`@ z^Sqv}*q9wY*RQcl)_dEUo0~I^wy{c;zPZ{T8TcwB>PiyhvXbfNj-0xr>NC@|)hV|# mRQc+v@Z6%i5e&&8t6LtL-MMA4`1<;Uw@qhfPD^)Sum%7fb6y(& literal 0 HcmV?d00001 diff --git a/data/itemgfx/Kiki (Head).gif b/data/itemgfx/Kiki (Head).gif new file mode 100644 index 0000000000000000000000000000000000000000..232f6c86fce7f666a35296f2187ef057f1a813b0 GIT binary patch literal 279 zcmZ?wbhEHbRA5kGXkuXaupnc@gdZCcGy)1vXlQ6Kz<}aU7DfgJRt6oA07$I^#~lW4 z4jGRP3l27OunH*%ELeD$Q9xPG$D%-yfq{udrzJ!1fLkYvfZmxIA0N3+QnB}2GNWMO z=?OZ#eOFF=NOWmuv^X@y^Fh+_$xID(S0sZUdQW$qtQBh|^5oPK{X(-IkJ1B|n~jal zVl6~fj`k%~&$_c~^8=sB8HSfaBEyz=PtoY#7VEWr-QC?4z5C8&Z&?+(q-3Yp*XpmU zy;oZP{b#ynYg%}RMdvmZf$0pP2d6(5dUGRUx&P@n^?Es5u`Ma{mNasi?v>Dfx*#)r bbE=P!Zp^IZ>glc8+t=MWRP&jQg~1vC@Mvz* literal 0 HcmV?d00001 diff --git a/data/itemgfx/Lamp.gif b/data/itemgfx/Lamp.gif new file mode 100644 index 0000000000000000000000000000000000000000..a48c95be9dd4b0f52bb46f44fb10900408685426 GIT binary patch literal 286 zcmZ?wbhEHbRA5kGXkuXa@#Dvi9VaR(Ivx}hY|sD!1~5?k$->CMz{a2h;(^pUa6D$< z<&g21kkHu7%B2;f@j;=nT|l01hR4T;j%{q*3=9n$8XEeU%;b0k9w;4ald=?>5Fx1K zIa%Gf?u~_U;+Y=V;#V#epBH%aGb#P6$=v+ht3zZmUqj{Q2M7CIX6xPY+^XT$F1UG< zPu9g%hbF2PUt>8vWugC6dHFmUscSFJcL?ux%Z(~s9x|oW`rh1A#qUEG6#wO`(P~Ib zTwn6}mG7F;?9-e4`pw){ZF%i^G^AI^^p4?&`}14uH?{sTRZZNQeNsv9ud(iti>sCQ iFV)$eduDUQ&Rtt_MT&DaPvX>A>hWuRej6hrgEat8lXb@c literal 0 HcmV?d00001 diff --git a/data/itemgfx/Locksmith (Body).gif b/data/itemgfx/Locksmith (Body).gif new file mode 100644 index 0000000000000000000000000000000000000000..9dec6d2feb2676dd2d071a03b0a651bbc914178c GIT binary patch literal 311 zcmV-70m%MGNk%w1VITk?0D=Gj`1ttnplGm=_)u`j*kE9=U??akC;$KeA^8LW000L7 zEC2ui03ZM$06+-*01pTpNU)&6g9r^MT*$DY!-WJH5+I;(zyJXP6i%F|5Tiwn6dPI` zIY427lLbtotVnXCLWBYzHiUUVApigyL&|iR^QOv<85af^8sMbDp$;*sG$=FTLz+;d zO5OPsrcInWsVG=P8s2`K(#VPs%nVbB4Ifz++pD4knz~C z;9xTcyGG234GRyqvWT*AEC^_5XlK^(TT@Z^@ED_@aoLd<7Zy3SFiA2oG!&{HZc*{> ztCFo3||`D9`N%J%bk$K2W`!d zlYG`h=-)XOy*O^^s;L@L>nxRxL$WU`UptrD-sS7P?aQ-EbK2uV@BYlWJ!f$^cY*Yl X%}EP_r1j%|P1yQ)PjD|A3xhQPk?eCq literal 0 HcmV?d00001 diff --git a/data/itemgfx/Lumberjack (Head).gif b/data/itemgfx/Lumberjack (Head).gif new file mode 100644 index 0000000000000000000000000000000000000000..d607b9d8b394d0da2a7428e4bdb25bd8ca945d7b GIT binary patch literal 332 zcmZ?wbhEHbRA5kGXkuXa0R$TYCaic7kg;M%f(8&UfPvyq7DfgJHU=FK52V(C<39s0 zhm1!+LSr)rzgUdLhlBhpuB`Q`m~XQUhS{AW1q6)Vju)lBHF ze){eT*H+c!V`=i@(>h8UB2Ff92OO&u&Iz4r!kWA#ro7O7Ml5@@jPH*x$2O%k3aR}R z&bzSCQCQBm;<{erru@g}Lf_2Jym@!qQmruW2O9Cu&wkX4zqxrw(a}svE#5bw=9dn& cpG_0|pR;3I`TqV&@1Ojy7c&bTl(^ME-NRk_L#$KD)ivzwHK$S=s$HjDlMAkyOrrblU$BKw%fth z^+vuiThsz}#HHT5leOjb!)Z}dyJBNLXy4l4&8xnQyKLpt6EbJ>*s6XNz3LY|e97f( zS+>`Xpw4q^dP=rGo3zWAeTTNu`&+lQe_OR=-B6A0J|;N3glnt*!_&#^>?{n{0E6>+ APXGV_ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Magic Mirror.gif b/data/itemgfx/Magic Mirror.gif new file mode 100644 index 0000000000000000000000000000000000000000..e71a088a7b30b967bfbbf01751213203f25b70e8 GIT binary patch literal 293 zcmZ?wbhEHbRA5kGXkuXa0R$TYCaic7kg;M%f(8&UfPvyq7DfgJHU=FK52V(C;}ruh zhm6OD1qYisxJ4um6aXa{nQUq#J|-S!+tFV&cp(kz525s{!(7C-{Q9gU^ugJ|O&L(+wv(!rEJUy7LzWW)^ nPOZboIuqscW^8|Vf461z?Wf(-pJpEn5xneXcWeFS1_o;Y=yZ3M literal 0 HcmV?d00001 diff --git a/data/itemgfx/Magic Powder.gif b/data/itemgfx/Magic Powder.gif new file mode 100644 index 0000000000000000000000000000000000000000..d805b2645a3349c2336cb5ef30f74a3fd56292f6 GIT binary patch literal 317 zcmZ?wbhEHbRA5kGXkuXau_53`!-gFR8bH8+1QdU=FfuT(FzA59Kx!R0{xfiL$arj6 zaIl$;orgofLD9LDNr@|fgTcY2OH7?l;Khc8hZu!a>tr~MmKdpM}~C zJqGDXsUF`}dd?2-O*5?$)VR4x_42bVoLk?W>dCE^-)(2k!e6}6TNYec)hevL zO{?s|!(&xn*R8D#Srxc0x%1YOT|Za*?eVQY#WOo3IrD(*{aL)TuYb63-Kcfl)Hi{v zk8NM|*zBL@_hlDW?B0EAZS=0Kx%(FE)iafgSQ$V4Oto@7pVZg5CAFO5vANejB`xk} LG=P8s2`K(#VPs%nVbB4Ifz+-KnAknz~C z;9xTcC!d7Ef`tvO+_H8u6ABVs7#W#7?z}KaKHSQtUneu6F!9(V73PjP5gV7DZqjCC zu<$f)@aa@YG%DF4^yu6~3r)E*JB?Nxn4>>gE0klR=B4T4wnax)OiVqrh$$uO>Zy+} zFU}3BW$TUlnt6VTn*TCe=_2);vr_MJ`M$dR{L=1<&#&%UZ&~TO-~0TgR<3PY$2S!J z_L{1OEc=2`qUbMyL(%Tm@F bZA-rr@{nn3*Mt`@uf%a)-_W literal 0 HcmV?d00001 diff --git a/data/itemgfx/Map.gif b/data/itemgfx/Map.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8b90b4749e4695b035aa442d8e2b358bea349a8 GIT binary patch literal 313 zcmZ?wbhEHbRA5kGXkuXa0R$H;c62CcXlO7X0mYvzj0_Ac3_2h&kXi?he+--)G9CpD z2bMw(**Bd>jF6*r<%RM?zb?-Bi?t+x#J95^4TVuWP(ec$b`dn;1rW+m{3O*bq z+hDQ!?EJdh@20G(&_1-ZM^ekJO0YP1ZPwgrvJ-+Iq@BoYue$R3O3~{R#dGUqUQbNA zb15XdT}@jd|JkYh_{~Rrzc08utK#WAQ{P=0-rMVq>*I3wtbc!G(|kR(oQi^wBaDm; F)&P?9fYAT| literal 0 HcmV?d00001 diff --git a/data/itemgfx/Master Key.gif b/data/itemgfx/Master Key.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c4d950a07921541bc6bdb78a4c95a0e91b3003b GIT binary patch literal 256 zcmZ?wbhEHbRA5kGXkuXa0R$TYb|h#30Rs|H{K>+|z`(+w0}=zNb>KM4z{w%wQP6O( znS)m-W`{sx15ipr#9`wi*Dfx}EFX&pitfD%=4Ct$g$^DQ#kHksUR-?Q$)wF((_(ob z>DY8$%WEP9!pl9TsZ{RzVp;I$=nUOXt|t*fi6jI(zez u?%B028^5)#nUegtIce`U74C5L^liEJ&3&4)a_{e%$Uptvn;$6-4AuZ5v0}^s literal 0 HcmV?d00001 diff --git a/data/itemgfx/Master Sword (Thin).gif b/data/itemgfx/Master Sword (Thin).gif new file mode 100644 index 0000000000000000000000000000000000000000..f576631311faf7ee8bd169b931870d89b450d920 GIT binary patch literal 180 zcmZ?wbhEHb6kt$bXkuVk`u|?>l>cijL4W}XDE?$&WME)n&;f~o)H-lfGH`OpXc#y! zG;y#?u`nD+aBAX~maB=lu)wuTRMP5*M4|H0K4DHi355kqPEJ-9j@om=u;JJQe#ayg zh0RY-&op)IyK{2#@^ka73lII-QKWHbj$y2qNY&+MLCfVPo2gobz6xFyzSb=?(nRsX UdS;eB8_zI@Q;iAd*;p8?0Z)iJ7ytkO literal 0 HcmV?d00001 diff --git a/data/itemgfx/Master Sword.gif b/data/itemgfx/Master Sword.gif new file mode 100644 index 0000000000000000000000000000000000000000..a730f0877adfa046be04f518afb04900cc7a9dab GIT binary patch literal 287 zcmZ?wbhEHbRA5kGXkuXa@#DvY6)yrZR%mEwFdzZNpDc_F3@i*fATf|y2aYEUoE$P9 z8x|aFWERr$so0>{*utd5#UbFZh@p*DnCZre!bF!IK0&?*Hv%8J^>BMO@w^mRCC*Q61_iWfT)G=P8s2`K(#VPs%nVbB4Ifz{Ab|gP%&8W zprMgNSjnWqAn_mrBNvyzfeniecJeEmiOdLG1XRlCFvmhr{}|H8&mzKX|gl$I&4w9I72%<&8Nyl>)^By-K?jY#%YcV z6BrGAc3oHzv?ycxJeAj%b37L+Uv$cy{U!I#cD3$Jy3x~@1Wzhn8~4;Ibn%13;j5L> zR{k(>Zf)J_bu4Q}Uc)R)Uzfkzz3cNKv%Ww2g)^5%T3=r+wJGx2Vrlo@oC&X!R!)(x NXWgzPSLncC4FI;ufUp1n literal 0 HcmV?d00001 diff --git a/data/itemgfx/Moon Pearl.gif b/data/itemgfx/Moon Pearl.gif new file mode 100644 index 0000000000000000000000000000000000000000..4622e15445aaeecdb1f8ce88ea9677c20bc5e9b6 GIT binary patch literal 260 zcmZ?wbhEHbRA5kGXkuXa@#DvXf`SbiAi#hG6o0ZXGBB_(=zzpPY8^OEGH`Opcx+g3 zu$hCCDS|_x;cz>jB$J0l!NUedCL^u}iHV9wT19l@WE6}ZpO~nixhh6d$ic0TU$rc! zvT)(C+0x86uFROE%GfDX%O$%?NW*!NeeAOq&dtvc&egY+inaKx+0ZRnZd5y?G|6dV zL}A(5m!(TxHmNr&#h%`__V)II<@VlBH&o?ThR=ACuN z`)a}c)e@{f?%w)p7`ZW!)7qEEa!tg<*=v`z=6q7|JlOA8ZYO(ddCZO+W+nz}05?=$ AVE_OC literal 0 HcmV?d00001 diff --git a/data/itemgfx/Mushroom.gif b/data/itemgfx/Mushroom.gif new file mode 100644 index 0000000000000000000000000000000000000000..b533aeb705a36032187e59cae442d8d40273016b GIT binary patch literal 287 zcmZ?wbhEHbRA5kGXkuXaalv9ohr$U12@MSm1|*>PlZBCifrUW_BnDFJ!108ElS9TM z;6Xz(2ftX1#fJqA?MyOGJPsR`j<$1(d--SxE^=oSGgMNkxS-_9pb2YTy3mML|=n7tw`MF6UV6s@Q*xt_ImqC4o>a#?CZc6r_=~15d#WNw> zX`aQ_B2$UbC0FN2_VS&`5_%OhDcg5hNaV$r(VGI^-fMkbmVb4V{MUW9*2OPkSIA8a z(#^W66}>rmHv*!HGxMgED%+RZT7P@6=NK~+gEau7Vr$0$ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Ocarina.gif b/data/itemgfx/Ocarina.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff68f9244fc3c7c6099fd4bafb6ce62da5ab12cf GIT binary patch literal 274 zcmZ?wbhEHbRA5kGXkuXa@#DvY6)yrZR%mEwFdzZNpDc_F3@i*fATf|y2af9uoE$P9 z8x|aF=HTUvuyAN-U;rv<;3!;pxRr}N;Eu$Bg~$7u4CJ$T!z6~2{Z_@F-gs_V5jbDhG>FAYWTEd;A#JVHS%uF}&R59fYB{;_ z$(d!W8=X>K1!VcJiEG`ZGE3ymt;Ge8PtEn-ur_R)XW=`W(;IS*bc)R1mm?vh^C6B-&C3`junCkrD30}F!=NDQRbf#VDVCx?v3 zh6M+kS=f0P7#tcHS~&!@N=^tUHFh#dSe2}pka(0)+SshdLgA6?1jXPYoy<*3y_+RO zqo#OnUgj`MTX<23ghGQ?yKVBO8qX~&0w=Caza>DfajZ@vO|BmW>GxVQt-~5iHX40mH&FPngO#gm<8F;ww<*8}X H0u0sw{7`0+ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Old Man (Head).gif b/data/itemgfx/Old Man (Head).gif new file mode 100644 index 0000000000000000000000000000000000000000..ca34f42a386909b9f4b83cc40608cbf3ededcd1d GIT binary patch literal 313 zcmZ?wbhEHbRA5kGXkuXa@#Dvb1sNL>G=P8s2`K(#VPs%nVbB4Ifz{A1wcknz~C z;9xTwI}Zbc!$Jl|MkTKl55WV@tvsS!M{X1xINYzG=+(n9Y4NcpKGu*J&ySB7S~x|k zcwT-=In$--{%Xz*!RMzNHAUS-v?i{&IG@A!RLm|D<)9gcGwoV;1*)Bx%j11YWyP0Q z=NNe0ca@yFxbpgXSMea5nV%Fr8FL?=6VWzbcD-Hn<*t^fZBN~&nXP2=vzof<;o+vG zVs3k;q@6vgv9|6=*2l+}X3O4vm14OqIdt>n{cTfk?0k7^XGY~WQ{JfJR}8CDx0US) zUVV90`O~aY*@XO*>CWsuHd1p6-tAeU>wIkOq^Dl@Yp#Z|a8_6bZ0(wP&(7vYLU|)2 HBZD;nnudX1 literal 0 HcmV?d00001 diff --git a/data/itemgfx/Open Chest.gif b/data/itemgfx/Open Chest.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ad6c64a98c2fd6466baa8ef9afa456456c76299 GIT binary patch literal 236 zcmZ?wbh9u|RA5kGXkuV^@ZiCP6$T9sKu}>|V88$aIv@r}jRVI{22Ktcj|~eBHnTA@ zIGp&fz^RF!lV^s<#zn5(Ov+q50uBor`V}m@L^y?>9P48?HH%qk^yuhxePcbJl^d3w zoo!JpBy)1}^7Hcqin(N?j9;8u%o26ZO8QN5Pa*WTMJ@jHq2jJf{9?((Zzdbdhf hhcl&=+dYf=^!WTKrbA}yR{wl*{``DPd0q|%YXIE6T_ykk literal 0 HcmV?d00001 diff --git a/data/itemgfx/Pegasus Boots.gif b/data/itemgfx/Pegasus Boots.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c2503a2c32705845222733a27894276b8c38cd4 GIT binary patch literal 286 zcmZ?wbhEHbRA5kGXkuXa@#Dvi9VZ?X6l~A{0R|XQ{K>+|z`)9&0}=qKb>Mi+z|A4! zv0=f%W)5B<1%m|(of!p`tz33)6 zr{u7?(Q7}cIBd!YSjU{5W|F;0&3C=y=~*V$Q&!&Hl{fX(-RjWv`+Fmj_xicAhGKB=5+<1%e( z(J*%Kn5@lz??^=Pa_=cticGRzTVD9hVd?MESrPKoxkI@A*O?uG4rlw#^p#RqO-&D7 z6Ws2{8$IRq18LPm$K66G_68T~B{se(Pc``)t3xW(o|}0CmA+9{>OV literal 0 HcmV?d00001 diff --git a/data/itemgfx/Power Glove.gif b/data/itemgfx/Power Glove.gif new file mode 100644 index 0000000000000000000000000000000000000000..81752b3d652f111ee2d8629fd341f2585bf39847 GIT binary patch literal 317 zcmV-D0mA-ANk%w1VITk?0D=Gj`1ts^xX8#@FnD-~C@3fZ0000000000A^8LW000F5 zEC2ui03ZM$06+-;01F5lD3AaFf(8u|T*$DY!2tsTNDS~WB1Hlc6*?pUQ6j{I7$=G} zC_sS5h6O5iyjZfNK>z?wZWNi3qeYM?3x=%uF=0uVKx5jJsZ-^EiZz4c%!x1|M2Ia- zCSE z*QP7cwp5#U@xZHHC(B0t)}q{}AVr&X3LG?F*OqUSy(w6)P}hEY%N`7!>fgD62O}m8 Pb@o)ohQl%f4F~``Ik$uA literal 0 HcmV?d00001 diff --git a/data/itemgfx/Power Star.gif b/data/itemgfx/Power Star.gif new file mode 100644 index 0000000000000000000000000000000000000000..89b7b948fd58627ed777ab1d851783d911cf9eda GIT binary patch literal 278 zcmZ?wbhEHbRA5kGXkuXa0R$H;c62CcXlO7X0mYvzj0_Ac3_2h&kXi?h+YFo>G9DWi z9Bk&`<&$7waA;^}6jRgLA+YFZ2eVw*9u0?vBhAvfWp6Z!o*eJwl4P>zEL!M2l~?{4 zkHO_f-qTo|<7zA}J#Ogat}Z*`sjwnokw*7FpHn4?hi7_3?^;v&QPpX=|H`~8k&`s8 z&lRY4J3CV_=lW8I(_MQjzr8xU(d)j^T<`0-cb7ywJa?2!^lfZoMDDM<)>joHRx9ME zP0gIK>e%dtL_5(xH{Jy7kJnDVQ+ac3?xxws VfU6?xcfS1!Gl|^E%*@1K4FLZ{aJ2vc literal 0 HcmV?d00001 diff --git a/data/itemgfx/Progressive Bow.gif b/data/itemgfx/Progressive Bow.gif new file mode 100644 index 0000000000000000000000000000000000000000..b61c67f84addef5f0805037fa9796418460c9f58 GIT binary patch literal 308 zcmV-40n7eJNk%w1VITk?0D=Gj`1ttvuu%Abu#l+exL_zKC@25`00000A^8LW000I6 zEC2ui03ZM$06+-&01XHnNU)&6g9Hl{AV5H&!-WhZN>msi07Z)h5E29c;NnAx3>6xD zSW)4C0U`%-6sRy{#)A)II%HX(qRjvtQyN@ZkR(QzItQ9OiLxd}o-`-EM5s`JfS?H> zLe)r>rp%ELK@#8yH0I5q3XvN47}2A{l1mSYHLH}WOtVqj3N7H&so9ikrKZK|^yJi> zdaI7z3zM+m!-x~VH9UB6%8NGv$JM$OKv$n=lQxV=xvWvRbMvo_abe zTDgb;m(J>$>D$b6Vb3L66m4GJP3zu$`FnHf&jtLZVq|2n1_1mYbM*iK literal 0 HcmV?d00001 diff --git a/data/itemgfx/Pseudolamp.gif b/data/itemgfx/Pseudolamp.gif new file mode 100644 index 0000000000000000000000000000000000000000..2eb31420820d5dc63f78e173e2f73e5380a70b6a GIT binary patch literal 286 zcmV+(0pb2fNk%w1VITk?0D=Gj`1ttvuuzbw=(u1gP-v(qC@25`00000A^8LW000I6 zEC2ui03ZM$06+-i01XHnNRVKGg9QpITqy7$frk(u3YbXo;X#H53jhFsu)u(i12!HE z5a1%lh8j5*kXR8SNs}ite(X3iVa$vjbLvER^PotN10w!>X|v}_h!m3wfO)gv!H-0n zF5F4AC`N}7v$9NT(W=6cC3DsU%aox{l^-8&92(Z>&xjMdMr~Skr&N@6JKmkjbMIB4 zbNvo{I)G+juXOY3O{{fm%d$?7Hb$zn>q*5_jS@B7G4S7?gg>%{{52(EwQI>DF8wnt k#L=rGzojgB=B&hMv@&_S_~O7Wz3fh6#@VdaUw+mJ9{d8`LL)_0XugdJv#KH%%xDH zT70Rns@1DlvEszo@}f_!7IT^usFNp9vq{sUUE7rG#gPm-#*Nuk?8}l}Rl>B{wm{aa zY5!WiOLrzsyoUP#t%@+jT0oZUDKr3%jmN`Y>XbPJi#MD!e37scEH7b-Fk(W8QgVu8gjDc=XG?Z#q@Z Oy=e8xlLZC=1OPkC7Kar8 literal 0 HcmV?d00001 diff --git a/data/itemgfx/Quake.gif b/data/itemgfx/Quake.gif new file mode 100644 index 0000000000000000000000000000000000000000..e86194db9d09cfcf5f7a753072809608fea9de05 GIT binary patch literal 262 zcmV+h0r~z%Nk%w1VITk?0D%Ai_|Q1Gh#)8^C;$KeA^8LW00093EC2ui03ZM$06+-W z00#&hNKl}Fg9r~6TsZI`0003ZN}NcM;zNZ496}86u;a#v9zBBWh|!>chZR#wyeNQS z!;>9VdMx=8rNx*jZH~mKQKiq70B9~u7?LDHmoAAG4SE!*Nu57|3e5;Js!x_raW4JH zG2~8!P@zr~d6Q>Vt2vn_g((&&R;LUTCWK3us@#@!hk{)?x30#vBj2tCd{u41o@gry zrb^iATf}2=D(1@a@5Zf>$yPpFG_%*Po5OPTJlSmHsEZ*dmWr34YR85LOTM|-snVi- M^SZv<8ficPJB#CM8~^|S literal 0 HcmV?d00001 diff --git a/data/itemgfx/Quarter Magic.gif b/data/itemgfx/Quarter Magic.gif new file mode 100644 index 0000000000000000000000000000000000000000..97841b1e8340bd2d5b7c9632c768060f50b133de GIT binary patch literal 296 zcmV+@0oVRVNk%w1VITk?0D=Gj`1ttv&^VaTaJYydNRTinC@25`00000A^8LW000I6 zEC2ui03ZM$06+-s01XHnNU)&6g9ZyIT*y!%LWKYTI4sz(VgZ5>BWm2pkN^PzAVY%m zI8k6mju#Cm^ypFKNCG7XW{iokKuZBMDHezrb0tiRBvYE)DUoPTn=F&&tjSZTN{b8; z4o!$O>C2!@H7(b_ZPkw ze*+8F>Gp5iyDkM_)d^PS-J5zHqwEVcY-6gCEf)=YbL-H{Iy-xHT$yy)tQ#jkMVof* ufWxJILS6j1Xk)l?SsrbATWn&*b0w#qh+AZ4)1Yx5|GJs5-@!2h0suQ}A$ODj literal 0 HcmV?d00001 diff --git a/data/itemgfx/Red Boomerang.gif b/data/itemgfx/Red Boomerang.gif new file mode 100644 index 0000000000000000000000000000000000000000..052dfa99f3c46d13e5b0b325bcf330a4d1119f4a GIT binary patch literal 167 zcmZ?wbhEHb6kt$bXk=h`P*AWz0|Xct7!-f9FfuSOGw1->3?O+2jtT~L4jGRP4;UDk zm{@?K3muy|M72^*2qe06in7|=`SD@Vkyc()u`eBlDvsSsmaE=m1gf6wk@oa6u{26N z*<<8rB~u~z?9_aRX0G0wlal>s3FMx;QyG-$xy)v+p0DIrW!EL_bK~yLyqq4sMt>uh P4VP)=&4sMYObpfluEaFM literal 0 HcmV?d00001 diff --git a/data/itemgfx/Red Clock.gif b/data/itemgfx/Red Clock.gif new file mode 100644 index 0000000000000000000000000000000000000000..9629dccc5aa6d8863bc5c83c19fe8381e036372e GIT binary patch literal 288 zcmZ?wbhEHbRA5kGXkuXa@#Dvd2!jn8Ai#hG6o0ZXGBB_(=zzpPY8^P9GH`Opcx+g3 zu$hCM$AE*O!Ksx=+D_(z!9xZ{CaJ7D91M?-bg?)Hg>)1yKGZ8Gt`u{!Ncr?+1}2sn z9UGT5bP6&GhbvOP@=CdDQR2C$PTHJZwAK2H;q^;WtA8!&+OGR% ebz%FtQf~1rdCTS%pFZ3Dv*hi*>d$N}4Aua}m2ryz literal 0 HcmV?d00001 diff --git a/data/itemgfx/Red Crystal.gif b/data/itemgfx/Red Crystal.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d17df29da65b9d23e80c2fb874018d875bcec21 GIT binary patch literal 272 zcmZ?wbhEHbRA5kGXkuXa@#Dvi9VZ?X6l~A{0R|XQ{K>+|z`)9&0}=qKb>O(lz|A4! zv0=f%W)5B<1qBC&hIR%qHJ=>?4M!Py6`3+_1Ux#@ENWQ9BapE0SUb08olb(0QsY!% z@uHH7OUh>&6?M<$coZ%4XVS{wRAaf}x&H#j7QRra$%?*HTxRmkt-Q4K(u5HIvK}tu zZ1nZ3N!mtA`d>QN39Fu?CSO2o*6qKeeJ!uze4oyZk4(mS2}B>+MRVR zznx^)OisSKHkmURoz>zLrMnou4WPy|rCjv;R(56Cy3QwXO5cFh9p+#91i21SU%$QK4 zGPMYkB-Nz_9ahw;Fo4$pTy_2&*mEPtjyF}RRd`l_O`rvoDm*H*u0)<#;VKoXR;}E; z2b~IjDwS;0!iW|nNT2~<5$^zO>KNF(CaYZNx$-+NC^<{j5S(xI>a(rkL1ZcCT91sBe~ LJF(NK0RaFzg3NwK literal 0 HcmV?d00001 diff --git a/data/itemgfx/Red Mail.gif b/data/itemgfx/Red Mail.gif new file mode 100644 index 0000000000000000000000000000000000000000..0cc9885f81b5a55eff110aebae9d95349ce6f76c GIT binary patch literal 301 zcmV+|0n+|QNk%w1VITk?0D=Gj`1ts^xX5^Th~RK=uqY@fC@25`00000A^8LW000I6 zEC2ui03ZM$06+-x01XHnNU)&6g9r;KTu6Yx!iNPKLM%W~VZ)0A258)faU(~J4k;S2 zcv0g-g&s9Z6p7H_NtP{1dc+6-08N`EQz~>>K!5;{7Xt_l@UZ2;i9lZ(UCOknK$1ye zCX5KO=1P)QLGBz$wV}$40~*%M`nBVLtw?ju)C!TO$(}yr3VrBv~fadOVQl*xt#`4+0$k9jj+yzDtO z>eX!zDy)llDAC6;3%rdh_x9|ciVK=94Kd~Dt&s6{E`AnpMTk)+4*u(WU_bynUe|m% literal 0 HcmV?d00001 diff --git a/data/itemgfx/Red Pendant.gif b/data/itemgfx/Red Pendant.gif new file mode 100644 index 0000000000000000000000000000000000000000..dcf55738ceace7e76e0ff650161cbbc8fb723a62 GIT binary patch literal 310 zcmZ?wbhEHbRA5kGXkuXa@#Dvi9VZ?X6l~A{0R|XQ{K>+|z`)9&0}=qKb>R5Tz|A4! zv0=f%W)@BX4grUS4y^*>W<4Gc7P_=^aJ#WEFf4XzlQC2Z(O9sgfsxs(NJrCXu~Q$9 zWYrXoP02@_^%+kr*7VoCChNpr8&XQOm{Pk zABN2mE*OCtvHSuO1xk zSQ@k@+cfLkM&sk})^dw4x;8&+?=00f#YvC*Q#k*(@JuPWd7Ht-^5aXtz_|Fh8Tk$j F)&P6Jf7$>5 literal 0 HcmV?d00001 diff --git a/data/itemgfx/Red Potion (R).gif b/data/itemgfx/Red Potion (R).gif new file mode 100644 index 0000000000000000000000000000000000000000..a39f20cd1159e06c79313f2dacc79b241eba587d GIT binary patch literal 319 zcmV-F0l@x8Nk%w1VITk?0D=Gj`1ts^xX5^Th~RK=uqY@fC@25`00000A^8LW000I6 zEC2ui03ZM$06+-;01XHnD6oLRg9s54TsY7m0RjjG2nZ0s;DCz*5*B!9u;9jr5D$U` zi4h~hiyRAh9LbVE$%_U7$egLL;X#QMH6k3@aiPPIKXOrdv4dSf$v1L@BA0tlWs#9c0sbSM@HQF@o%8)$E9&B5*D@(a}55A@P@~Bm( zJ@+nc`?mmAhBoucMVwSIQpQ;ethF0AFk-Pe<;IO%cQW3TXgiN(dsL|9plU}K=!-fu z(6m2MzJ`eub!EA9U*Bf>@+48+OC9H>%A5An!h(yNGz+|z`)9&0}=qKb>R5Kz|A3} zF`?mLGl!s1jKzfq4U8PjEDQ_>7BqA-2?#EA~8w*P`gI8(2f<8(@#$`NIZ3?^K-_zW}bAR2_6?Uyjufn<(6c9 zR`Z*y?Y!(s*2ksSHiYe+XY%vo^T4g_Q`>l6o4h=|lx3~b-rpu!VLP<`a$4%EZPHmqxcTRcHvwp|xVsm*U4bm@nw!W*4 xHCuXbdBM|NrB;{nPA=VE{o7A=#=DCTk1YLEcJlkCD-XiCrS*8P7dS9j0{}0ee$oH{ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Rupee (1).gif b/data/itemgfx/Rupee (1).gif new file mode 100644 index 0000000000000000000000000000000000000000..a2d025feb4cda1b292d619ba0150e78d022ddeba GIT binary patch literal 193 zcmV;y06zamNk%w1VGsZy0D%Ain9y)YkT57HC;$KeA^8LW00093EC2ui01yBm06++m z00#&hNU-1l0RjLh1Q4L1Lxd0$G7O;5Aw>WP1tM%%@u2{N2p3}fI56ZwiyTLq?3l7) z#)1(If`lmZphT7dUYbOSGNQ3?O+2j!6vc95Nmo9xyO6 zF=(&|ELiB=A|PzUv*3cFD+33sQclFjg$&Ic;z@rj44yc3%ec>aGhlb1qD{&VzAxi-w$vh4EmfLyb=nnkP5&X=2-lqwad6xgrb sZWW@jWpU)xIQ=LUZb9|)o06>EY_!6j2W^c^yr=uiBrRk)BO`+~0N3F^umAu6 literal 0 HcmV?d00001 diff --git a/data/itemgfx/Rupee (5).gif b/data/itemgfx/Rupee (5).gif new file mode 100644 index 0000000000000000000000000000000000000000..c2744645beec903b8ba7666ac187c369c86d6016 GIT binary patch literal 193 zcmV;y06zamNk%w1VGsZy0D%Aikf`WTXs9SCC;$KeA^8LW00093EC2ui01yBm06++m z00#&hNU-1l0RjLh1Q4L1Lxd0$G7O;5Aw>WP1tM%%@u2{N2p3}fI56ZwiyTLq?3l7) z#)1(If`lmZphT7dUYbOSGNQXiu2RVmb^qno{L}VCnq(cC!q<8&By+0z z)ixR1LvNxkJ@;LbaeUd=Q-(^x3!ERn3b7DccXx@k{W{eR+gHc0bpIb!V;yGTKU-$? zuerYpmONU~v(@j3SJ{E}Lc08-_6qyPW_ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Rupees (300).gif b/data/itemgfx/Rupees (300).gif new file mode 100644 index 0000000000000000000000000000000000000000..6163dd17a3627854a362f987ea1ab51bf206bd69 GIT binary patch literal 298 zcmZ?wbhEHbRA5kGXkuXa@#Dvg3k4n%3^X(}7?6PCPZmZ71{MY#kQhj<1IK#?P7WE5 z4GRu7v#|331se`CFez~*tPoIiYUNS3YtcB6=-MsL?sDYB29=YOxfvJu%$W3uVS<9F zRnLinwBro&iF_)So0fXc*Yo~o;t`Z_alTWmQ0R{!b)QLQQ>{`XjT-`HY0dVVdUE3` zw>eRBKkYfWWzEh0bk?G&8VhnRtjQ05CvtOI=A9`TOZ9YDU(1Q#7tDM-MXO@N#SN{T z4sU0feoUGjQQYPG^24hm#~QE4ZF?#B@iJqebkQ4~iZ{pBPb!_oR&BO6Y5#iTYrb6O sF9WB~s(!Y1ue9#n+j~B8UH={R{lkOu>6h5f-T54UXg%X@J`M(J06yD#nM#-vAH6U0QV zdQKFi9cPeF4AV*46|NMIk{2I zy+-Twn>{wK5?xWC5;e7O>mi@tlipw1?{}VwjWa|)VRGP8 zzPRYEZ(NSn3r5>^Uj1Jnc}ud<}6p*o>}WMuB1&qHMQ4l s^Z7|mKc9t0PfvNXq(V_$MDt_byT?J?>+GzgEiw*e#%@;=5MZzd0NXHhC;$Ke literal 0 HcmV?d00001 diff --git a/data/itemgfx/Shovel.gif b/data/itemgfx/Shovel.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc211be3fba3b0c22c444232dc41f7855b544b94 GIT binary patch literal 209 zcmZ?wbhEHb6kt$bXkuX4vExKVMaPK<0}Txg1|*>PlZBCifrUW_BnDFJz%h-1lS9U0 z!GnfI7Iu~h35JHl?R>mmG71Y8HFUBIN9~y*nCRHXD=#MULr}%JL)kRS=jFsl$EL~( z>-9)%R`KXC@qTnfQ!wTH1RYM1I}%$|FV1jFR8r|Id~~VBb^0q7fvagAvwVExL^D4; z^IH|W{oS9HqNz7p?Th_vvs?*)?!qqr_xoJ6t~~Yb)156PA|b$F4FEa$ BM{ocD literal 0 HcmV?d00001 diff --git a/data/itemgfx/Silver Arrows (Ag).gif b/data/itemgfx/Silver Arrows (Ag).gif new file mode 100644 index 0000000000000000000000000000000000000000..78e77cd45933379757daa22dc6062e6fb384d14f GIT binary patch literal 263 zcmZ?wbhEHbRA5kGXkuXa@#Dvi9VaR(Iy5vi7?6PCPZmZ71{MY#kQhj<1IHN#P7WE3 zf&&aq9Ku>Y83qmv&D_dvIX^x;aOe;cloC-$NOo^#W?(ST5K{J>sH`g{^WZ|F=Tu46 zc}FCQANoua&EFT(Y4p^qNzL(}N&Ac`x>2%iGU81W(wi)d|)Z#6&+_g8oJ)P2sHqFwPi>R{vU zO-EmC(0O>!C*RDjdrRK=1(Pqg`C6L2xW_o(I$FnTTTaH#%!AYJ?K0BvpHlNMNmW9C G!5RPx6lIFZsk$-3gKX2aP4Lm5L#35aiL2a7q8tD3k8RU3C!ADAsj}J54Ib~ zu9FGanC3f$EmTaVbEE3HMlRo3Z#;w@oH}$(g%WOFSnAPXKh-N%>au3Q5_#=kEt#L6 zA6@JdJxOI%$a9}b!fWk%JwIhcZ5QlZWa4eQ(ruaZRUwDlC0SRdS1sp~^VyM=u&OOE zZp+PYua0*_&EB;4<)q9r$1^?6?6SXP-B^~~{ZG`RT&2Sn(soivlTbL|IVf zNP{m2##C9-BuJVoJ)RVhl4JmpJX>nC7!>BvoknYd#F&w(Q>QU|UUayVDp8y^ulgJb q6eriJKC>>(xbP=Zp(R;%Oj{IfPNph>CVh)B?%B0;;kG3h5CA*m(m&Gx literal 0 HcmV?d00001 diff --git a/data/itemgfx/Small Magic.gif b/data/itemgfx/Small Magic.gif new file mode 100644 index 0000000000000000000000000000000000000000..99b4b69da4b584c073abe0f64a3baf58fa79c9e9 GIT binary patch literal 173 zcmZ?wbhEHb6kt$bXkuXaalvB7g@PR&3LX;-G&D3AU_kLF3nK#qD}xS50HoG|qlkf< zL&jr6f+G`$u#!nfK!YL;}euQ3$A1urg<#lmG_#nV#|wDvpr(N TmYy_v8Pw}|xJy?;fWaC7Li;(( literal 0 HcmV?d00001 diff --git a/data/itemgfx/Somaria.gif b/data/itemgfx/Somaria.gif new file mode 100644 index 0000000000000000000000000000000000000000..79327b8abea5c144f655febf31575082924aa657 GIT binary patch literal 189 zcmZ?wbhEHb6kt$bXk=h`P*AWz0|Xct7!-f9FfuSOGw1->3?O+2jy?u<4jF|73l26i zbF)QAI4C+ZFmNfAa0DtHYGD!!6EO&6aB1ULE;_OzaLK`mvffd9JPec%PnA$SB{K8V zQpc(0xmGb56P0|YsW9iT+!9g`oNo|0PetoP%B2~`^=4l=7?xaIWEGot=jH`fzjf-4 p->zhRO1QAlXX2tgE52#mTpqk$t9JJ`wOc!rUT-q(Hc()&1^`DyL6-mk literal 0 HcmV?d00001 diff --git a/data/itemgfx/Super Bomb.gif b/data/itemgfx/Super Bomb.gif new file mode 100644 index 0000000000000000000000000000000000000000..42ae20562b338fe50fb94be353224b8e4b495d40 GIT binary patch literal 299 zcmZ?wbhEHbRA5kGXkuXa@#Dvb1sOLI5;Qb47?6PCPZmZ71{MY#kQhj<1IGsjP7WE5 z4GN459KupD9tj5+7zLEAdNdN0j&?EgL@kk6u=sdChknwPA0Hka?^lvFQhBlADMO2F ztd$Q(!;%wy=FA7aa0EU*(90Ci#d9h+>DW}g_M|U6gVWZ%fn+CA;#s#064 slK4eiUKi=iGG3E$xA5a9vFynuH>Z?z-;eW_*z#;zhbNnyi~xf*01&!%@Bjb+ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Sword and Shield.gif b/data/itemgfx/Sword and Shield.gif new file mode 100644 index 0000000000000000000000000000000000000000..de135c5d60980207b8f65e058bcebc1eeb0490b6 GIT binary patch literal 271 zcmZ?wbhEHbRA5kGXkuXa@#DvY6)yrZR%mEwFdzZNpDc_F3@i*fATf|y2aYQYoE$P9 z8x|aF=3r%t;9z*zz{sa4mvUpngTt*%EG#!96doUHXOT}k!|~~XYn!TIkk1LDhhE*x z8mC+|10S61H|3mj=ETOu40G7zm*seFS#hzGr(djA(nyVAVZdCz&>13X$0kNJiltZ; zEO+aZo9`vkS^6Yked6+0G7X`*!P~tapPK8vUG@4d=J$_O7hF#}w@hob*-^>RSMmFr zc3aK$3|t$xC3UM%&6_FeH|8ht2JO3LoO^EeOwrkKGT6_Mt#h#ATzdASR@-Gvq$Q8HFmxQmLcKX)V doEzzp!fLy}8s9m!v;LeIXU+GpCPqdEYXHO;b-2+NDS~WB1Hlc6*?pUQ6j{I7$=G} zIADOrh6O5iyjZfNK>z?wZWNi3qeYM?3x=%uF=0uVKx5jJsZ*tZiZz4c%!x1|M2Ia- zCSE z*QP7cwp5#U@xZHHC(B0t)}q{}AVr&X3LG?F*OqUSy(w6)P}hEY%N`7!>fgD62O}m8 Pb@o)ohQl%f4F~``7G8qO literal 0 HcmV?d00001 diff --git a/data/itemgfx/Triforce.gif b/data/itemgfx/Triforce.gif new file mode 100644 index 0000000000000000000000000000000000000000..33f4e3d554eb539b71f36ca4553bab5075b04ba6 GIT binary patch literal 207 zcmZ?wbhEHbRA5kGXk=jcalt}ELxTYf6o0ZXGB7YP=zw@2c?XUK46Gb79vc=MZ06u) z<6u~@@Ng@quwIGB#w6zsA<3vaCj^sSnuHlE{&X0m9A{8ro%Li#;S#T2o#e2RpA*wg z^@s=FJ7O99{9L29?yV=9!AtxXxysA2avHC^u$X(X*IciySy$#ql=GeaWu$(+S#f(- z?yIk>8y2|jU$j(Xo6603_Sd(?beW{x-kjgvH8p#BUik82(PykSlk^{K3KQ1er=_64 GU=0AXV@;Lntr-^=48{gb2d)xcrk#q WWFz;?%vi0|skD(F2h6-+Kma?_3v=NB literal 0 HcmV?d00001 diff --git a/data/itemgfx/Whirlpool.gif b/data/itemgfx/Whirlpool.gif new file mode 100644 index 0000000000000000000000000000000000000000..26edb12759862daa688adb3ff95e3bc8f517026a GIT binary patch literal 376 zcmV-;0f+uaNk%w1VITk?0D=Gj`1tsU(D-6uQ zE@kLcCsV5|gI>h=G9poqGgW4kDN*3gi4J`#R4cLPRgyHXJ{7xh0L+C+zh(^@_p8c~ zNo7_=NkAmlw^NfQj0$vYV5@GWQhm5mZc?e30UZ3w(J^1jlZ%!uP!;Ub(WB4a{Ye?M zSA%H#)?IAVZdtcqCkGu`7qDBwaSdy=T9mfOnrbp~LBEerm+|)VmUqvDdoX8uD;)!t=5 WJtf*}rVSUKZLXCDmTF}M1OPh=#+OC_ literal 0 HcmV?d00001 diff --git a/data/itemgfx/Zelda (Body).gif b/data/itemgfx/Zelda (Body).gif new file mode 100644 index 0000000000000000000000000000000000000000..5db7ac8cccf2a6b9f54fa3eee70e2a22e11ff226 GIT binary patch literal 323 zcmV-J0lfZ4Nk%w1VITk?0D=Gj`1ttnplGm=_}E}zuwW=CC@25`00000A^8LW000I6 zEC2ui03ZM$06+-;01XHnNU)&6g9Hl{002NCLje#4C`?!&q5y^t8!prspkn|61QZS! zNphq@kRAhMq^PiEMT-$#x->Wwp-q7`aTe$ZQX#~L5rLj0&~f5GpAujG)R>VW#+EmA z%A5){s@1DUH$Kf-aH>;{I(u$J>Jnncp+-jys<@axZp83!he Vdb0M!im!qQpBmXYRjUC306WlRgL41? literal 0 HcmV?d00001 diff --git a/data/itemgfx/Zelda (Head).gif b/data/itemgfx/Zelda (Head).gif new file mode 100644 index 0000000000000000000000000000000000000000..a5f5d80f19829bf0e18660d2bc092485e892d86b GIT binary patch literal 309 zcmV-50m}YINk%w1VITk?0D=Gj`1ttnplH}&V6b2)P;kg7C@25`00000A^8LW000I6 zEC2ui03ZM$06+-(01XHnNU)&6g9rr{C?G%p00099EL<4zVZ((87X}DGQR2jpA0uky zSb$(hkp&`dT)7fuM3e~!f-Gs^V@#71Q8pyNlfcE49x)aS>G9#njSGzewRsb#(56tM zLhZN_WmS(+KQ^@3&>?`IPlpyj3RGv;lOD<9R7vvT!Mca`cbp!D?Gps$aTBwPEoYql(}x;D7jwNTJm87JOu HARqucDy@S? literal 0 HcmV?d00001 diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index b0dbf825..8141614a 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -501,6 +501,7 @@ ] }, "sprite": {}, + "triforce_gfx": {}, "create_rom": { "action": "store_false", "type": "bool" diff --git a/resources/app/gui/lang/en.json b/resources/app/gui/lang/en.json index 8632601f..0ad57757 100644 --- a/resources/app/gui/lang/en.json +++ b/resources/app/gui/lang/en.json @@ -42,6 +42,8 @@ "adjust.sprite": "Sprite:", "adjust.sprite.unchanged": "(unchanged)", + "adjust.triforcegfx": "Triforce Piece:", + "adjust.triforcegfx.unchanged": "(unchanged)", "adjust.rom": "Rom to adjust: ", "adjust.rom.romfiles": "Rom Files", @@ -259,7 +261,8 @@ "randomizer.gameoptions.sprite": "Sprite:", "randomizer.gameoptions.sprite.unchanged": "(unchanged)", - + "randomizer.gameoptions.triforcegfx": "Triforce Piece:", + "randomizer.gameoptions.triforcegfx.unchanged": "(unchanged)", "randomizer.generation.bps": "Create BPS Patches", "randomizer.generation.spoiler": "Create Spoiler Log", diff --git a/source/classes/CustomSettings.py b/source/classes/CustomSettings.py index af34f007..ab3738e7 100644 --- a/source/classes/CustomSettings.py +++ b/source/classes/CustomSettings.py @@ -208,6 +208,7 @@ class CustomSettings(object): # rom adjust stuff args.sprite[p] = get_setting(settings['sprite'], args.sprite[p]) + args.triforce_gfx[p] = get_setting(settings['triforce_gfx'], args.triforce_gfx[p]) args.disablemusic[p] = get_setting(settings['disablemusic'], args.disablemusic[p]) args.quickswap[p] = get_setting(settings['quickswap'], args.quickswap[p]) args.reduce_flashing[p] = get_setting(settings['reduce_flashing'], args.reduce_flashing[p]) diff --git a/source/classes/ItemGfxSelector.py b/source/classes/ItemGfxSelector.py new file mode 100644 index 00000000..689ff626 --- /dev/null +++ b/source/classes/ItemGfxSelector.py @@ -0,0 +1,121 @@ +from tkinter import Button, Canvas, Label, LabelFrame, Frame, PhotoImage, Scrollbar, Toplevel, LEFT, BOTTOM, X, RIGHT, TOP +import os +from GuiUtils import ToolTips, set_icon +from Utils import local_path + + +class ItemGfxSelector(object): + def __init__(self, parent, callback, valid_items=None): + self.parent = parent + self.window = Toplevel(parent) + self.window.geometry("800x650") + self.callback = callback + self.valid_items = valid_items if valid_items else [] + + self.window.wm_title("Select Triforce Piece Graphics") + self.window['padx'] = 5 + self.window['pady'] = 5 + + def open_itemgfx_dir(_evt): + from Utils import open_file + itemgfx_dir = local_path(os.path.join("data", "itemgfx")) + if not os.path.isdir(itemgfx_dir): + os.makedirs(itemgfx_dir) + open_file(itemgfx_dir) + + frametitle = Frame(self.window) + title_text = Label(frametitle, text="Item Graphics") + title_text.pack(side=LEFT) + local_title_link = Label(frametitle, text="(open folder)", fg="blue", cursor="hand2") + local_title_link.pack(side=LEFT) + local_title_link.bind("", open_itemgfx_dir) + + self.icon_section(frametitle) + + frame = Frame(self.window) + frame.pack(side=BOTTOM, fill=X, pady=5) + + button = Button(frame, text="Default (Triforce)", command=self.use_default) + button.pack(side=LEFT, padx=(0, 5)) + + set_icon(self.window) + self.window.focus() + + def icon_section(self, frame_label): + frame = LabelFrame(self.window, labelwidget=frame_label, padx=5, pady=5) + canvas = Canvas(frame, borderwidth=0, width=780) + y_scrollbar = Scrollbar(frame, orient="vertical", command=canvas.yview) + y_scrollbar.pack(side="right", fill="y") + content_frame = Frame(canvas) + canvas.pack(side="left", fill="both", expand=True) + canvas.create_window((4, 4), window=content_frame, anchor="nw") + canvas.configure(yscrollcommand=y_scrollbar.set) + + def onFrameConfigure(canvas): + """Reset the scroll region to encompass the inner frame""" + canvas.configure(scrollregion=canvas.bbox("all")) + + content_frame.bind("", lambda event, canvas=canvas: onFrameConfigure(canvas)) + frame.pack(side=TOP, fill="both", expand=True) + + itemgfx_dir = local_path(os.path.join("data", "itemgfx")) + + if not os.path.exists(itemgfx_dir): + label = Label(content_frame, text='No item graphics found in data/itemgfx folder.') + label.pack() + return + + # Get all GIF files (converted from PNG) + gif_files = [] + for file in os.listdir(itemgfx_dir): + if file.lower().endswith('.gif'): + item_name = os.path.splitext(file)[0] + # Only include if it's in the valid_items list + if item_name in self.valid_items: + gif_files.append((file, item_name)) + + # Sort by name + gif_files.sort(key=lambda x: str.lower(x[1])) + + if len(gif_files) == 0: + label = Label(content_frame, text='No valid item graphics found. Items must match names from Tables.py.') + label.pack() + return + + # Calculate how many columns can fit (assuming ~40px per icon with padding) + max_columns = 18 + + i = 0 + for filename, item_name in gif_files: + filepath = os.path.join(itemgfx_dir, filename) + image = self.get_image_for_item(filepath) + if image is None: + continue + + button = Button(content_frame, image=image, command=lambda name=item_name: self.select_item(name)) + ToolTips.register(button, item_name) + button.image = image + button.grid(row=i // max_columns, column=i % max_columns, padx=2, pady=2) + i += 1 + + if i == 0: + label = Label(content_frame, text='No valid item graphics could be loaded.') + label.pack() + + def get_image_for_item(self, filepath): + """Load and prepare an item graphic for display""" + try: + # Load GIF with native Tkinter PhotoImage (no PIL required) + photo = PhotoImage(file=filepath) + return photo + except Exception as e: + print(f"Error loading image {filepath}: {e}") + return None + + def use_default(self): + self.callback("Triforce") + self.window.destroy() + + def select_item(self, item_name): + self.callback(item_name) + self.window.destroy() diff --git a/source/gui/adjust/overview.py b/source/gui/adjust/overview.py index a26bd750..55ce0ffd 100644 --- a/source/gui/adjust/overview.py +++ b/source/gui/adjust/overview.py @@ -2,6 +2,7 @@ from tkinter import ttk, filedialog, messagebox, StringVar, Button, Entry, Frame from AdjusterMain import adjust, patch from argparse import Namespace from source.classes.SpriteSelector import SpriteSelector +from source.classes.ItemGfxSelector import ItemGfxSelector import source.gui.widgets as widgets import json import logging @@ -71,6 +72,30 @@ def adjust_page(top, parent, settings): spriteSelectButton2.pack(side=LEFT) spriteDialogFrame2.pack(anchor=E) + # Triforce Piece GFX Selection + self.triforceGfxNameVar = StringVar() + self.triforceGfxNameVar.set('(unchanged)') + triforceGfxDialogFrame = Frame(self.frames["leftAdjustFrame"]) + triforceGfxLabel = Label(triforceGfxDialogFrame, text='Triforce Piece:') + triforceGfxEntry = Label(triforceGfxDialogFrame, textvariable=self.triforceGfxNameVar) + self.triforce_gfx = None + + def set_triforce_gfx(item_name): + self.triforce_gfx = item_name + self.triforceGfxNameVar.set(item_name if item_name else '(unchanged)') + + def TriforceGfxSelectAdjuster(): + from Tables import item_gfx_table + valid_items = list(item_gfx_table.keys()) + ItemGfxSelector(parent, set_triforce_gfx, valid_items=valid_items) + + triforceGfxSelectButton = Button(triforceGfxDialogFrame, text='...', command=TriforceGfxSelectAdjuster) + + triforceGfxLabel.pack(side=LEFT) + triforceGfxEntry.pack(side=LEFT) + triforceGfxSelectButton.pack(side=LEFT) + triforceGfxDialogFrame.pack(anchor=E) + # Path to game file to Adjust # This one's more-complicated, build it and stuff it adjustRomFrame = Frame(self.frames["bottomAdjustFrame"]) @@ -117,6 +142,7 @@ def adjust_page(top, parent, settings): guiargs.rom = self.romVar2.get() guiargs.baserom = top.pages["randomizer"].pages["generation"].widgets["rom"].storageVar.get() guiargs.sprite = self.sprite + guiargs.triforce_gfx = self.triforce_gfx guiargs.outputpath = os.path.dirname(guiargs.rom) try: adjust(args=guiargs) @@ -171,6 +197,7 @@ def adjust_page(top, parent, settings): guiargs.patch = self.patchVar.get() guiargs.baserom = top.pages["randomizer"].pages["generation"].widgets["rom"].storageVar.get() guiargs.sprite = self.sprite + guiargs.triforce_gfx = self.triforce_gfx guiargs.outputpath = os.path.dirname(guiargs.patch) try: patch(args=guiargs) diff --git a/source/gui/bottom.py b/source/gui/bottom.py index e25c2b2f..35b6c516 100644 --- a/source/gui/bottom.py +++ b/source/gui/bottom.py @@ -345,6 +345,9 @@ def create_guiargs(parent): guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() + # Get Triforce Piece GFX Selection + guiargs.triforce_gfx = parent.pages["randomizer"].pages["gameoptions"].widgets["triforce_gfx"]["selectedItem"] + # Get output path guiargs.outputpath = parent.settings["outputpath"] diff --git a/source/gui/loadcliargs.py b/source/gui/loadcliargs.py index 9230fe59..6ca7ad60 100644 --- a/source/gui/loadcliargs.py +++ b/source/gui/loadcliargs.py @@ -197,6 +197,13 @@ def loadcliargs(gui, args, settings=None): spriteNameVar=gui.pages["adjust"].content.spriteNameVar2, randomSpriteVar=gui.randomSprite) + # Figure out Triforce GFX Selection + if "triforce_gfx" in args and args["triforce_gfx"] is not None: + gui.pages["randomizer"].pages["gameoptions"].widgets["triforce_gfx"]["selectedItem"] = args["triforce_gfx"] + gui.pages["randomizer"].pages["gameoptions"].widgets["triforce_gfx"]["itemNameVar"].set(args["triforce_gfx"]) + gui.pages["adjust"].content.triforce_gfx = args["triforce_gfx"] + gui.pages["adjust"].content.triforceGfxNameVar.set(args["triforce_gfx"]) + # Load args/settings for Adjust tab def loadadjustargs(gui, settings): options = { diff --git a/source/gui/randomize/gameoptions.py b/source/gui/randomize/gameoptions.py index ac9bdc22..5f3dfddf 100644 --- a/source/gui/randomize/gameoptions.py +++ b/source/gui/randomize/gameoptions.py @@ -1,6 +1,7 @@ from tkinter import ttk, StringVar, Button, Entry, Frame, Label, NE, NW, E, W, LEFT, RIGHT from functools import partial import source.classes.SpriteSelector as spriteSelector +import source.classes.ItemGfxSelector as itemGfxSelector import source.gui.widgets as widgets import json import os @@ -66,6 +67,34 @@ def gameoptions_page(top, parent): spriteSelectButton.pack(side=LEFT) spriteDialogFrame.pack(anchor=E) + ## Triforce Piece graphics selection + triforcegfxDialogFrame = Frame(self.frames["leftRomOptionsFrame"]) + triforceGfxLabel = Label(triforcegfxDialogFrame, text='Triforce Piece:') + + self.widgets["triforce_gfx"] = {} + self.widgets["triforce_gfx"]["selectedItem"] = None + self.widgets["triforce_gfx"]["itemNameVar"] = StringVar() + self.widgets["triforce_gfx"]["itemNameVar"].set('Triforce') + + triforceGfxEntry = Label(triforcegfxDialogFrame, textvariable=self.widgets["triforce_gfx"]["itemNameVar"]) + + def triforce_gfx_setter(item_name): + self.widgets["triforce_gfx"]["selectedItem"] = item_name + self.widgets["triforce_gfx"]["itemNameVar"].set(item_name) + + def triforce_gfx_select(): + # Import Tables to get valid item names + from Tables import item_gfx_table + valid_items = list(item_gfx_table.keys()) + itemGfxSelector.ItemGfxSelector(parent, triforce_gfx_setter, valid_items=valid_items) + + triforceGfxSelectButton = Button(triforcegfxDialogFrame, text='...', command=triforce_gfx_select) + + triforceGfxLabel.pack(side=LEFT) + triforceGfxEntry.pack(side=LEFT) + triforceGfxSelectButton.pack(side=LEFT) + triforcegfxDialogFrame.pack(anchor=E) + return self diff --git a/source/tools/MysteryUtils.py b/source/tools/MysteryUtils.py index c7d811e3..ac130d8b 100644 --- a/source/tools/MysteryUtils.py +++ b/source/tools/MysteryUtils.py @@ -261,6 +261,7 @@ def roll_settings(weights): if 'rom' in weights: romweights = weights['rom'] ret.sprite = get_choice('sprite', romweights) + ret.triforce_gfx = get_choice('triforce_gfx', romweights) ret.disablemusic = get_choice_bool('disablemusic', romweights) ret.quickswap = get_choice_bool('quickswap', romweights) ret.reduce_flashing = get_choice_bool('reduce_flashing', romweights) From c305995fadd27869ce69265a406deb22db043702 Mon Sep 17 00:00:00 2001 From: Catobat <69204835+Catobat@users.noreply.github.com> Date: Thu, 20 Nov 2025 18:43:53 +0100 Subject: [PATCH 15/20] Skip unneeded rules in copy_world_premature --- BaseClasses.py | 2 +- Main.py | 2 +- Rules.py | 31 +++++++++++++++---------------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 3abcbdd4..37a698f3 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -65,7 +65,7 @@ class World(object): self.lock_aga_door_in_escape = False self.save_and_quit_from_boss = True self.override_bomb_check = False - self.is_copied_world = False + self.is_premature_copied_world = False self.accessibility = accessibility.copy() self.fix_skullwoods_exit = {} self.fix_palaceofdarkness_exit = {} diff --git a/Main.py b/Main.py index 6b587bf6..873173a1 100644 --- a/Main.py +++ b/Main.py @@ -1026,7 +1026,7 @@ def copy_world_premature(world, player): ret.key_logic = world.key_logic.copy() ret.settings = world.settings - ret.is_copied_world = True + ret.is_premature_copied_world = True create_regions(ret, player) update_world_regions(ret, player) diff --git a/Rules.py b/Rules.py index ee69a481..cd3453d3 100644 --- a/Rules.py +++ b/Rules.py @@ -50,9 +50,11 @@ def set_rules(world, player): ow_bunny_rules(world, player) ow_terrain_rules(world, player) + if world.is_premature_copied_world: + return + if world.mode[player] == 'standard': - if not world.is_copied_world: - standard_rules(world, player) + standard_rules(world, player) else: misc_key_rules(world, player) @@ -91,23 +93,20 @@ def set_rules(world, player): if (world.flute_mode[player] != 'active' and not world.is_tile_swapped(0x18, player) and 'Ocarina (Activated)' not in list(map(str, [i for i in world.precollected_items if i.player == player]))): - if not world.is_copied_world: - # Commented out below, this would be needed for rando implementations where Inverted requires flute activation in bunny territory - # kak_region = self.world.get_region('Kakariko Village', player) - # add_rule(world.get_location('Flute Activation', player), lambda state: state.has('Ocarina', player) and state.is_not_bunny(kak_region, player)) - add_rule(world.get_location('Flute Activation', player), lambda state: state.has('Ocarina', player)) + # Commented out below, this would be needed for rando implementations where Inverted requires flute activation in bunny territory + # kak_region = self.world.get_region('Kakariko Village', player) + # add_rule(world.get_location('Flute Activation', player), lambda state: state.has('Ocarina', player) and state.is_not_bunny(kak_region, player)) + add_rule(world.get_location('Flute Activation', player), lambda state: state.has('Ocarina', player)) # if swamp and dam have not been moved we require mirror for swamp palace if not world.swamp_patch_required[player]: add_rule(world.get_entrance('Swamp Lobby Moat', player), lambda state: state.has_Mirror(player)) - if not world.is_copied_world: - set_bunny_rules(world, player, world.mode[player] == 'inverted') + set_bunny_rules(world, player, world.mode[player] == 'inverted') # These rules go here because they overwrite/add to some of the above rules if world.logic[player] == 'hybridglitches': - if not world.is_copied_world: - underworld_glitches_rules(world, player) + underworld_glitches_rules(world, player) def mirrorless_path_to_location(world, startName, targetName, player): # If Agahnim is defeated then the courtyard needs to be accessible without using the mirror for the mirror offset glitch. @@ -399,7 +398,7 @@ def global_rules(world, player): # bonk items if world.shuffle_bonk_drops[player]: - if not world.is_copied_world: + if not world.is_premature_copied_world: from Regions import bonk_prize_table for location_name, (_, _, aga_required, _, _, _) in bonk_prize_table.items(): loc = world.get_location(location_name, player) @@ -983,7 +982,7 @@ def global_rules(world, player): add_key_logic_rules(world, player) - if world.logic[player] == 'hybridglitches' and not world.is_copied_world: + if world.logic[player] == 'hybridglitches' and not world.is_premature_copied_world: add_hmg_key_logic_rules(world, player) # End of door rando rules. @@ -1490,7 +1489,7 @@ def no_glitches_rules(world, player): set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: False) # no glitches does not require block override set_rule(world.get_entrance('Ice Lake Northeast Pier Hop', player), lambda state: False) forbid_bomb_jump_requirements(world, player) - if not world.is_copied_world: + if not world.is_premature_copied_world: add_conditional_lamps(world, player) @@ -1801,11 +1800,11 @@ def standard_rules(world, player): add_rule(world.get_entrance(entrance, player), lambda state: state.has('Zelda Delivered', player)) if world.shuffle_bonk_drops[player]: - if not world.is_copied_world: + if not world.is_premature_copied_world: add_rule(world.get_location('Hyrule Castle Tree', player), lambda state: state.has('Zelda Delivered', player)) add_rule(world.get_location('Central Bonk Rocks Tree', player), lambda state: state.has('Zelda Delivered', player)) - if not world.is_copied_world: + if not world.is_premature_copied_world: add_rule(world.get_location('Hyrule Castle Courtyard Tree Pull', player), lambda state: state.has('Zelda Delivered', player)) # don't allow bombs to get past here before zelda is rescued From 483e7f49ad99b2bcdf030830d7de3473475e02bb Mon Sep 17 00:00:00 2001 From: Catobat <69204835+Catobat@users.noreply.github.com> Date: Thu, 20 Nov 2025 20:36:51 +0100 Subject: [PATCH 16/20] Fix issues with dynamic flute and mirror exits --- Main.py | 13 ++++---- OverworldShuffle.py | 49 ++++++++++++---------------- source/overworld/EntranceShuffle2.py | 2 +- 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/Main.py b/Main.py index 873173a1..ff1771d8 100644 --- a/Main.py +++ b/Main.py @@ -17,7 +17,7 @@ from OverworldGlitchRules import create_owg_connections from PotShuffle import shuffle_pots, shuffle_pot_switches from Regions import create_regions, create_shops, mark_light_dark_world_regions, create_dungeon_regions, adjust_locations from OWEdges import create_owedges -from OverworldShuffle import link_overworld, update_world_regions, create_dynamic_exits +from OverworldShuffle import link_overworld, update_world_regions, create_dynamic_flute_exits, create_dynamic_mirror_exits from Rom import patch_rom, patch_race_rom, apply_rom_settings, LocalRom, JsonRom, get_hash_string from Doors import create_doors from DoorShuffle import link_doors, connect_portal, link_doors_prep @@ -172,7 +172,6 @@ def main(args, seed=None, fish=None): create_shops(world, player) update_world_regions(world, player) mark_light_dark_world_regions(world, player) - create_dynamic_exits(world, player) init_districts(world) @@ -809,13 +808,13 @@ def copy_world(world): update_world_regions(ret, player) if world.logic[player] in ('owglitches', 'hybridglitches', 'nologic'): create_owg_connections(ret, player) - create_dynamic_exits(ret, player) create_dungeon_regions(ret, player) create_owedges(ret, player) create_shops(ret, player) - #create_doors(ret, player) create_rooms(ret, player) create_dungeons(ret, player) + create_dynamic_mirror_exits(ret, player) + create_dynamic_flute_exits(ret, player) # there are region references here they must be migrated to preserve integrity # ret.exp_cache = world.exp_cache.copy() @@ -940,7 +939,7 @@ def copy_world(world): return ret -def copy_world_premature(world, player): +def copy_world_premature(world, player, create_flute_exits=True): # ToDo: Not good yet ret = World(world.players, world.owShuffle, world.owCrossed, world.owMixed, world.shuffle, world.doorShuffle, world.logic, world.mode, world.swords, world.difficulty, world.difficulty_adjustments, world.timer, world.progressive, world.goal, world.algorithm, @@ -1032,13 +1031,15 @@ def copy_world_premature(world, player): update_world_regions(ret, player) if world.logic[player] in ('owglitches', 'hybridglitches', 'nologic'): create_owg_connections(ret, player) - create_dynamic_exits(ret, player) create_dungeon_regions(ret, player) create_owedges(ret, player) create_shops(ret, player) create_doors(ret, player) create_rooms(ret, player) create_dungeons(ret, player) + create_dynamic_mirror_exits(ret, player) # assumes these have already been added to world + if create_flute_exits: + create_dynamic_flute_exits(ret, player) if world.mode[player] == 'standard': parent = ret.get_region('Menu', player) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 028f1659..8febdd13 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -200,6 +200,7 @@ def link_overworld(world, player): connect_simple(world, exitname, regionname, player) categorize_world_regions(world, player) + create_dynamic_mirror_exits(world, player) if world.logic[player] in ('owglitches', 'hybridglitches', 'nologic'): create_owg_connections(world, player) @@ -424,8 +425,6 @@ def link_overworld(world, player): assert len(forward_set) == len(back_set) for (forward_edge, back_edge) in zip(forward_set, back_set): connect_two_way(world, forward_edge, back_edge, player, connected_edges) - - world.owsectors[player] = build_sectors(world, player) else: if world.owKeepSimilar[player] and world.owShuffle[player] == 'parallel': for exitname, destname in parallelsimilar_connections: @@ -557,13 +556,14 @@ def link_overworld(world, player): connect_set(forward_edge_sets[0], back_edge_sets[0], connected_edges) remove_connected(forward_edge_sets, back_edge_sets) assert len(connected_edges) == len(default_connections) * 2, connected_edges - - world.owsectors[player] = build_sectors(world, player) + valid_layout = validate_layout(world, player) tries -= 1 assert valid_layout, 'Could not find a valid OW layout' + world.owsectors[player] = build_sectors(world, player) + # flute shuffle logging.getLogger('').debug('Shuffling flute spots') def connect_flutes(flute_destinations): @@ -725,6 +725,8 @@ def link_overworld(world, player): s[0x3a],s[0x3b],s[0x3c], s[0x3f]) world.spoiler.set_map('flute', text_output, new_spots, player) + create_dynamic_flute_exits(world, player) + def connect_custom(world, connected_edges, groups, forced, player): forced_crossed, forced_noncrossed = forced def remove_pair_from_pool(edgename1, edgename2, is_crossed): @@ -1292,7 +1294,7 @@ def adjust_edge_groups(world, trimmed_groups, edges_to_swap, player): groups[(mode, wrld, dir, terrain, parallel, count, group_name)][i].extend(matches) return groups -def create_flute_exits(world, player): +def create_dynamic_flute_exits(world, player): flute_in_pool = True if player not in world.customitemarray else any(i for i, n in world.customitemarray[player].items() if i == 'flute' and n > 0) if not flute_in_pool: return @@ -1303,6 +1305,7 @@ def create_flute_exits(world, player): exit.spot_type = 'Flute' exit.connect(world.get_region('Flute Sky', player)) region.exits.append(exit) + world.initialize_regions() def get_mirror_exit_name(from_region, to_region): if from_region in mirror_connections and to_region in mirror_connections[from_region]: @@ -1329,7 +1332,7 @@ def get_mirror_edges(world, region, player): mirror_exits.append(tuple([get_mirror_exit_name(other_world_region_name, region.name), region.name])) return mirror_exits -def create_mirror_exits(world, player): +def create_dynamic_mirror_exits(world, player): mirror_exits = set() for region in (r for r in world.regions if r.player == player and r.name not in ['Zoras Domain', 'Master Sword Meadow', 'Hobo Bridge']): if region.type == (RegionType.DarkWorld if world.mode[player] != 'inverted' else RegionType.LightWorld): @@ -1350,12 +1353,6 @@ def create_mirror_exits(world, player): region.exits.append(exit) mirror_exits.add(exitname) - elif region.terrain == Terrain.Land: - pass - -def create_dynamic_exits(world, player): - create_flute_exits(world, player) - create_mirror_exits(world, player) world.initialize_regions() def categorize_world_regions(world, player): @@ -1433,7 +1430,7 @@ def build_sectors(world, player): # perform accessibility check on duplicate world for p in range(1, world.players + 1): world.key_logic[p] = {} - base_world = copy_world_premature(world, player) + base_world = copy_world_premature(world, player, create_flute_exits=False) # build lists of contiguous regions accessible with full inventory (excl portals/mirror/flute/entrances) regions = list(OWTileRegions.copy().keys()) @@ -1510,7 +1507,7 @@ def build_accessible_region_list(world, start_region, player, build_copy_world=F if build_copy_world: for p in range(1, world.players + 1): world.key_logic[p] = {} - base_world = copy_world_premature(world, player) + base_world = copy_world_premature(world, player, create_flute_exits=True) base_world.override_bomb_check = True else: base_world = world @@ -1554,11 +1551,9 @@ def validate_layout(world, player): 'Pyramid Area': ['Pyramid Exit Ledge'] } - from Main import copy_world_premature - from Utils import stack_size3a # TODO: Find a better source for the below lists, original sourced was deprecated from source.overworld.EntranceData import default_dungeon_connections, default_connector_connections, default_item_connections, default_shop_connections, default_drop_connections, default_dropexit_connections - + dungeon_entrances = list(zip(*default_dungeon_connections + [('Ganons Tower', '')]))[0] connector_entrances = list(zip(*default_connector_connections))[0] item_entrances = list(zip(*default_item_connections))[0] @@ -1567,12 +1562,11 @@ def validate_layout(world, player): flute_in_pool = True if player not in world.customitemarray else any(i for i, n in world.customitemarray[player].items() if i == 'flute' and n > 0) def explore_region(region_name, region=None): - if stack_size3a() > 500: - raise GenerationException(f'Infinite loop detected for "{region_name}" located at \'validate_layout\'') - - explored_regions.append(region_name) + if region_name in explored_regions: + return + explored_regions.add(region_name) if not region: - region = base_world.get_region(region_name, player) + region = world.get_region(region_name, player) for exit in region.exits: if exit.connected_region is not None and exit.connected_region.name not in explored_regions \ and exit.connected_region.type in [RegionType.LightWorld, RegionType.DarkWorld]: @@ -1586,11 +1580,8 @@ def validate_layout(world, player): for dest_region in sane_connectors[region_name]: if dest_region not in explored_regions: explore_region(dest_region) - - for p in range(1, world.players + 1): - world.key_logic[p] = {} - base_world = copy_world_premature(world, player) - explored_regions = list() + + explored_regions = set() if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull'] or not world.shufflelinks[player]: if not world.is_bombshop_start(player): @@ -1616,14 +1607,14 @@ def validate_layout(world, player): start_region = 'Hyrule Castle Ledge' explore_region(start_region) - unreachable_regions = OrderedDict() + unreachable_regions = {} unreachable_count = -1 while unreachable_count != len(unreachable_regions): # find unreachable regions unreachable_regions = {} for region_name in list(OWTileRegions.copy().keys()): if region_name not in explored_regions and region_name not in isolated_regions: - region = base_world.get_region(region_name, player) + region = world.get_region(region_name, player) unreachable_regions[region_name] = region # loop thru unreachable regions to check if some can be excluded diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index 777edaec..8ef10110 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -864,7 +864,7 @@ def get_accessible_entrances(start_region, avail, assumed_inventory=[], cross_wo for p in range(1, avail.world.players + 1): avail.world.key_logic[p] = {} - base_world = copy_world_premature(avail.world, avail.player) + base_world = copy_world_premature(avail.world, avail.player, create_flute_exits=True) base_world.override_bomb_check = True connect_simple(base_world, 'Links House S&Q', start_region, avail.player) From 1bb803016e5b9da09999bb6e0bcc3fca6e0ad4bb Mon Sep 17 00:00:00 2001 From: codemann8 Date: Fri, 21 Nov 2025 11:40:42 -0600 Subject: [PATCH 17/20] Remove unneeded world region setting --- Main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Main.py b/Main.py index ff1771d8..03d9e6fc 100644 --- a/Main.py +++ b/Main.py @@ -170,7 +170,6 @@ def main(args, seed=None, fish=None): for player in range(1, world.players + 1): link_overworld(world, player) create_shops(world, player) - update_world_regions(world, player) mark_light_dark_world_regions(world, player) init_districts(world) From a8ac33c09320fce47f522bde835bcf714131e0f4 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sat, 22 Nov 2025 07:31:51 -0600 Subject: [PATCH 18/20] Fix for post-mirror follower sprite gfx --- Rom.py | 2 +- data/base2current.bps | Bin 138220 -> 138254 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index ad5e488b..67e4a122 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'fea650d598f4399db790903d9eb16186' +RANDOMIZERBASEHASH = '35f2b275114fcec150981e9cb28de373' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 00911e4ea0b104984649b1e074fe0a91c66def38..d3e9c2e9e457e02f6d4367b11aa849a0d22654ee 100644 GIT binary patch delta 10141 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 delta 9967 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 Date: Fri, 21 Nov 2025 19:36:22 +0100 Subject: [PATCH 19/20] Make placement of dungeon items faster --- BaseClasses.py | 6 +++--- Fill.py | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 37a698f3..b95113bd 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -2701,8 +2701,8 @@ class Location(object): self.recursion_count = 0 self.staleness_count = 0 self.locked = False - self.real = True - self.always_allow = lambda item, state: False + self.real = not crystal + self.always_allow = None self.access_rule = lambda state: True self.verbose_rule = None self.item_rule = lambda item: True @@ -2716,7 +2716,7 @@ class Location(object): def can_fill(self, state, item, check_access=True): if not self.valid_multiworld(state, item): return False - return self.always_allow(state, item) or (self.parent_region.can_fill(item) and self.item_rule(item) and (not check_access or self.can_reach(state))) + return (self.always_allow and self.always_allow(state, item)) or (self.parent_region.can_fill(item) and self.item_rule(item) and (not check_access or self.can_reach(state))) def valid_multiworld(self, state, item): if self.type == LocationType.Pot and self.player != item.player: diff --git a/Fill.py b/Fill.py index b6b793db..0fa5868f 100644 --- a/Fill.py +++ b/Fill.py @@ -183,9 +183,13 @@ def fill_restrictive(world, base_state, locations, itempool, key_pool=None, sing spot_to_fill = None item_locations = filter_locations(item_to_place, locations, world, vanilla) + # for dungeon items, it is worth reducing this list further by excluding locations outside of the respective dungeon + reduced_locations = item_locations if not item_to_place.dungeon else \ + [location for location in item_locations if not location.always_allow and location.parent_region.can_fill(item_to_place)] + verify(item_to_place, item_locations, maximum_exploration_state, single_player_placement, perform_access_check, key_pool, world) - for location in item_locations: + for location in reduced_locations: spot_to_fill = verify_spot_to_fill(location, item_to_place, maximum_exploration_state, single_player_placement, perform_access_check, key_pool, world) if spot_to_fill: From e13451df1ecd4b93abe51aa447e3decc37c82746 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sat, 22 Nov 2025 09:23:18 -0600 Subject: [PATCH 20/20] Version bump 0.6.1.3 --- CHANGELOG.md | 9 +++++++++ OverworldShuffle.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7435482..dfa86a1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.6.1.3 +- Added new post-gen option to change Triforce Piece GFX +- Added new GFX for 10/11 keys to replace the A/B GFX +- Fixed issue with Follower Sprite GFX after mirroring +- Fixed VRAM issue with Crystal Maiden cutscene +- Some performance updates +- \~Merged in DR v1.4.11~ + - Enemizer bans update + ## 0.6.1.2 - Various fixes for Custom Goal Framework - Added custom gfx for Pedestal and Murahdahla diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 8febdd13..8cb1e68c 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.2' +version_number = '0.6.1.3' # branch indicator is intentionally different across branches version_branch = '-u'