From fb99d33007af96c08e5f8ad505e896f7a4e3baad Mon Sep 17 00:00:00 2001 From: codemann8 Date: Wed, 19 Nov 2025 09:54:31 -0600 Subject: [PATCH] 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)