diff --git a/PotShuffle.py b/PotShuffle.py index d2d2547a..fc109b4d 100644 --- a/PotShuffle.py +++ b/PotShuffle.py @@ -1040,7 +1040,7 @@ class PotSecretTable(object): self.room_map = defaultdict(list) self.multiworld_count = 0 - def write_pot_data_to_rom(self, rom, colorize): + def write_pot_data_to_rom(self, rom, colorize, data_tables): pointer_address = snes_to_pc(0x09D87E) # pots currently in bank 9 data_bank_address = snes_to_pc(0x09DACE) # pointer_offset = 0x128 * 2 @@ -1057,9 +1057,13 @@ class PotSecretTable(object): rom.write_bytes(data_pointer + list_idx * 3, pot.pot_data()) if pot.location is not None and not pot.location.forced_item: collection_rate_mask |= 1 << (15 - list_idx) - if colorize and pot.obj_ref: - pot.obj_ref.change_type(Shuffled_Pot) - pot.obj_ref.write_to_rom(rom) + if colorize: + if room in data_tables.room_list: + room_object = data_tables.room_list[room] + room_object.find_all_pots()[list_idx].change_type(Shuffled_Pot) + elif pot.obj_ref: + pot.obj_ref.change_type(Shuffled_Pot) + pot.obj_ref.write_to_rom(rom) list_idx += 1 rom.write_bytes(data_pointer + list_idx * 3, [0xFF, 0xFF]) rom.write_bytes(snes_to_pc(0x28AA60) + room * 2, int16_as_bytes(collection_rate_mask)) diff --git a/Rom.py b/Rom.py index ca9de066..a42028dd 100644 --- a/Rom.py +++ b/Rom.py @@ -35,6 +35,7 @@ from source.classes.SFX import randomize_sfx from source.item.FillUtil import valid_pot_items from source.dungeon.EnemyList import EnemySprite from source.enemizer.Bossmizer import boss_writes +from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' @@ -1511,13 +1512,16 @@ def patch_rom(world, rom, player, team, is_mystery=False): if world.boss_shuffle[player] != 'none': boss_writes(world, player, rom) + write_enemy_shuffle_settings(world, player, rom) - # todo: combine this with data_tables for in place edits if (world.doorShuffle[player] != 'vanilla' or world.dropshuffle[player] != 'none' or world.pottery[player] != 'none'): for room in world.rooms: if room.player == player and room.modified: - rom.write_bytes(room.address(), room.rom_data()) + if room.index in world.data_tables[player].room_list: + world.data_tables[player].room_list[room.index].doors = room.doorList + else: + rom.write_bytes(room.address(), room.rom_data()) if world.data_tables[player]: colorize_pots = is_mystery or (world.pottery[player] not in ['vanilla', 'lottery'] @@ -1536,8 +1540,7 @@ def patch_rom(world, rom, player, team, is_mystery=False): # 21 bytes from Main import __version__ seedstring = f'{world.seed:09}' if isinstance(world.seed, int) else world.seed - # todo: change to DR when Enemizer is okay with DR - rom.name = bytearray(f'ER{__version__.split("-")[0].replace(".","")[0:3]}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21] + rom.name = bytearray(f'DR{__version__.split("-")[0].replace(".","")[0:3]}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21] rom.name.extend([0] * (21 - len(rom.name))) rom.write_bytes(0x7FC0, rom.name) @@ -2535,7 +2538,7 @@ def set_inverted_mode(world, player, rom): 0x190F, 0x9D04, 0x9D04]) write_int16s(rom, snes_to_pc(0x1bb810), [0x00BE, 0x00C0, 0x013E]) write_int16s(rom, snes_to_pc(0x1bb836), [0x001B, 0x001B, 0x001B]) - write_int16(rom, snes_to_pc(0x308300), 0x0140) # new pyramid hole entrance + write_int16(rom, snes_to_pc(0x308300), 0x0140) # new pyramid hole entrance write_int16(rom, snes_to_pc(0x308320), 0x001B) if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']: rom.write_byte(snes_to_pc(0x308340), 0x7B) diff --git a/source/dungeon/EnemyList.py b/source/dungeon/EnemyList.py index f7df3c92..b7d1c6e8 100644 --- a/source/dungeon/EnemyList.py +++ b/source/dungeon/EnemyList.py @@ -37,8 +37,6 @@ class EnemyStats: # Raven light/dark world - - class EnemySprite(FastEnum): Raven = 0x00 Vulture = 0x01 @@ -84,7 +82,7 @@ class EnemySprite(FastEnum): TelepathicTile = 0x2d FluteKid = 0x2e RaceGameLady = 0x2f - + RaceGameGuy = 0x30 FortuneTeller = 0x31 ArgueBros = 0x32 RupeePull = 0x33 @@ -156,6 +154,7 @@ class EnemySprite(FastEnum): BottleMerchant = 0x75 Zelda = 0x76 Grandma = 0x78 + Bee = 0x79 Agahnim = 0x7a FloatingSkull = 0x7c BigSpike = 0x7d @@ -203,7 +202,7 @@ class EnemySprite(FastEnum): BlueZirro = 0xa9 Pikit = 0xaa CrystalMaiden = 0xab - # ... OW + Apple = 0xac OldMan = 0xad PipeDown = 0xae PipeUp = 0xaf @@ -242,17 +241,29 @@ class EnemySprite(FastEnum): BunnyBeam = 0xd1 FloppingFish = 0xd2 Stal = 0xd3 # alive skull rock? + Landmine = 0xd4 DiggingGameNPC = 0xd5 Ganon = 0xd6 + SmallHeart = 0xd8 + BlueRupee = 0xda + RedRupee = 0xdb + BombRefill1 = 0xdc + BombRefill4 = 0xdd + BombRefill8 = 0xde + + LargeMagic = 0xe0 Faerie = 0xe3 SmallKey = 0xe4 + Mushroom = 0xe7 FakeMasterSword = 0xe8 MagicShopAssistant = 0xe9 HeartPiece = 0xeb SomariaPlatform = 0xed CastleMantle = 0xee MedallionTablet = 0xf2 + PositionTarget = 0xf3 + Boulders = 0xf4 class SpriteType(FastEnum): @@ -488,10 +499,13 @@ class Sprite(object): self.drop_item_kind = drop_item_kind self.location = None + self.original_address = None def copy(self): - return Sprite(self.super_tile, self.kind, self.sub_type, self.layer, self.tile_x, self.tile_y, self.region, - self.drops_item, self.drop_item_kind) + sprite = Sprite(self.super_tile, self.kind, self.sub_type, self.layer, self.tile_x, self.tile_y, self.region, + self.drops_item, self.drop_item_kind) + sprite.original_address = self.original_address + return sprite def sprite_data(self): data = [(self.layer << 7) | ((self.sub_type & 0x18) << 2) | self.tile_y, @@ -506,6 +520,9 @@ class Sprite(object): data.append(code) return data + def sprite_data_ow(self): + return [self.tile_y, self.tile_x, self.kind] + # map of super_tile to list of Sprite objects: vanilla_sprites = {} @@ -519,6 +536,8 @@ def create_sprite(super_tile, kind, sub_type, layer, tile_x, tile_y, region=None def init_vanilla_sprites(): + if vanilla_sprites: + return create_sprite(0x0000, EnemySprite.Ganon, 0x00, 0, 0x17, 0x05, 'Pyramid') create_sprite(0x0002, EnemySprite.CricketRat, 0x00, 1, 0x12, 0x05, 'Sewers Yet More Rats') create_sprite(0x0002, EnemySprite.CricketRat, 0x00, 1, 0x15, 0x06, 'Sewers Yet More Rats') @@ -2066,7 +2085,6 @@ layered_oam_rooms = { class EnemyTable: def __init__(self): self.room_map = defaultdict(list) - self.multiworld_count = 0 def write_sprite_data_to_rom(self, rom): pointer_address = snes_to_pc(0x09D62E) diff --git a/source/dungeon/RoomList.py b/source/dungeon/RoomList.py index e7636ff1..ecb2d8df 100644 --- a/source/dungeon/RoomList.py +++ b/source/dungeon/RoomList.py @@ -44,6 +44,14 @@ class Room: rom.write_bytes(address + offset, [0xFF, 0xFF]) return door_start, offset + 2 # how many bytes were written + def find_all_pots(self): + pots = [] + pots.extend([x for x in self.layer1 if x.data[2] == 0xFA]) + pots.extend([x for x in self.layer2 if x.data[2] == 0xFA]) + pots.extend([x for x in self.layer3 if x.data[2] == 0xFA]) + return pots + + Room0006 = Room([0xE1, 0x00], [RoomObject(0x1FA15C, [0x1B, 0xA3, 0xC8]), @@ -405,6 +413,93 @@ Room00C8 = Room([0xE1, 0x00], Room00DE = Room([0xE4, 0x00], [], [RoomObject(0x1FCAE5, [0xAD, 0x21, 0xF9])], []) +Room010C = Room([0xE0, 0x08], + [RoomObject(0x03F25D, [0xFC, 0x62, 0x00]), + RoomObject(0x03F260, [0x19, 0x33, 0x61]), + RoomObject(0x03F263, [0xFC, 0x66, 0x81]), + RoomObject(0x03F266, [0x29, 0x22, 0x01]), + RoomObject(0x03F269, [0xFD, 0x62, 0x02]), + RoomObject(0x03F26C, [0x59, 0x33, 0x62]), + RoomObject(0x03F26F, [0xFD, 0x66, 0x83]), + RoomObject(0x03F272, [0xFC, 0x89, 0x00]), + RoomObject(0x03F275, [0x22, 0xA1, 0x61]), + RoomObject(0x03F278, [0xFC, 0x8E, 0x81]), + RoomObject(0x03F27B, [0x90, 0xCA, 0x0E]), + RoomObject(0x03F27E, [0xD0, 0xE6, 0x10]), + RoomObject(0x03F281, [0xFE, 0x41, 0x00]), + RoomObject(0x03F284, [0x93, 0x23, 0x61]), + RoomObject(0x03F287, [0x92, 0x98, 0x61]), + RoomObject(0x03F28A, [0xFF, 0x81, 0x02]), + RoomObject(0x03F28D, [0xE3, 0x23, 0x62]), + RoomObject(0x03F290, [0xE2, 0x98, 0x62]), + RoomObject(0x03F293, [0xFE, 0x71, 0xC8]), + RoomObject(0x03F296, [0xAD, 0x1C, 0x03]), + RoomObject(0x03F299, [0xFF, 0x51, 0xCA]), + RoomObject(0x03F29C, [0x9D, 0x2D, 0x63]), + RoomObject(0x03F29F, [0xFE, 0x75, 0x89]), + RoomObject(0x03F2A2, [0xAD, 0x58, 0x04]), + RoomObject(0x03F2A5, [0xD5, 0x2D, 0x64]), + RoomObject(0x03F2A8, [0xFF, 0x55, 0x8B]), + RoomObject(0x03F2AB, [0xFE, 0x78, 0x08]), + RoomObject(0x03F2AE, [0xAD, 0x80, 0x03]), + RoomObject(0x03F2B1, [0xFF, 0x58, 0x0A]), + RoomObject(0x03F2B4, [0x9C, 0x91, 0x63]), + RoomObject(0x03F2B7, [0xFE, 0x7A, 0x09]), + RoomObject(0x03F2BA, [0xAD, 0xA0, 0x04]), + RoomObject(0x03F2BD, [0xFF, 0x5A, 0x0B]), + RoomObject(0x03F2C0, [0xD4, 0x91, 0x64]), + RoomObject(0x03F2C3, [0x2C, 0x2E, 0xDC]), + RoomObject(0x03F2C6, [0x3D, 0x3E, 0xF9]), + RoomObject(0x03F2C9, [0x32, 0xA9, 0xF9]), + RoomObject(0x03F2CC, [0x3A, 0xA9, 0xF9]), + RoomObject(0x03F2CF, [0x42, 0xA9, 0xF9]), + RoomObject(0x03F2D2, [0x4A, 0xA9, 0xF9]), + RoomObject(0x03F2D5, [0x57, 0x9E, 0x69]), + RoomObject(0x03F2D8, [0x54, 0xDC, 0x69]), + RoomObject(0x03F2DB, [0x38, 0xC8, 0x89]), + RoomObject(0x03F2DE, [0x58, 0x9C, 0x89]), + RoomObject(0x03F2E1, [0x58, 0xA8, 0x89]), + RoomObject(0x03F2E4, [0x58, 0xB4, 0x89]), + RoomObject(0x03F2E7, [0x58, 0xC0, 0x89]), + RoomObject(0x03F2EA, [0x58, 0xCC, 0x89]), + RoomObject(0x03F2ED, [0x58, 0xD8, 0x89]), + RoomObject(0x03F2F0, [0x58, 0xE4, 0x89]), + RoomObject(0x03F2F3, [0xAA, 0x2E, 0xC8]), + RoomObject(0x03F2F6, [0xAA, 0x29, 0x3F]), + RoomObject(0x03F2F9, [0xAA, 0x2E, 0x79]), + RoomObject(0x03F2FC, [0xAA, 0x59, 0x40]), + RoomObject(0x03F2FF, [0xD6, 0x2E, 0x7A]), + RoomObject(0x03F302, [0xAA, 0x90, 0xC8]), + RoomObject(0x03F305, [0xAA, 0x8D, 0x3F]), + RoomObject(0x03F308, [0xA8, 0x93, 0x79]), + RoomObject(0x03F30B, [0xAA, 0xA1, 0x40]), + RoomObject(0x03F30E, [0xD4, 0x93, 0x7A]), + RoomObject(0x03F311, [0xB9, 0x5B, 0xF9]), + RoomObject(0x03F314, [0xB9, 0xA3, 0xF9]), + RoomObject(0x03F317, [0x9C, 0x68, 0x22]), + RoomObject(0x03F31A, [0x9C, 0x6A, 0x69]), + RoomObject(0x03F31D, [0x9C, 0x7C, 0x22]), + RoomObject(0x03F320, [0xD4, 0x7C, 0x22]), + RoomObject(0x03F323, [0x9C, 0xB0, 0x22]), + RoomObject(0x03F326, [0xD4, 0xB0, 0x22]), + RoomObject(0x03F329, [0xB3, 0x73, 0xFA]), + RoomObject(0x03F32C, [0xCD, 0x68, 0xDD]), + RoomObject(0x03F32F, [0xB8, 0xC0, 0xDD]), + RoomObject(0x03F332, [0x08, 0x00, 0x60]), + RoomObject(0x03F335, [0x10, 0x00, 0x60]), + RoomObject(0x03F338, [0x1B, 0x10, 0xC0]), + RoomObject(0x03F33B, [0x59, 0x10, 0xC0]), + RoomObject(0x03F33E, [0x68, 0x23, 0xC0]), + RoomObject(0x03F341, [0x68, 0x61, 0xC0]), + RoomObject(0x03F344, [0x1B, 0x91, 0x60]), + RoomObject(0x03F347, [0x88, 0x10, 0x60]), + RoomObject(0x03F34A, [0xF0, 0x10, 0x60]), + RoomObject(0x03F34D, [0x90, 0xDF, 0xA1]), + RoomObject(0x03F350, [0xD4, 0xF7, 0xA3])], [], + [DoorObject(Position.InteriorW, DoorKind.TrapTriggerable), + DoorObject(Position.SouthW, DoorKind.CaveEntrance), DoorObject(Position.SouthE, DoorKind.CaveEntrance)] + ) + Room0127 = Room([0xE1, 0x00], [RoomObject(0x0AB600, [0xFE, 0x89, 0x00]), RoomObject(0x0AB603, [0xA2, 0xA1, 0x61]), diff --git a/source/enemizer/Bossmizer.py b/source/enemizer/Bossmizer.py index 935b11e3..dcc34b21 100644 --- a/source/enemizer/Bossmizer.py +++ b/source/enemizer/Bossmizer.py @@ -124,6 +124,7 @@ def boss_writes(world, player, rom): eye_number = random.randint(0, 8) # randomize moldorm eyes (var + 1) rom.write_byte(snes_to_pc(0x368102), eye_number) # enemizer flag rom.write_byte(snes_to_pc(0x1DDBB3), eye_number) # loop variable + # todo: flag vitreous key fix (prize on the eyes) data_tables = world.data_tables[player] arrghus_can_swim = True water_tiles_on = True diff --git a/source/enemizer/Enemizer.py b/source/enemizer/Enemizer.py index dfea8102..edd0763c 100644 --- a/source/enemizer/Enemizer.py +++ b/source/enemizer/Enemizer.py @@ -1,7 +1,11 @@ import RaceRandom as random +from Utils import snes_to_pc from source.dungeon.EnemyList import SpriteType -from source.enemizer.SpriteSheets import uw_sub_group_choices, setup_required_dungeon_groups +from source.dungeon.RoomList import Room010C +from source.enemizer.SpriteSheets import sub_group_choices, setup_required_dungeon_groups +from source.enemizer.SpriteSheets import randomize_underworld_sprite_sheets, randomize_overworld_sprite_sheets +from source.enemizer.TilePattern import tile_patterns water_rooms = { 0x16, 0x28, 0x34, 0x36, 0x38, 0x46, 0x66 @@ -52,7 +56,7 @@ def setup_specific_requirements(data_tables): if requirement.good_for_uw_water(): water_groups.update(requirement.groups) for i in range(0, 4): - limited = [x for x in requirement.sub_groups[i] if x in uw_sub_group_choices[i]] + limited = [x for x in requirement.sub_groups[i] if x in sub_group_choices[i]] water_sub_groups[i].update(limited) if requirement.good_for_shutter(): killable_groups.update(requirement.groups) @@ -76,7 +80,7 @@ def get_possible_sheets(room_id, data_tables, specific, uw_sheets): killable_needed = room_id in shutter_sprites water_needed = room_id in water_rooms - for sheet in data_tables.sprite_sheets.values(): + for sheet in uw_sheets: if room_id in sheet.room_set: return [sheet] @@ -156,7 +160,18 @@ def get_possible_sheets(room_id, data_tables, specific, uw_sheets): return possible_sheets -def uw_candidate_sprites(data_tables): +def get_possible_ow_sheets(area_id, ow_sheets): + # requirements = data_tables.sprite_requirements + + for sheet in ow_sheets: + if area_id in sheet.room_set: + return [sheet] + + # not sure I need to match anything else at this point + return ow_sheets + + +def find_candidate_sprites(data_tables, sheet_range): requirements = data_tables.sprite_requirements uw_sprite_candidates = [] uw_sheet_candidates = [] @@ -173,7 +188,7 @@ def uw_candidate_sprites(data_tables): candidate_sub_groups[i].update(r.sub_groups[i]) uw_sprite_candidates.append(k) - for num in range(65, 124): + for num in sheet_range: sheet = data_tables.sprite_sheets[num] if candidate_groups and sheet not in candidate_groups: continue @@ -196,6 +211,17 @@ def get_possible_enemy_sprites(room_id, sheet, uw_sprites, data_tables): return ret +def get_possible_enemy_sprites_ow(sheet, sprites, data_tables): + ret = [] + for sprite in sprites: + requirement = data_tables.sprite_requirements[sprite] + if isinstance(requirement, dict): + continue + if sheet.valid_sprite(requirement): + ret.append(requirement) + return ret + + def get_randomize_able_sprites(room_id, data_tables): sprite_table = {} for idx, sprite in enumerate(data_tables.uw_enemy_table.room_map[room_id]): @@ -211,13 +237,28 @@ def get_randomize_able_sprites(room_id, data_tables): return sprite_table +def get_randomize_able_sprites_ow(area_id, data_tables): + sprite_table = {} + for idx, sprite in enumerate(data_tables.ow_enemy_table[area_id]): + sprite_secondary = 0 if sprite.sub_type != SpriteType.Overlord else sprite.sub_type + key = (sprite.kind, sprite_secondary) + if key not in data_tables.sprite_requirements: + continue + req = data_tables.sprite_requirements[key] + if isinstance(req, dict): + continue + if not req.static and req.can_randomize: + sprite_table[idx] = sprite + return sprite_table + + # RandomizeRooms(optionFlags); def randomize_underworld_rooms(data_tables): # RoomCollection.RandomizeRoomSpriteGroups # randomize room sprite sheets specific = setup_specific_requirements(data_tables) - uw_candidates, uw_sheets = uw_candidate_sprites(data_tables) + uw_candidates, uw_sheets = find_candidate_sprites(data_tables, range(65, 124)) for room_id in range(0, 0x128): if room_id in {0, 1, 3, 6, 7, 0xd, 0x14, 0x1c, 0x20, 0x29, 0x30, 0x33, 0x4d, 0x5a, 0x7F, 0x90, 0xa4, 0xac, 0xc8, 0xde}: @@ -228,26 +269,93 @@ def randomize_underworld_rooms(data_tables): randomizeable_sprites = get_randomize_able_sprites(room_id, data_tables) if randomizeable_sprites: candidate_sheets = get_possible_sheets(room_id, data_tables, specific, uw_sheets) - chosen_sheet = random.choice(candidate_sheets) - data_tables.room_headers[room_id].sprite_sheet = chosen_sheet.id - 0x40 - candidate_sprites = get_possible_enemy_sprites(room_id, chosen_sheet, uw_candidates, data_tables) - if room_id in water_rooms: - water_sprites = [x for x in candidate_sprites if x.water_only] - for i, sprite in randomizeable_sprites.items(): - chosen = random.choice(water_sprites) - sprite.kind = chosen.sprite - else: - # todo: stal sprites - for i, sprite in randomizeable_sprites.items(): - if sprite.drops_item: - key_sprites = [x for x in candidate_sprites if x.good_for_key_drop() and not x.water_only] - chosen = random.choice(key_sprites) - elif room_id in shutter_sprites and i in shutter_sprites[room_id]: - killable_sprite = [x for x in candidate_sprites if x.good_for_shutter() and not x.water_only] - chosen = random.choice(killable_sprite) + done = False + while not done: + chosen_sheet = random.choice(candidate_sheets) + data_tables.room_headers[room_id].sprite_sheet = chosen_sheet.id - 0x40 + candidate_sprites = get_possible_enemy_sprites(room_id, chosen_sheet, uw_candidates, data_tables) + randomized = True + if room_id in water_rooms: + water_sprites = [x for x in candidate_sprites if x.water_only] + if len(water_sprites) == 0: + randomized = False else: - non_water = [x for x in candidate_sprites if not x.water_only] - chosen = random.choice(non_water) - sprite.kind = chosen.sprite + for i, sprite in randomizeable_sprites.items(): + chosen = random.choice(water_sprites) + sprite.kind = chosen.sprite + else: + # todo: stal sprites + for i, sprite in randomizeable_sprites.items(): + if sprite.drops_item: + choice_list = [x for x in candidate_sprites if x.good_for_key_drop() and not x.water_only] + elif room_id in shutter_sprites and i in shutter_sprites[room_id]: + choice_list = [x for x in candidate_sprites if x.good_for_shutter() and not x.water_only] + else: + choice_list = [x for x in candidate_sprites if not x.water_only] + if len(choice_list) == 0: + randomized = False + break + chosen = random.choice(choice_list) + sprite.kind = chosen.sprite + done = randomized # done with sprites - # done with rooms \ No newline at end of file + # done with rooms + + +def randomize_overworld_enemies(data_tables, randomize_bush_sprites): + # todo: decision on stump/bird + # original kodongo discovery? + # rom.write_byte(snes_to_pc(0x09CF4F), 0x10) //move bird from tree stump in lost woods + ow_candidates, ow_sheets = find_candidate_sprites(data_tables, range(1, 64)) + areas_to_randomize = [0, 2, 3, 5, 7, 0xA, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x1a, 0x1b, 0x1d, 0x1e, 0x22, 0x25, 0x28, 0x29, 0x2A, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x32, 0x33, 0x34, 0x35, 0x37, 0x3a, 0x3b, 0x3c, 0x3f] + area_list = areas_to_randomize + [x + 0x40 for x in areas_to_randomize] # light world + dark world + area_list += [0x80, 0x81] + [x + 0x90 for x in areas_to_randomize] # specials + post aga LW + for area_id in area_list: + randomizeable_sprites = get_randomize_able_sprites_ow(area_id, data_tables) + if randomizeable_sprites: + candidate_sheets = get_possible_ow_sheets(area_id, ow_sheets) + chosen_sheet = random.choice(candidate_sheets) + data_tables.overworld_sprite_sheets[area_id] = chosen_sheet + candidate_sprites = get_possible_enemy_sprites_ow(chosen_sheet, ow_candidates, data_tables) + for i, sprite in randomizeable_sprites.items(): + chosen = random.choice(candidate_sprites) + sprite.kind = chosen + if randomize_bush_sprites: + pass + # todo: randomize the bush sprite + + +def randomize_enemies(world, player): + if world.enemy_shuffle[player] != 'none': + data_tables = world.data_tables[player] + randomize_underworld_sprite_sheets(data_tables.sprite_sheets) + randomize_underworld_rooms(data_tables) + randomize_overworld_sprite_sheets(data_tables.sprite_sheets) + randomize_overworld_enemies(data_tables, world.enemy_shuffle[player] == 'random') + # todo: health shuffle + # todo: damage shuffle + + +def write_enemy_shuffle_settings(world, player, rom): + if world.enemy_shuffle[player] != 'none': + # killable thief + rom.write_byte(snes_to_pc(0x368108), 0xc4) + rom.write_byte(snes_to_pc(0x0DB237), 4) # health value: # todo: thief health value + + # mimic room barriers + data_tables = world.data_tables[player] + mimic_room = data_tables.room_list[0x10c] = Room010C + mimic_room.layer1[40].data[0] = 0x54 # rail adjust + mimic_room.layer1[40].data[1] = 0x9C + mimic_room.layer1[45].data[1] = 0xB0 # block adjust 1 + mimic_room.layer1[47].data[1] = 0xD0 # block adjust 2 + if world.enemy_shuffle[player] == 'random': + rom.write_byte(snes_to_pc(0x368100), 1) # randomize bushes + # random tile pattern + pattern_name, tile_pattern = random.choice(tile_patterns) + rom.write_byte(snes_to_pc(0x9BA1D), len(tile_pattern)) + for idx, pair in enumerate(tile_pattern): + rom.write_byte(snes_to_pc(0x09BA2A + idx), (pair[0] + 3) * 16) + rom.write_byte(snes_to_pc(0x09BA40 + idx), (pair[1] + 4) * 16) diff --git a/source/enemizer/EnemizerTestHarness.py b/source/enemizer/EnemizerTestHarness.py index a05c0d0c..6e52933d 100644 --- a/source/enemizer/EnemizerTestHarness.py +++ b/source/enemizer/EnemizerTestHarness.py @@ -1,4 +1,5 @@ from types import SimpleNamespace +from collections import Counter, defaultdict from source.dungeon.EnemyList import enemy_names, SpriteType from source.enemizer.Enemizer import randomize_underworld_rooms @@ -8,15 +9,35 @@ import RaceRandom as random if __name__ == '__main__': random.seed(42) - world = SimpleNamespace(pottery={1: 'none'}) - data_tables = init_data_tables(world, 1) - randomize_underworld_sprite_sheets(data_tables.sprite_sheets) - randomize_underworld_rooms(data_tables) - for room_id, enemy_list in data_tables.uw_enemy_table.room_map.items(): - print(f'Room {hex(room_id)}:') - for i, sprite in enumerate(enemy_list): - if sprite.sub_type == SpriteType.Overlord: - print(f' Overlord #{i+1} {hex(sprite.kind)}:') - else: - print(f' Enemy #{i+1} {enemy_names[sprite.kind]}:') + stats = defaultdict(Counter) + column_headers = {} + + for trial in range(0, 100): + world = SimpleNamespace(pottery={1: 'none'}) + data_tables = init_data_tables(world, 1) + + randomize_underworld_sprite_sheets(data_tables.sprite_sheets) + randomize_underworld_rooms(data_tables) + for room_id, enemy_list in data_tables.uw_enemy_table.room_map.items(): + # print(f'Room {hex(room_id)}:') + for i, sprite in enumerate(enemy_list): + if sprite.sub_type == SpriteType.Overlord: + result = f'O{hex(sprite.kind)}' + else: + result = enemy_names[sprite.kind] + if result not in column_headers: + column_headers[result] = None + stats[(room_id, i)][result] += 1 + with open('result.csv', 'w') as result_file: + result_file.write('room_id,slot,') + result_file.write(','.join(column_headers.keys())) + result_file.write('\n') + + for key, counter in stats.items(): + rid, slot = key + result_file.write(f'{rid},{slot}') + for result_item in column_headers.keys(): + result_file.write(f',{counter[result_item]}') + result_file.write('\n') + diff --git a/source/enemizer/OwEnemyList.py b/source/enemizer/OwEnemyList.py new file mode 100644 index 00000000..03c6b2b3 --- /dev/null +++ b/source/enemizer/OwEnemyList.py @@ -0,0 +1,1026 @@ +from source.dungeon.EnemyList import Sprite, EnemySprite +vanilla_sprites_ow = {} + + +def create_sprite(area_id, kind, tile_x, tile_y, region=None, address=None): + if area_id not in vanilla_sprites_ow: + vanilla_sprites_ow[area_id] = [] + sprite = Sprite(area_id, kind, 0, 0, tile_x, tile_y, region, False, None) + sprite.original_address = address + vanilla_sprites_ow[area_id].append(sprite) + + +def init_vanilla_sprites_ow(): + create_sprite(0x21b, EnemySprite.LightningGate, 0x1F, 0x06, '', 0x09CB42) + create_sprite(0x21b, EnemySprite.TutorialGuard, 0x01, 0x12, '', 0x09CB45) + create_sprite(0x21b, EnemySprite.TutorialGuard, 0x01, 0x14, '', 0x09CB48) + create_sprite(0x21b, EnemySprite.GreenGuard, 0x1F, 0x13, '', 0x09CB4B) + create_sprite(0x21b, EnemySprite.GreenKnifeGuard, 0x1F, 0x1A, '', 0x09CB4E) + create_sprite(0x21b, EnemySprite.GreenKnifeGuard, 0x20, 0x1A, '', 0x09CB51) + create_sprite(0x21b, EnemySprite.TutorialGuard, 0x2D, 0x25, '', 0x09CB54) + create_sprite(0x21b, EnemySprite.TutorialGuard, 0x20, 0x29, '', 0x09CB57) + create_sprite(0x21d, EnemySprite.Apple, 0x0B, 0x06, '', 0x09CB5B) + create_sprite(0x22b, EnemySprite.TutorialGuard, 0x09, 0x1E, '', 0x09CB5F) + create_sprite(0x22b, EnemySprite.TutorialGuard, 0x0B, 0x1E, '', 0x09CB62) + create_sprite(0x22c, EnemySprite.TutorialGuard, 0x1E, 0x18, '', 0x09CB66) + create_sprite(0x22c, EnemySprite.TutorialGuard, 0x1E, 0x1A, '', 0x09CB69) + create_sprite(0x22c, EnemySprite.TutorialGuard, 0x0D, 0x1E, '', 0x09CB6C) + create_sprite(0x22c, EnemySprite.TutorialGuard, 0x0F, 0x1E, '', 0x09CB6F) + create_sprite(0x232, EnemySprite.BombRefill1, 0x1A, 0x09, '', 0x09CB73) + create_sprite(0x232, EnemySprite.SmallHeart, 0x18, 0x12, '', 0x09CB76) + + # Screen40: + # dark world + create_sprite(0x40, EnemySprite.Ropa, 0x1A, 0x07, '', 0x09CB7A) + create_sprite(0x40, EnemySprite.Ropa, 0x12, 0x11, '', 0x09CB7D) + create_sprite(0x40, EnemySprite.Ropa, 0x0A, 0x1E, '', 0x09CB80) + create_sprite(0x40, EnemySprite.Ropa, 0x2F, 0x09, '', 0x09CB83) + create_sprite(0x40, EnemySprite.Snapdragon, 0x31, 0x0A, '', 0x09CB86) + create_sprite(0x40, EnemySprite.Ropa, 0x33, 0x0B, '', 0x09CB89) + create_sprite(0x40, EnemySprite.Ropa, 0x29, 0x14, '', 0x09CB8C) + create_sprite(0x40, EnemySprite.Ropa, 0x23, 0x16, '', 0x09CB8F) + create_sprite(0x40, EnemySprite.Pikit, 0x39, 0x17, '', 0x09CB92) + create_sprite(0x40, EnemySprite.Ropa, 0x0A, 0x21, '', 0x09CB95) + create_sprite(0x40, EnemySprite.Ropa, 0x1A, 0x25, '', 0x09CB98) + create_sprite(0x40, EnemySprite.Pikit, 0x0B, 0x28, '', 0x09CB9B) + create_sprite(0x40, EnemySprite.Ropa, 0x1E, 0x30, '', 0x09CB9E) + create_sprite(0x40, EnemySprite.Ropa, 0x0E, 0x38, '', 0x09CBA1) + create_sprite(0x40, EnemySprite.Ropa, 0x11, 0x38, '', 0x09CBA4) + create_sprite(0x40, EnemySprite.Ropa, 0x1A, 0x39, '', 0x09CBA7) + create_sprite(0x40, EnemySprite.Ropa, 0x2D, 0x21, '', 0x09CBAA) + create_sprite(0x40, EnemySprite.Ropa, 0x32, 0x28, '', 0x09CBAD) + create_sprite(0x40, EnemySprite.Ropa, 0x37, 0x32, '', 0x09CBB0) + create_sprite(0x40, EnemySprite.Pikit, 0x28, 0x37, '', 0x09CBB3) + # Screen42: + create_sprite(0x42, EnemySprite.Snapdragon, 0x0C, 0x11, '', 0x09CBB7) + create_sprite(0x42, EnemySprite.Snapdragon, 0x0C, 0x13, '', 0x09CBBA) + create_sprite(0x42, EnemySprite.Faerie, 0x06, 0x16, '', 0x09CBBD) + create_sprite(0x42, EnemySprite.Moblin, 0x0E, 0x19, '', 0x09CBC0) + # Screen43: + create_sprite(0x43, EnemySprite.Waterfall, 0x2F, 0x0C, '', 0x09CBC4) + create_sprite(0x43, EnemySprite.BullyPinkBall, 0x20, 0x18, '', 0x09CBC7) + # Screen45: + create_sprite(0x45, EnemySprite.Lynel, 0x06, 0x0C, '', 0x09CBCB) + create_sprite(0x45, EnemySprite.Lynel, 0x1D, 0x0E, '', 0x09CBCE) + create_sprite(0x45, EnemySprite.Lynel, 0x20, 0x0B, '', 0x09CBD1) + # Screen47: + create_sprite(0x47, EnemySprite.RupeePull, 0x16, 0x14, '', 0x09CBD5) + # Screen4A: + create_sprite(0x4a, EnemySprite.RupeePull, 0x0E, 0x06, '', 0x09CBD9) + create_sprite(0x4a, EnemySprite.HeartPiece, 0x18, 0x08, '', 0x09CBDC) + create_sprite(0x4a, EnemySprite.Moblin, 0x0B, 0x0F, '', 0x09CBDF) + create_sprite(0x4a, EnemySprite.Moblin, 0x08, 0x10, '', 0x09CBE2) + create_sprite(0x4a, EnemySprite.Moblin, 0x16, 0x13, '', 0x09CBE5) + create_sprite(0x4a, EnemySprite.Raven, 0x13, 0x13, '', 0x09CBE8) + create_sprite(0x4a, EnemySprite.Raven, 0x13, 0x14, '', 0x09CBEB) + create_sprite(0x4a, EnemySprite.Ropa, 0x0E, 0x18, '', 0x09CBEE) + create_sprite(0x4a, EnemySprite.Stal, 0x14, 0x1A, '', 0x09CBF1) + # Screen4F: + create_sprite(0x4f, EnemySprite.FireballZora, 0x19, 0x08, '', 0x09CBF5) + create_sprite(0x4f, EnemySprite.Catfish, 0x04, 0x0B, '', 0x09CBF8) + create_sprite(0x4f, EnemySprite.Stal, 0x18, 0x0D, '', 0x09CBFB) + create_sprite(0x4f, EnemySprite.Ropa, 0x1A, 0x11, '', 0x09CBFE) + # Screen50: + create_sprite(0x50, EnemySprite.Poe, 0x16, 0x0B, '', 0x09CC02) + create_sprite(0x50, EnemySprite.Moblin, 0x05, 0x0C, '', 0x09CC05) + create_sprite(0x50, EnemySprite.TalkingTree, 0x08, 0x0E, '', 0x09CC08) + create_sprite(0x50, EnemySprite.Cucco, 0x19, 0x13, '', 0x09CC0B) + create_sprite(0x50, EnemySprite.Moblin, 0x08, 0x18, '', 0x09CC0E) + # Screen51: + create_sprite(0x51, EnemySprite.UsainBolt, 0x17, 0x0E, '', 0x09CC12) + create_sprite(0x51, EnemySprite.Faerie, 0x08, 0x10, '', 0x09CC15) + create_sprite(0x51, EnemySprite.Faerie, 0x09, 0x10, '', 0x09CC18) + create_sprite(0x51, EnemySprite.Stal, 0x1C, 0x15, '', 0x09CC1B) + create_sprite(0x51, EnemySprite.Moblin, 0x14, 0x16, '', 0x09CC1E) + create_sprite(0x51, EnemySprite.Moblin, 0x0E, 0x17, '', 0x09CC21) + # Screen52: + create_sprite(0x52, EnemySprite.Stal, 0x12, 0x09, '', 0x09CC25) + create_sprite(0x52, EnemySprite.Moblin, 0x15, 0x0D, '', 0x09CC28) + create_sprite(0x52, EnemySprite.BlueGuard, 0x07, 0x10, '', 0x09CC2B) + create_sprite(0x52, EnemySprite.BlueGuard, 0x14, 0x17, '', 0x09CC2E) + create_sprite(0x52, EnemySprite.Moblin, 0x0E, 0x18, '', 0x09CC31) + # Screen53: + create_sprite(0x53, EnemySprite.Stal, 0x06, 0x0B, '', 0x09CC35) + create_sprite(0x53, EnemySprite.Hinox, 0x15, 0x0C, '', 0x09CC38) + create_sprite(0x53, EnemySprite.Ropa, 0x08, 0x0D, '', 0x09CC3B) + create_sprite(0x53, EnemySprite.Moblin, 0x0D, 0x15, '', 0x09CC3E) + create_sprite(0x53, EnemySprite.Snapdragon, 0x16, 0x18, '', 0x09CC41) + # Screen54: + create_sprite(0x54, EnemySprite.Ropa, 0x14, 0x0D, '', 0x09CC45) + create_sprite(0x54, EnemySprite.BombRefill1, 0x05, 0x0B, '', 0x09CC48) + create_sprite(0x54, EnemySprite.RedRupee, 0x19, 0x0B, '', 0x09CC4B) + create_sprite(0x54, EnemySprite.Ropa, 0x07, 0x0F, '', 0x09CC4E) + create_sprite(0x54, EnemySprite.Faerie, 0x0F, 0x0E, '', 0x09CC51) + create_sprite(0x54, EnemySprite.Ropa, 0x19, 0x10, '', 0x09CC54) + create_sprite(0x54, EnemySprite.Ropa, 0x0D, 0x14, '', 0x09CC57) + create_sprite(0x54, EnemySprite.Hinox, 0x11, 0x19, '', 0x09CC5A) + # Screen55: + create_sprite(0x55, EnemySprite.Whirlpool, 0x11, 0x09, '', 0x09CC5E) + create_sprite(0x55, EnemySprite.Hinox, 0x16, 0x0E, '', 0x09CC61) + create_sprite(0x55, EnemySprite.Stal, 0x18, 0x0E, '', 0x09CC64) + create_sprite(0x55, EnemySprite.BlueRupee, 0x1B, 0x0F, '', 0x09CC67) + create_sprite(0x55, EnemySprite.Hinox, 0x07, 0x17, '', 0x09CC6A) + create_sprite(0x55, EnemySprite.Bee, 0x0A, 0x1A, '', 0x09CC6D) + create_sprite(0x55, EnemySprite.Ropa, 0x1A, 0x1B, '', 0x09CC70) + # Screen56: + create_sprite(0x56, EnemySprite.FireballZora, 0x0A, 0x06, '', 0x09CC74) + create_sprite(0x56, EnemySprite.FireballZora, 0x13, 0x0A, '', 0x09CC77) + create_sprite(0x56, EnemySprite.Bee, 0x04, 0x0E, '', 0x09CC7A) + create_sprite(0x56, EnemySprite.Ropa, 0x11, 0x17, '', 0x09CC7D) + create_sprite(0x56, EnemySprite.Ropa, 0x05, 0x1A, '', 0x09CC80) + # Screen57: + create_sprite(0x57, EnemySprite.FireballZora, 0x0C, 0x04, '', 0x09CC84) + create_sprite(0x57, EnemySprite.Octorok, 0x16, 0x08, '', 0x09CC87) + create_sprite(0x57, EnemySprite.Octorok, 0x18, 0x0A, '', 0x09CC8A) + create_sprite(0x57, EnemySprite.Octorok, 0x0E, 0x0E, '', 0x09CC8D) + create_sprite(0x57, EnemySprite.Stal, 0x0E, 0x10, '', 0x09CC90) + create_sprite(0x57, EnemySprite.Octorok, 0x0E, 0x1A, '', 0x09CC93) + create_sprite(0x57, EnemySprite.Octorok, 0x0D, 0x1B, '', 0x09CC96) + # Screen58: + create_sprite(0x58, EnemySprite.Moblin, 0x13, 0x06, '', 0x09CC9A) + create_sprite(0x58, EnemySprite.TalkingTree, 0x18, 0x0C, '', 0x09CC9D) + create_sprite(0x58, EnemySprite.BlueGuard, 0x07, 0x1C, '', 0x09CCA0) + create_sprite(0x58, EnemySprite.Moblin, 0x35, 0x0A, '', 0x09CCA3) + create_sprite(0x58, EnemySprite.Poe, 0x2B, 0x0C, '', 0x09CCA6) + create_sprite(0x58, EnemySprite.Thief, 0x2E, 0x17, '', 0x09CCA9) + create_sprite(0x58, EnemySprite.ThievesTownGrate, 0x20, 0x1C, '', 0x09CCAC) + create_sprite(0x58, EnemySprite.Poe, 0x18, 0x25, '', 0x09CCAF) + create_sprite(0x58, EnemySprite.Thief, 0x0D, 0x27, '', 0x09CCB2) + create_sprite(0x58, EnemySprite.Poe, 0x1D, 0x28, '', 0x09CCB5) + create_sprite(0x58, EnemySprite.Moblin, 0x12, 0x2E, '', 0x09CCB8) + create_sprite(0x58, EnemySprite.Cucco, 0x16, 0x34, '', 0x09CCBB) + create_sprite(0x58, EnemySprite.Cucco, 0x15, 0x37, '', 0x09CCBE) + create_sprite(0x58, EnemySprite.Cucco, 0x28, 0x27, '', 0x09CCC1) + create_sprite(0x58, EnemySprite.BlueGuard, 0x33, 0x2F, '', 0x09CCC4) + create_sprite(0x58, EnemySprite.Poe, 0x2C, 0x34, '', 0x09CCC7) + create_sprite(0x58, EnemySprite.TalkingTree, 0x37, 0x35, '', 0x09CCCA) + # Screen5A: + create_sprite(0x5a, EnemySprite.Moblin, 0x0F, 0x08, '', 0x09CCCE) + create_sprite(0x5a, EnemySprite.TalkingTree, 0x12, 0x08, '', 0x09CCD1) + create_sprite(0x5a, EnemySprite.Stal, 0x12, 0x0D, '', 0x09CCD4) + create_sprite(0x5a, EnemySprite.Moblin, 0x15, 0x0C, '', 0x09CCD7) + create_sprite(0x5a, EnemySprite.Hinox, 0x0B, 0x0F, '', 0x09CCDA) + create_sprite(0x5a, EnemySprite.Moblin, 0x0E, 0x19, '', 0x09CCDD) + # Screen5B: + create_sprite(0x5b, EnemySprite.Ropa, 0x15, 0x17, '', 0x09CCE1) + create_sprite(0x5b, EnemySprite.HeartPiece, 0x34, 0x12, '', 0x09CCE4) + create_sprite(0x5b, EnemySprite.RupeePull, 0x13, 0x24, '', 0x09CCE7) + create_sprite(0x5b, EnemySprite.Moblin, 0x0F, 0x27, '', 0x09CCEA) + create_sprite(0x5b, EnemySprite.Faerie, 0x17, 0x2A, '', 0x09CCED) + create_sprite(0x5b, EnemySprite.Moblin, 0x0C, 0x2A, '', 0x09CCF0) + create_sprite(0x5b, EnemySprite.Hinox, 0x1E, 0x2C, '', 0x09CCF3) + create_sprite(0x5b, EnemySprite.Snapdragon, 0x34, 0x25, '', 0x09CCF6) + create_sprite(0x5b, EnemySprite.Moblin, 0x32, 0x27, '', 0x09CCF9) + create_sprite(0x5b, EnemySprite.Moblin, 0x30, 0x29, '', 0x09CCFC) + create_sprite(0x5b, EnemySprite.Hinox, 0x21, 0x2C, '', 0x09CCFF) + # Screen5D: + create_sprite(0x5d, EnemySprite.TalkingTree, 0x0B, 0x08, '', 0x09CD03) + create_sprite(0x5d, EnemySprite.Hinox, 0x07, 0x09, '', 0x09CD06) + create_sprite(0x5d, EnemySprite.Snapdragon, 0x06, 0x0B, '', 0x09CD09) + create_sprite(0x5d, EnemySprite.Moblin, 0x18, 0x0B, '', 0x09CD0C) + create_sprite(0x5d, EnemySprite.Stal, 0x17, 0x0E, '', 0x09CD0F) + create_sprite(0x5d, EnemySprite.Moblin, 0x1A, 0x10, '', 0x09CD12) + create_sprite(0x5d, EnemySprite.BlueGuard, 0x08, 0x11, '', 0x09CD15) + # Screen5E: + create_sprite(0x5e, EnemySprite.Ropa, 0x0D, 0x04, '', 0x09CD19) + create_sprite(0x5e, EnemySprite.Ropa, 0x03, 0x11, '', 0x09CD1C) + create_sprite(0x5e, EnemySprite.Kiki, 0x15, 0x11, '', 0x09CD1F) + create_sprite(0x5e, EnemySprite.Ropa, 0x12, 0x1A, '', 0x09CD22) + create_sprite(0x5e, EnemySprite.Ropa, 0x27, 0x09, '', 0x09CD25) + create_sprite(0x5e, EnemySprite.Ropa, 0x2F, 0x10, '', 0x09CD28) + create_sprite(0x5e, EnemySprite.Moblin, 0x25, 0x15, '', 0x09CD2B) + create_sprite(0x5e, EnemySprite.Hinox, 0x26, 0x17, '', 0x09CD2E) + create_sprite(0x5e, EnemySprite.Ropa, 0x35, 0x18, '', 0x09CD31) + create_sprite(0x5e, EnemySprite.Ropa, 0x2A, 0x1E, '', 0x09CD34) + create_sprite(0x5e, EnemySprite.Moblin, 0x0A, 0x26, '', 0x09CD37) + create_sprite(0x5e, EnemySprite.Moblin, 0x0C, 0x2B, '', 0x09CD3A) + create_sprite(0x5e, EnemySprite.Ropa, 0x07, 0x35, '', 0x09CD3D) + create_sprite(0x5e, EnemySprite.Hinox, 0x16, 0x37, '', 0x09CD40) + create_sprite(0x5e, EnemySprite.Snapdragon, 0x09, 0x38, '', 0x09CD43) + create_sprite(0x5e, EnemySprite.Moblin, 0x32, 0x24, '', 0x09CD46) + create_sprite(0x5e, EnemySprite.Snapdragon, 0x35, 0x28, '', 0x09CD49) + create_sprite(0x5e, EnemySprite.Ropa, 0x24, 0x30, '', 0x09CD4C) + create_sprite(0x5e, EnemySprite.Faerie, 0x30, 0x30, '', 0x09CD4F) + create_sprite(0x5e, EnemySprite.Hinox, 0x35, 0x36, '', 0x09CD52) + create_sprite(0x5e, EnemySprite.Raven, 0x29, 0x37, '', 0x09CD55) + # Screen62: + create_sprite(0x62, EnemySprite.PurpleChest, 0x0D, 0x05, '', 0x09CD59) + create_sprite(0x62, EnemySprite.Cucco, 0x13, 0x11, '', 0x09CD5C) + create_sprite(0x62, EnemySprite.Cucco, 0x11, 0x13, '', 0x09CD5F) + create_sprite(0x62, EnemySprite.Cucco, 0x15, 0x15, '', 0x09CD62) + create_sprite(0x62, EnemySprite.Cucco, 0x09, 0x16, '', 0x09CD65) + create_sprite(0x62, EnemySprite.Cucco, 0x11, 0x17, '', 0x09CD68) + # Screen65: + create_sprite(0x65, EnemySprite.Moblin, 0x13, 0x07, '', 0x09CD6C) + create_sprite(0x65, EnemySprite.Stal, 0x0F, 0x0A, '', 0x09CD6F) + create_sprite(0x65, EnemySprite.Moblin, 0x0E, 0x0C, '', 0x09CD72) + create_sprite(0x65, EnemySprite.Hinox, 0x05, 0x11, '', 0x09CD75) + create_sprite(0x65, EnemySprite.Moblin, 0x0A, 0x16, '', 0x09CD78) + create_sprite(0x65, EnemySprite.Moblin, 0x13, 0x16, '', 0x09CD7B) + # Screen68: + create_sprite(0x68, EnemySprite.DiggingGameNPC, 0x0E, 0x11, '', 0x09CD7F) + # Screen69: + create_sprite(0x69, EnemySprite.Smithy, 0x06, 0x09, '', 0x09CD83) + # Screen6A: + create_sprite(0x6a, EnemySprite.FluteKid, 0x0E, 0x0F, '', 0x09CD87) + # Screen6B: + create_sprite(0x6b, EnemySprite.TalkingTree, 0x16, 0x08, '', 0x09CD8B) + create_sprite(0x6b, EnemySprite.Ropa, 0x08, 0x09, '', 0x09CD8E) + create_sprite(0x6b, EnemySprite.TalkingTree, 0x17, 0x0F, '', 0x09CD91) + create_sprite(0x6b, EnemySprite.Moblin, 0x13, 0x16, '', 0x09CD94) + create_sprite(0x6b, EnemySprite.Moblin, 0x0F, 0x19, '', 0x09CD97) + # Screen6C: + create_sprite(0x6c, EnemySprite.Snapdragon, 0x15, 0x06, '', 0x09CD9B) + create_sprite(0x6c, EnemySprite.Moblin, 0x15, 0x0A, '', 0x09CD9E) + create_sprite(0x6c, EnemySprite.Moblin, 0x14, 0x0D, '', 0x09CDA1) + create_sprite(0x6c, EnemySprite.Hinox, 0x14, 0x16, '', 0x09CDA4) + create_sprite(0x6c, EnemySprite.Ropa, 0x09, 0x19, '', 0x09CDA7) + # Screen6D: + create_sprite(0x6d, EnemySprite.Ropa, 0x0F, 0x05, '', 0x09CDAB) + create_sprite(0x6d, EnemySprite.Hinox, 0x0D, 0x07, '', 0x09CDAE) + create_sprite(0x6d, EnemySprite.BlueGuard, 0x12, 0x08, '', 0x09CDB1) + create_sprite(0x6d, EnemySprite.BlueGuard, 0x10, 0x0A, '', 0x09CDB4) + create_sprite(0x6d, EnemySprite.Stal, 0x10, 0x1A, '', 0x09CDB7) + create_sprite(0x6d, EnemySprite.Stal, 0x13, 0x1B, '', 0x09CDBA) + # Screen6E: + create_sprite(0x6e, EnemySprite.BlueRupee, 0x0C, 0x08, '', 0x09CDBE) + create_sprite(0x6e, EnemySprite.Bee, 0x10, 0x09, '', 0x09CDC1) + create_sprite(0x6e, EnemySprite.Apple, 0x14, 0x0A, '', 0x09CDC4) + create_sprite(0x6e, EnemySprite.BlueGuard, 0x08, 0x0B, '', 0x09CDC7) + create_sprite(0x6e, EnemySprite.BlueGuard, 0x10, 0x0E, '', 0x09CDCA) + create_sprite(0x6e, EnemySprite.Ropa, 0x1A, 0x18, '', 0x09CDCD) + # Screen6F: + create_sprite(0x6f, EnemySprite.Snapdragon, 0x0D, 0x08, '', 0x09CDD1) + create_sprite(0x6f, EnemySprite.Snapdragon, 0x0F, 0x08, '', 0x09CDD4) + create_sprite(0x6f, EnemySprite.Snapdragon, 0x0E, 0x0B, '', 0x09CDD7) + create_sprite(0x6f, EnemySprite.Raven, 0x17, 0x0C, '', 0x09CDDA) + create_sprite(0x6f, EnemySprite.Stal, 0x09, 0x17, '', 0x09CDDD) + # Screen70: + create_sprite(0x70, EnemySprite.Raven, 0x21, 0x1B, '', 0x09CDE1) + create_sprite(0x70, EnemySprite.FireballZora, 0x2B, 0x1C, '', 0x09CDE4) + create_sprite(0x70, EnemySprite.FireballZora, 0x12, 0x21, '', 0x09CDE7) + create_sprite(0x70, EnemySprite.Swamola, 0x1B, 0x24, '', 0x09CDEA) + create_sprite(0x70, EnemySprite.Swamola, 0x10, 0x27, '', 0x09CDED) + create_sprite(0x70, EnemySprite.Raven, 0x07, 0x28, '', 0x09CDF0) + create_sprite(0x70, EnemySprite.FireballZora, 0x16, 0x2B, '', 0x09CDF3) + create_sprite(0x70, EnemySprite.FireballZora, 0x1E, 0x2E, '', 0x09CDF6) + create_sprite(0x70, EnemySprite.Swamola, 0x17, 0x33, '', 0x09CDF9) + create_sprite(0x70, EnemySprite.FireballZora, 0x11, 0x38, '', 0x09CDFC) + create_sprite(0x70, EnemySprite.FireballZora, 0x23, 0x2B, '', 0x09CDFF) + create_sprite(0x70, EnemySprite.Swamola, 0x27, 0x2C, '', 0x09CE02) + # Screen72: + create_sprite(0x72, EnemySprite.TalkingTree, 0x1B, 0x0B, '', 0x09CE06) + create_sprite(0x72, EnemySprite.BlueGuard, 0x10, 0x0D, '', 0x09CE09) + create_sprite(0x72, EnemySprite.BlueGuard, 0x13, 0x0E, '', 0x09CE0C) + create_sprite(0x72, EnemySprite.TalkingTree, 0x1A, 0x14, '', 0x09CE0F) + create_sprite(0x72, EnemySprite.Ropa, 0x0B, 0x17, '', 0x09CE12) + # Screen73: + create_sprite(0x73, EnemySprite.Pikit, 0x17, 0x0C, '', 0x09CE16) + create_sprite(0x73, EnemySprite.Moblin, 0x09, 0x0D, '', 0x09CE19) + create_sprite(0x73, EnemySprite.GreenZirro, 0x14, 0x0E, '', 0x09CE1C) + create_sprite(0x73, EnemySprite.GreenZirro, 0x15, 0x1A, '', 0x09CE1F) + create_sprite(0x73, EnemySprite.BlueZirro, 0x1B, 0x1B, '', 0x09CE22) + # Screen74: + create_sprite(0x74, EnemySprite.Moblin, 0x0B, 0x0D, '', 0x09CE26) + create_sprite(0x74, EnemySprite.RupeePull, 0x17, 0x0E, '', 0x09CE29) + create_sprite(0x74, EnemySprite.GreenZirro, 0x10, 0x11, '', 0x09CE2C) + create_sprite(0x74, EnemySprite.Moblin, 0x15, 0x11, '', 0x09CE2F) + create_sprite(0x74, EnemySprite.Pikit, 0x0A, 0x12, '', 0x09CE32) + create_sprite(0x74, EnemySprite.Apple, 0x0E, 0x14, '', 0x09CE35) + create_sprite(0x74, EnemySprite.Moblin, 0x11, 0x17, '', 0x09CE38) + # Screen75: + create_sprite(0x75, EnemySprite.Stal, 0x0A, 0x05, '', 0x09CE3C) + create_sprite(0x75, EnemySprite.BlueGuard, 0x09, 0x07, '', 0x09CE3F) + create_sprite(0x75, EnemySprite.BlueGuard, 0x0B, 0x09, '', 0x09CE42) + create_sprite(0x75, EnemySprite.Octorok, 0x07, 0x13, '', 0x09CE45) + create_sprite(0x75, EnemySprite.GreenZirro, 0x18, 0x16, '', 0x09CE48) + create_sprite(0x75, EnemySprite.Pikit, 0x09, 0x17, '', 0x09CE4B) + create_sprite(0x75, EnemySprite.FireballZora, 0x30, 0x0C, '', 0x09CE4E) + create_sprite(0x75, EnemySprite.BlueZirro, 0x29, 0x11, '', 0x09CE51) + create_sprite(0x75, EnemySprite.GreenZirro, 0x36, 0x15, '', 0x09CE54) + create_sprite(0x75, EnemySprite.Pikit, 0x31, 0x1F, '', 0x09CE57) + create_sprite(0x75, EnemySprite.FireballZora, 0x1B, 0x22, '', 0x09CE5A) + create_sprite(0x75, EnemySprite.GreenZirro, 0x14, 0x28, '', 0x09CE5D) + create_sprite(0x75, EnemySprite.Pikit, 0x16, 0x2E, '', 0x09CE60) + create_sprite(0x75, EnemySprite.GreenZirro, 0x19, 0x32, '', 0x09CE63) + create_sprite(0x75, EnemySprite.BlueZirro, 0x0A, 0x35, '', 0x09CE66) + create_sprite(0x75, EnemySprite.Ropa, 0x08, 0x39, '', 0x09CE69) + create_sprite(0x75, EnemySprite.FireballZora, 0x1B, 0x39, '', 0x09CE6C) + create_sprite(0x75, EnemySprite.Pikit, 0x2A, 0x26, '', 0x09CE6F) + create_sprite(0x75, EnemySprite.GreenZirro, 0x32, 0x28, '', 0x09CE72) + create_sprite(0x75, EnemySprite.FireballZora, 0x2A, 0x2C, '', 0x09CE75) + create_sprite(0x75, EnemySprite.FireballZora, 0x32, 0x35, '', 0x09CE78) + create_sprite(0x75, EnemySprite.Octorok, 0x37, 0x39, '', 0x09CE7B) + # Screen77: + create_sprite(0x77, EnemySprite.Octorok, 0x11, 0x08, '', 0x09CE7F) + create_sprite(0x77, EnemySprite.Stal, 0x09, 0x0A, '', 0x09CE82) + create_sprite(0x77, EnemySprite.BlueZirro, 0x0D, 0x0B, '', 0x09CE85) + create_sprite(0x77, EnemySprite.Octorok, 0x18, 0x11, '', 0x09CE88) + create_sprite(0x77, EnemySprite.FireballZora, 0x07, 0x12, '', 0x09CE8B) + create_sprite(0x77, EnemySprite.FireballZora, 0x12, 0x19, '', 0x09CE8E) + # Screen7A: + create_sprite(0x7a, EnemySprite.Hinox, 0x06, 0x07, '', 0x09CE92) + create_sprite(0x7a, EnemySprite.Ropa, 0x16, 0x09, '', 0x09CE95) + create_sprite(0x7a, EnemySprite.Ropa, 0x14, 0x0B, '', 0x09CE98) + create_sprite(0x7a, EnemySprite.Ropa, 0x16, 0x0B, '', 0x09CE9B) + # Screen7B: + create_sprite(0x7b, EnemySprite.BlueZirro, 0x12, 0x06, '', 0x09CE9F) + create_sprite(0x7b, EnemySprite.Pikit, 0x16, 0x0A, '', 0x09CEA2) + create_sprite(0x7b, EnemySprite.Moblin, 0x0D, 0x0F, '', 0x09CEA5) + create_sprite(0x7b, EnemySprite.Stal, 0x0A, 0x10, '', 0x09CEA8) + create_sprite(0x7b, EnemySprite.Moblin, 0x13, 0x14, '', 0x09CEAB) + create_sprite(0x7b, EnemySprite.Ropa, 0x16, 0x18, '', 0x09CEAE) + # Screen7C: + create_sprite(0x7c, EnemySprite.Stal, 0x03, 0x05, '', 0x09CEB2) + create_sprite(0x7c, EnemySprite.BlueGuard, 0x07, 0x06, '', 0x09CEB5) + create_sprite(0x7c, EnemySprite.RupeePull, 0x0F, 0x06, '', 0x09CEB8) + create_sprite(0x7c, EnemySprite.Hinox, 0x11, 0x11, '', 0x09CEBB) + create_sprite(0x7c, EnemySprite.Ropa, 0x18, 0x15, '', 0x09CEBE) + create_sprite(0x7c, EnemySprite.Ropa, 0x16, 0x19, '', 0x09CEC1) + # Screen7F: + create_sprite(0x7f, EnemySprite.GreenZirro, 0x10, 0x06, '', 0x09CEC5) + create_sprite(0x7f, EnemySprite.Octorok, 0x16, 0x06, '', 0x09CEC8) + create_sprite(0x7f, EnemySprite.Whirlpool, 0x07, 0x0C, '', 0x09CECB) + create_sprite(0x7f, EnemySprite.FireballZora, 0x07, 0x0E, '', 0x09CECE) + create_sprite(0x7f, EnemySprite.GreenZirro, 0x0D, 0x13, '', 0x09CED1) + create_sprite(0x7f, EnemySprite.Pikit, 0x16, 0x14, '', 0x09CED4) + create_sprite(0x7f, EnemySprite.Octorok, 0x0F, 0x17, '', 0x09CED7) + # Screen80: + create_sprite(0x80, EnemySprite.MasterSword, 0x07, 0x08, '', 0x09CEDB) + create_sprite(0x80, EnemySprite.PedestalPlaque, 0x07, 0x0A, '', 0x09CEDE) + create_sprite(0x80, EnemySprite.LostWoodsSquirrel, 0x0F, 0x14, '', 0x09CEE1) + create_sprite(0x80, EnemySprite.LostWoodsBird, 0x00, 0x16, '', 0x09CEE4) + create_sprite(0x80, EnemySprite.LostWoodsSquirrel, 0x02, 0x18, '', 0x09CEE7) + create_sprite(0x80, EnemySprite.LostWoodsBird, 0x0E, 0x1A, '', 0x09CEEA) + create_sprite(0x80, EnemySprite.LostWoodsSquirrel, 0x0F, 0x1B, '', 0x09CEED) + create_sprite(0x80, EnemySprite.Hobo, 0x16, 0x04, '', 0x09CEF0) + # Screen81: + create_sprite(0x81, EnemySprite.HeartPiece, 0x1B, 0x26, '', 0x09CEF4) + create_sprite(0x81, EnemySprite.Zora, 0x0A, 0x06, '', 0x09CEF7) + create_sprite(0x81, EnemySprite.Zora, 0x1C, 0x06, '', 0x09CEFA) + create_sprite(0x81, EnemySprite.FireballZora, 0x11, 0x07, '', 0x09CEFD) + create_sprite(0x81, EnemySprite.Zora, 0x16, 0x0A, '', 0x09CF00) + create_sprite(0x81, EnemySprite.FireballZora, 0x1A, 0x0A, '', 0x09CF03) + create_sprite(0x81, EnemySprite.FireballZora, 0x09, 0x0C, '', 0x09CF06) + create_sprite(0x81, EnemySprite.FireballZora, 0x12, 0x0D, '', 0x09CF09) + create_sprite(0x81, EnemySprite.Zora, 0x1A, 0x12, '', 0x09CF0C) + create_sprite(0x81, EnemySprite.Zora, 0x07, 0x13, '', 0x09CF0F) + create_sprite(0x81, EnemySprite.Zora, 0x14, 0x13, '', 0x09CF12) + create_sprite(0x81, EnemySprite.Zora, 0x08, 0x18, '', 0x09CF15) + create_sprite(0x81, EnemySprite.Zora, 0x04, 0x1C, '', 0x09CF18) + create_sprite(0x81, EnemySprite.KingZora, 0x3B, 0x04, '', 0x09CF1B) + create_sprite(0x81, EnemySprite.FireballZora, 0x27, 0x08, '', 0x09CF1E) + create_sprite(0x81, EnemySprite.FireballZora, 0x2D, 0x08, '', 0x09CF21) + create_sprite(0x81, EnemySprite.Zora, 0x22, 0x0E, '', 0x09CF24) + create_sprite(0x81, EnemySprite.FireballZora, 0x2D, 0x0E, '', 0x09CF27) + create_sprite(0x81, EnemySprite.FireballZora, 0x21, 0x14, '', 0x09CF2A) + create_sprite(0x81, EnemySprite.Zora, 0x0D, 0x20, '', 0x09CF2D) + create_sprite(0x81, EnemySprite.Zora, 0x08, 0x31, '', 0x09CF30) + create_sprite(0x81, EnemySprite.FireballZora, 0x14, 0x31, '', 0x09CF33) + create_sprite(0x81, EnemySprite.Zora, 0x0C, 0x33, '', 0x09CF36) + create_sprite(0x81, EnemySprite.FireballZora, 0x0E, 0x35, '', 0x09CF39) + create_sprite(0x81, EnemySprite.Zora, 0x08, 0x38, '', 0x09CF3C) + create_sprite(0x81, EnemySprite.Zora, 0x3B, 0x28, '', 0x09CF3F) + create_sprite(0x81, EnemySprite.Zora, 0x3A, 0x2B, '', 0x09CF42) + create_sprite(0x81, EnemySprite.Zora, 0x2D, 0x35, '', 0x09CF45) + create_sprite(0x81, EnemySprite.Zora, 0x37, 0x36, '', 0x09CF48) + # Screen00_1: + create_sprite(0x0, EnemySprite.FakeMasterSword, 0x07, 0x12, '', 0x09CF4C) + create_sprite(0x0, EnemySprite.Raven, 0x12, 0x0B, '', 0x09CF4F) + create_sprite(0x0, EnemySprite.Mushroom, 0x1E, 0x15, '', 0x09CF52) + create_sprite(0x0, EnemySprite.FakeMasterSword, 0x28, 0x06, '', 0x09CF55) + create_sprite(0x0, EnemySprite.Buzzblob, 0x31, 0x0A, '', 0x09CF58) + create_sprite(0x0, EnemySprite.Raven, 0x2D, 0x0A, '', 0x09CF5B) + create_sprite(0x0, EnemySprite.Hoarder, 0x2A, 0x10, '', 0x09CF5E) + create_sprite(0x0, EnemySprite.FakeMasterSword, 0x39, 0x15, '', 0x09CF61) + create_sprite(0x0, EnemySprite.Thief, 0x0E, 0x22, '', 0x09CF64) + create_sprite(0x0, EnemySprite.Hoarder, 0x1E, 0x2D, '', 0x09CF67) + create_sprite(0x0, EnemySprite.Bee, 0x29, 0x25, '', 0x09CF6A) + create_sprite(0x0, EnemySprite.RupeePull, 0x2A, 0x27, '', 0x09CF6D) + create_sprite(0x0, EnemySprite.Raven, 0x36, 0x2D, '', 0x09CF70) + create_sprite(0x0, EnemySprite.FakeMasterSword, 0x25, 0x35, '', 0x09CF73) + create_sprite(0x0, EnemySprite.Thief, 0x29, 0x35, '', 0x09CF76) + # Screen02_1: + create_sprite(0x2, EnemySprite.Buzzblob, 0x04, 0x13, '', 0x09CF7A) + create_sprite(0x2, EnemySprite.Lumberjacks, 0x0C, 0x13, '', 0x09CF7D) + create_sprite(0x2, EnemySprite.Hoarder, 0x0D, 0x1A, '', 0x09CF80) + # Screen03_1: + create_sprite(0x3, EnemySprite.Boulders, 0x00, 0x00, '', 0x09CF84) + create_sprite(0x3, EnemySprite.MedallionTablet, 0x0B, 0x04, '', 0x09CF87) + create_sprite(0x3, EnemySprite.Deadrock, 0x27, 0x0C, '', 0x09CF8A) + create_sprite(0x3, EnemySprite.HeartPiece, 0x22, 0x16, '', 0x09CF8D) + create_sprite(0x3, EnemySprite.Deadrock, 0x0A, 0x35, '', 0x09CF90) + create_sprite(0x3, EnemySprite.Deadrock, 0x06, 0x36, '', 0x09CF93) + create_sprite(0x3, EnemySprite.Deadrock, 0x0D, 0x3B, '', 0x09CF96) + create_sprite(0x3, EnemySprite.PositionTarget, 0x12, 0x3B, '', 0x09CF99) + create_sprite(0x3, EnemySprite.Deadrock, 0x2C, 0x2D, '', 0x09CF9C) + create_sprite(0x3, EnemySprite.Deadrock, 0x34, 0x33, '', 0x09CF9F) + create_sprite(0x3, EnemySprite.Deadrock, 0x2F, 0x34, '', 0x09CFA2) + # Screen05_1: + create_sprite(0x5, EnemySprite.Deadrock, 0x1E, 0x0E, '', 0x09CFA6) + create_sprite(0x5, EnemySprite.Tektite, 0x1F, 0x0F, '', 0x09CFA9) + create_sprite(0x5, EnemySprite.HeartPiece, 0x2F, 0x03, '', 0x09CFAC) + create_sprite(0x5, EnemySprite.Deadrock, 0x35, 0x0D, '', 0x09CFAF) + create_sprite(0x5, EnemySprite.Tektite, 0x29, 0x0F, '', 0x09CFB2) + create_sprite(0x5, EnemySprite.Deadrock, 0x35, 0x0F, '', 0x09CFB5) + create_sprite(0x5, EnemySprite.Faerie, 0x34, 0x10, '', 0x09CFB8) + create_sprite(0x5, EnemySprite.Tektite, 0x1E, 0x31, '', 0x09CFBB) + create_sprite(0x5, EnemySprite.Tektite, 0x35, 0x2A, '', 0x09CFBE) + create_sprite(0x5, EnemySprite.Deadrock, 0x2A, 0x2F, '', 0x09CFC1) + create_sprite(0x5, EnemySprite.Tektite, 0x2F, 0x2F, '', 0x09CFC4) + create_sprite(0x5, EnemySprite.Deadrock, 0x29, 0x36, '', 0x09CFC7) + create_sprite(0x5, EnemySprite.Deadrock, 0x36, 0x36, '', 0x09CFCA) + # Screen07_1: + create_sprite(0x7, EnemySprite.Deadrock, 0x0E, 0x07, '', 0x09CFCE) + create_sprite(0x7, EnemySprite.Deadrock, 0x0A, 0x0D, '', 0x09CFD1) + create_sprite(0x7, EnemySprite.Deadrock, 0x17, 0x15, '', 0x09CFD4) + create_sprite(0x7, EnemySprite.Deadrock, 0x0F, 0x16, '', 0x09CFD7) + create_sprite(0x7, EnemySprite.Deadrock, 0x12, 0x16, '', 0x09CFDA) + # Screen0A_1: + create_sprite(0xa, EnemySprite.Bee, 0x0E, 0x04, '', 0x09CFDE) + create_sprite(0xa, EnemySprite.RupeePull, 0x0E, 0x06, '', 0x09CFE1) + create_sprite(0xa, EnemySprite.Raven, 0x05, 0x09, '', 0x09CFE4) + create_sprite(0xa, EnemySprite.Buzzblob, 0x10, 0x0D, '', 0x09CFE7) + create_sprite(0xa, EnemySprite.Buzzblob, 0x0B, 0x0E, '', 0x09CFEA) + create_sprite(0xa, EnemySprite.Raven, 0x13, 0x16, '', 0x09CFED) + create_sprite(0xa, EnemySprite.Hoarder, 0x0E, 0x16, '', 0x09CFF0) + create_sprite(0xa, EnemySprite.Buzzblob, 0x16, 0x16, '', 0x09CFF3) + create_sprite(0xa, EnemySprite.Raven, 0x11, 0x17, '', 0x09CFF6) + create_sprite(0xa, EnemySprite.Apple, 0x19, 0x1A, '', 0x09CFF9) + # Screen0F_1: + create_sprite(0xf, EnemySprite.Waterfall, 0x06, 0x02, '', 0x09CFFD) + create_sprite(0xf, EnemySprite.Crab, 0x0D, 0x0D, '', 0x09D000) + create_sprite(0xf, EnemySprite.FireballZora, 0x05, 0x10, '', 0x09D003) + create_sprite(0xf, EnemySprite.Crab, 0x11, 0x12, '', 0x09D006) + create_sprite(0xf, EnemySprite.Whirlpool, 0x08, 0x13, '', 0x09D009) + create_sprite(0xf, EnemySprite.Raven, 0x1C, 0x15, '', 0x09D00C) + create_sprite(0xf, EnemySprite.Octorok4Way, 0x0E, 0x17, '', 0x09D00F) + # Screen10_1: + create_sprite(0x10, EnemySprite.GreenGuard, 0x05, 0x0C, '', 0x09D013) + create_sprite(0x10, EnemySprite.Apple, 0x07, 0x0C, '', 0x09D016) + create_sprite(0x10, EnemySprite.LargeMagic, 0x17, 0x0F, '', 0x09D019) + create_sprite(0x10, EnemySprite.GreenGuard, 0x08, 0x18, '', 0x09D01C) + # Screen11_1: + create_sprite(0x11, EnemySprite.GreenGuard, 0x17, 0x0C, '', 0x09D020) + create_sprite(0x11, EnemySprite.GreenGuard, 0x1A, 0x0D, '', 0x09D023) + create_sprite(0x11, EnemySprite.BombRefill1, 0x08, 0x10, '', 0x09D026) + create_sprite(0x11, EnemySprite.Cucco, 0x08, 0x17, '', 0x09D029) + # Screen12_1: + create_sprite(0x12, EnemySprite.GreenGuard, 0x15, 0x0E, '', 0x09D02D) + create_sprite(0x12, EnemySprite.GreenGuard, 0x07, 0x10, '', 0x09D030) + create_sprite(0x12, EnemySprite.Whirlpool, 0x0F, 0x10, '', 0x09D033) + create_sprite(0x12, EnemySprite.GreenGuard, 0x15, 0x15, '', 0x09D036) + # Screen13_1: + create_sprite(0x13, EnemySprite.Apple, 0x18, 0x09, '', 0x09D03A) + create_sprite(0x13, EnemySprite.GreenGuard, 0x11, 0x17, '', 0x09D03D) + # Screen14_1: + create_sprite(0x14, EnemySprite.RedJavelinGuard, 0x15, 0x11, '', 0x09D041) + create_sprite(0x14, EnemySprite.GreenGuard, 0x11, 0x19, '', 0x09D044) + create_sprite(0x14, EnemySprite.Medusa, 0x08, 0x0C, '', 0x09D047) + create_sprite(0x14, EnemySprite.Medusa, 0x17, 0x11, '', 0x09D04A) + create_sprite(0x14, EnemySprite.Medusa, 0x12, 0x0E, '', 0x09D04D) + # Screen15_1: + create_sprite(0x15, EnemySprite.Whirlpool, 0x11, 0x09, '', 0x09D051) + create_sprite(0x15, EnemySprite.BlueGuard, 0x16, 0x0E, '', 0x09D054) + create_sprite(0x15, EnemySprite.Faerie, 0x1B, 0x0F, '', 0x09D057) + create_sprite(0x15, EnemySprite.BlueGuard, 0x0B, 0x17, '', 0x09D05A) + # Screen16_1: + create_sprite(0x16, EnemySprite.Buzzblob, 0x0D, 0x0A, '', 0x09D05E) + create_sprite(0x16, EnemySprite.Witch, 0x0F, 0x15, '', 0x09D061) + create_sprite(0x16, EnemySprite.Buzzblob, 0x06, 0x18, '', 0x09D064) + # Screen17_1: + create_sprite(0x17, EnemySprite.Buzzblob, 0x18, 0x08, '', 0x09D068) + create_sprite(0x17, EnemySprite.Buzzblob, 0x17, 0x0A, '', 0x09D06B) + create_sprite(0x17, EnemySprite.Buzzblob, 0x0D, 0x0B, '', 0x09D06E) + create_sprite(0x17, EnemySprite.Buzzblob, 0x16, 0x0C, '', 0x09D071) + create_sprite(0x17, EnemySprite.Buzzblob, 0x08, 0x16, '', 0x09D074) + # Screen18_1: + create_sprite(0x18, EnemySprite.Faerie, 0x18, 0x0A, '', 0x09D078) + create_sprite(0x18, EnemySprite.PositionTarget, 0x0C, 0x17, '', 0x09D07B) + create_sprite(0x18, EnemySprite.BottleMerchant, 0x18, 0x16, '', 0x09D07E) + create_sprite(0x18, EnemySprite.OldSnitch, 0x0E, 0x1C, '', 0x09D081) + create_sprite(0x18, EnemySprite.FluteQuest, 0x20, 0x18, '', 0x09D084) + create_sprite(0x18, EnemySprite.PositionTarget, 0x34, 0x1B, '', 0x09D087) + create_sprite(0x18, EnemySprite.RunningNpc, 0x1D, 0x2E, '', 0x09D08A) + create_sprite(0x18, EnemySprite.SweepingLady, 0x19, 0x2C, '', 0x09D08D) + create_sprite(0x18, EnemySprite.KidInKak, 0x18, 0x31, '', 0x09D090) + create_sprite(0x18, EnemySprite.Cucco, 0x16, 0x35, '', 0x09D093) + create_sprite(0x18, EnemySprite.Cucco, 0x18, 0x36, '', 0x09D096) + create_sprite(0x18, EnemySprite.YoungSnitch, 0x33, 0x20, '', 0x09D099) + create_sprite(0x18, EnemySprite.BlueRupee, 0x36, 0x33, '', 0x09D09C) + # Screen1A_1: + create_sprite(0x1a, EnemySprite.BlueGuard, 0x14, 0x0C, '', 0x09D0A0) + create_sprite(0x1a, EnemySprite.GreenGuard, 0x0C, 0x0E, '', 0x09D0A3) + create_sprite(0x1a, EnemySprite.Faerie, 0x0D, 0x11, '', 0x09D0A6) + create_sprite(0x1a, EnemySprite.BlueRupee, 0x17, 0x17, '', 0x09D0A9) + create_sprite(0x1a, EnemySprite.SmallHeart, 0x0A, 0x18, '', 0x09D0AC) + create_sprite(0x1a, EnemySprite.RedSpearGuard, 0x0F, 0x18, '', 0x09D0AF) + # Screen1B_1: + create_sprite(0x1b, EnemySprite.LightningGate, 0x1F, 0x06, '', 0x09D0B3) + create_sprite(0x1b, EnemySprite.RedBushGuard, 0x09, 0x11, '', 0x09D0B6) + create_sprite(0x1b, EnemySprite.RedBushGuard, 0x0A, 0x13, '', 0x09D0B9) + create_sprite(0x1b, EnemySprite.Apple, 0x16, 0x14, '', 0x09D0BC) + create_sprite(0x1b, EnemySprite.BombGuard, 0x0E, 0x19, '', 0x09D0BF) + create_sprite(0x1b, EnemySprite.BlueGuard, 0x1F, 0x1A, '', 0x09D0C2) + create_sprite(0x1b, EnemySprite.RupeePull, 0x29, 0x17, '', 0x09D0C5) + create_sprite(0x1b, EnemySprite.BombGuard, 0x31, 0x19, '', 0x09D0C8) + create_sprite(0x1b, EnemySprite.BlueGuard, 0x20, 0x1A, '', 0x09D0CB) + create_sprite(0x1b, EnemySprite.BombGuard, 0x0E, 0x25, '', 0x09D0CE) + create_sprite(0x1b, EnemySprite.GreenGuard, 0x14, 0x2D, '', 0x09D0D1) + create_sprite(0x1b, EnemySprite.RedJavelinGuard, 0x26, 0x2D, '', 0x09D0D4) + create_sprite(0x1b, EnemySprite.RedJavelinGuard, 0x21, 0x32, '', 0x09D0D7) + # Screen1D_1: + create_sprite(0x1d, EnemySprite.Apple, 0x0B, 0x06, '', 0x09D0DB) + create_sprite(0x1d, EnemySprite.BlueArcher, 0x1B, 0x0C, '', 0x09D0DE) + create_sprite(0x1d, EnemySprite.BlueGuard, 0x07, 0x0D, '', 0x09D0E1) + create_sprite(0x1d, EnemySprite.BlueArcher, 0x1B, 0x0F, '', 0x09D0E4) + create_sprite(0x1d, EnemySprite.Crab, 0x07, 0x12, '', 0x09D0E7) + # Screen1E_1: + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x13, 0x08, '', 0x09D0EB) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x0E, 0x0E, '', 0x09D0EE) + create_sprite(0x1e, EnemySprite.Octorok, 0x11, 0x1A, '', 0x09D0F1) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x19, 0x1A, '', 0x09D0F4) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x33, 0x09, '', 0x09D0F7) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x37, 0x09, '', 0x09D0FA) + create_sprite(0x1e, EnemySprite.BlueGuard, 0x31, 0x10, '', 0x09D0FD) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x2F, 0x17, '', 0x09D100) + create_sprite(0x1e, EnemySprite.Octorok4Way, 0x35, 0x1D, '', 0x09D103) + create_sprite(0x1e, EnemySprite.Octorok4Way, 0x0F, 0x25, '', 0x09D106) + create_sprite(0x1e, EnemySprite.Octorok, 0x09, 0x28, '', 0x09D109) + create_sprite(0x1e, EnemySprite.Octorok, 0x15, 0x2C, '', 0x09D10C) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x14, 0x33, '', 0x09D10F) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x17, 0x33, '', 0x09D112) + create_sprite(0x1e, EnemySprite.Octorok, 0x09, 0x36, '', 0x09D115) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x24, 0x25, '', 0x09D118) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x28, 0x29, '', 0x09D11B) + create_sprite(0x1e, EnemySprite.ArmosStatue, 0x3D, 0x29, '', 0x09D11E) + create_sprite(0x1e, EnemySprite.Octorok, 0x2E, 0x3B, '', 0x09D121) + # Screen22_1: + create_sprite(0x22, EnemySprite.BunnyBeam, 0x0C, 0x04, '', 0x09D125) + create_sprite(0x22, EnemySprite.GreenGuard, 0x17, 0x12, '', 0x09D128) + create_sprite(0x22, EnemySprite.Cucco, 0x12, 0x14, '', 0x09D12B) + # Screen25_1: + create_sprite(0x25, EnemySprite.Octorok, 0x0F, 0x08, '', 0x09D12F) + create_sprite(0x25, EnemySprite.Octorok, 0x05, 0x0C, '', 0x09D132) + create_sprite(0x25, EnemySprite.Octorok, 0x14, 0x0C, '', 0x09D135) + create_sprite(0x25, EnemySprite.Octorok, 0x10, 0x0D, '', 0x09D138) + create_sprite(0x25, EnemySprite.Octorok, 0x0C, 0x11, '', 0x09D13B) + create_sprite(0x25, EnemySprite.Octorok, 0x18, 0x16, '', 0x09D13E) + create_sprite(0x25, EnemySprite.Octorok, 0x08, 0x17, '', 0x09D141) + create_sprite(0x25, EnemySprite.Octorok, 0x10, 0x17, '', 0x09D144) + # Screen28_1: + create_sprite(0x28, EnemySprite.HeartPiece, 0x07, 0x13, '', 0x09D148) + create_sprite(0x28, EnemySprite.RaceGameGuy, 0x08, 0x12, '', 0x09D14B) + create_sprite(0x28, EnemySprite.RaceGameLady, 0x19, 0x18, '', 0x09D14E) + # Screen2A_1: + create_sprite(0x2a, EnemySprite.FluteQuest, 0x09, 0x09, '', 0x09D152) + create_sprite(0x2a, EnemySprite.GroveOstritch, 0x0E, 0x0C, '', 0x09D155) + create_sprite(0x2a, EnemySprite.GroveBird, 0x0D, 0x0E, '', 0x09D158) + create_sprite(0x2a, EnemySprite.FluteKid, 0x0E, 0x0E, '', 0x09D15B) + create_sprite(0x2a, EnemySprite.GroveBird, 0x11, 0x0E, '', 0x09D15E) + create_sprite(0x2a, EnemySprite.GroveRabbit, 0x0C, 0x0F, '', 0x09D161) + create_sprite(0x2a, EnemySprite.GroveRabbit, 0x11, 0x10, '', 0x09D164) + # Screen2B_1: + create_sprite(0x2b, EnemySprite.Faerie, 0x16, 0x0D, '', 0x09D168) + create_sprite(0x2b, EnemySprite.GreenGuard, 0x14, 0x11, '', 0x09D16B) + create_sprite(0x2b, EnemySprite.GreenGuard, 0x14, 0x15, '', 0x09D16E) + create_sprite(0x2b, EnemySprite.GreenGuard, 0x10, 0x17, '', 0x09D171) + # Screen2C_1: + create_sprite(0x2c, EnemySprite.GreenGuard, 0x18, 0x14, '', 0x09D175) + create_sprite(0x2c, EnemySprite.BlueGuard, 0x09, 0x19, '', 0x09D178) + # Screen2D_1: + create_sprite(0x2d, EnemySprite.GreenGuard, 0x13, 0x0B, '', 0x09D17C) + create_sprite(0x2d, EnemySprite.BlueArcher, 0x10, 0x10, '', 0x09D17F) + create_sprite(0x2d, EnemySprite.BlueGuard, 0x12, 0x16, '', 0x09D182) + # Screen2E_1: + create_sprite(0x2e, EnemySprite.BlueGuard, 0x0E, 0x0C, '', 0x09D186) + create_sprite(0x2e, EnemySprite.BlueGuard, 0x17, 0x0E, '', 0x09D189) + create_sprite(0x2e, EnemySprite.FireballZora, 0x05, 0x12, '', 0x09D18C) + create_sprite(0x2e, EnemySprite.Octorok, 0x19, 0x17, '', 0x09D18F) + # Screen2F_1: + create_sprite(0x2f, EnemySprite.BlueGuard, 0x0F, 0x0C, '', 0x09D193) + create_sprite(0x2f, EnemySprite.ArmosStatue, 0x07, 0x17, '', 0x09D196) + create_sprite(0x2f, EnemySprite.ArmosStatue, 0x0C, 0x17, '', 0x09D199) + # Screen30_1: + create_sprite(0x30, EnemySprite.DesertStatue, 0x12, 0x14, '', 0x09D19D) + create_sprite(0x30, EnemySprite.PedestalPlaque, 0x12, 0x19, '', 0x09D1A0) + create_sprite(0x30, EnemySprite.DesertStatue, 0x0E, 0x1C, '', 0x09D1A3) + create_sprite(0x30, EnemySprite.DesertStatue, 0x16, 0x1C, '', 0x09D1A6) + create_sprite(0x30, EnemySprite.Geldman, 0x27, 0x19, '', 0x09D1A9) + create_sprite(0x30, EnemySprite.Vulture, 0x22, 0x1C, '', 0x09D1AC) + create_sprite(0x30, EnemySprite.Geldman, 0x2A, 0x1F, '', 0x09D1AF) + create_sprite(0x30, EnemySprite.Geldman, 0x1D, 0x26, '', 0x09D1B2) + create_sprite(0x30, EnemySprite.Vulture, 0x07, 0x29, '', 0x09D1B5) + create_sprite(0x30, EnemySprite.Geldman, 0x0F, 0x29, '', 0x09D1B8) + create_sprite(0x30, EnemySprite.HeartPiece, 0x06, 0x2A, '', 0x09D1BB) + create_sprite(0x30, EnemySprite.Geldman, 0x1B, 0x2C, '', 0x09D1BE) + create_sprite(0x30, EnemySprite.Geldman, 0x0A, 0x30, '', 0x09D1C1) + create_sprite(0x30, EnemySprite.Geldman, 0x14, 0x35, '', 0x09D1C4) + create_sprite(0x30, EnemySprite.MedallionTablet, 0x37, 0x2B, '', 0x09D1C7) + create_sprite(0x30, EnemySprite.Landmine, 0x36, 0x21, '', 0x09D1CA) + create_sprite(0x30, EnemySprite.Geldman, 0x22, 0x24, '', 0x09D1CD) + create_sprite(0x30, EnemySprite.Landmine, 0x29, 0x25, '', 0x09D1D0) + create_sprite(0x30, EnemySprite.Geldman, 0x20, 0x2C, '', 0x09D1D3) + create_sprite(0x30, EnemySprite.Geldman, 0x23, 0x32, '', 0x09D1D6) + create_sprite(0x30, EnemySprite.Landmine, 0x30, 0x32, '', 0x09D1D9) + create_sprite(0x30, EnemySprite.Vulture, 0x34, 0x33, '', 0x09D1DC) + create_sprite(0x30, EnemySprite.Landmine, 0x2D, 0x3B, '', 0x09D1DF) + # Screen32_1: + create_sprite(0x32, EnemySprite.SmallHeart, 0x1A, 0x09, '', 0x09D1E3) + create_sprite(0x32, EnemySprite.BlueGuard, 0x0B, 0x0B, '', 0x09D1E6) + create_sprite(0x32, EnemySprite.BlueGuard, 0x12, 0x0B, '', 0x09D1E9) + create_sprite(0x32, EnemySprite.Faerie, 0x19, 0x12, '', 0x09D1EC) + # Screen33_1: + create_sprite(0x33, EnemySprite.GreenBushGuard, 0x15, 0x0B, '', 0x09D1F0) + create_sprite(0x33, EnemySprite.BlueArcher, 0x09, 0x0E, '', 0x09D1F3) + create_sprite(0x33, EnemySprite.Whirlpool, 0x17, 0x12, '', 0x09D1F6) + create_sprite(0x33, EnemySprite.Octorok, 0x1A, 0x1B, '', 0x09D1F9) + # Screen34_1: + create_sprite(0x34, EnemySprite.BlueArcher, 0x0B, 0x0D, '', 0x09D1FD) + create_sprite(0x34, EnemySprite.Toppo, 0x15, 0x11, '', 0x09D200) + create_sprite(0x34, EnemySprite.GreenBushGuard, 0x11, 0x12, '', 0x09D203) + create_sprite(0x34, EnemySprite.Raven, 0x08, 0x13, '', 0x09D206) + create_sprite(0x34, EnemySprite.Faerie, 0x0E, 0x13, '', 0x09D209) + create_sprite(0x34, EnemySprite.GreenBushGuard, 0x15, 0x17, '', 0x09D20C) + create_sprite(0x34, EnemySprite.BlueArcher, 0x0C, 0x18, '', 0x09D20F) + # Screen35_1: + create_sprite(0x35, EnemySprite.Raven, 0x0E, 0x07, '', 0x09D213) + create_sprite(0x35, EnemySprite.Octorok, 0x0D, 0x09, '', 0x09D216) + create_sprite(0x35, EnemySprite.BlueArcher, 0x0A, 0x0C, '', 0x09D219) + create_sprite(0x35, EnemySprite.HeartPiece, 0x19, 0x13, '', 0x09D21C) + create_sprite(0x35, EnemySprite.Buzzblob, 0x19, 0x14, '', 0x09D21F) + create_sprite(0x35, EnemySprite.Crab, 0x07, 0x17, '', 0x09D222) + create_sprite(0x35, EnemySprite.FireballZora, 0x11, 0x17, '', 0x09D225) + create_sprite(0x35, EnemySprite.FireballZora, 0x25, 0x0D, '', 0x09D228) + create_sprite(0x35, EnemySprite.Buzzblob, 0x27, 0x1F, '', 0x09D22B) + create_sprite(0x35, EnemySprite.Buzzblob, 0x2F, 0x1F, '', 0x09D22E) + create_sprite(0x35, EnemySprite.Octorok, 0x0A, 0x35, '', 0x09D231) + create_sprite(0x35, EnemySprite.FireballZora, 0x14, 0x35, '', 0x09D234) + create_sprite(0x35, EnemySprite.Raven, 0x0F, 0x35, '', 0x09D237) + create_sprite(0x35, EnemySprite.Octorok, 0x0B, 0x39, '', 0x09D23A) + create_sprite(0x35, EnemySprite.Buzzblob, 0x19, 0x3A, '', 0x09D23D) + create_sprite(0x35, EnemySprite.Crab, 0x11, 0x3B, '', 0x09D240) + create_sprite(0x35, EnemySprite.FireballZora, 0x24, 0x2B, '', 0x09D243) + create_sprite(0x35, EnemySprite.Whirlpool, 0x29, 0x2B, '', 0x09D246) + create_sprite(0x35, EnemySprite.FireballZora, 0x39, 0x31, '', 0x09D249) + create_sprite(0x35, EnemySprite.FireballZora, 0x21, 0x36, '', 0x09D24C) + create_sprite(0x35, EnemySprite.Buzzblob, 0x32, 0x37, '', 0x09D24F) + create_sprite(0x35, EnemySprite.Buzzblob, 0x34, 0x39, '', 0x09D252) + create_sprite(0x35, EnemySprite.Crab, 0x2E, 0x3A, '', 0x09D255) + # Screen37_1: + create_sprite(0x35, EnemySprite.Crab, 0x08, 0x08, '', 0x09D259) + create_sprite(0x35, EnemySprite.Crab, 0x10, 0x08, '', 0x09D25C) + create_sprite(0x37, EnemySprite.Crab, 0x0F, 0x0B, '', 0x09D25F) + create_sprite(0x37, EnemySprite.Crab, 0x16, 0x11, '', 0x09D262) + create_sprite(0x37, EnemySprite.Raven, 0x0C, 0x15, '', 0x09D265) + create_sprite(0x37, EnemySprite.FireballZora, 0x12, 0x19, '', 0x09D268) + # Screen3A_1: + create_sprite(0x3a, EnemySprite.Locksmith, 0x17, 0x05, '', 0x09D26C) + create_sprite(0x3a, EnemySprite.Raven, 0x0E, 0x09, '', 0x09D26F) + create_sprite(0x3a, EnemySprite.Hoarder2, 0x0B, 0x0A, '', 0x09D272) + create_sprite(0x3a, EnemySprite.Hoarder2, 0x18, 0x0E, '', 0x09D275) + # Screen3B_1: + create_sprite(0x3b, EnemySprite.GreenBushGuard, 0x13, 0x06, '', 0x09D279) + create_sprite(0x3b, EnemySprite.BlueArcher, 0x0C, 0x0A, '', 0x09D27C) + create_sprite(0x3b, EnemySprite.FloppingFish, 0x13, 0x0D, '', 0x09D27F) + create_sprite(0x3b, EnemySprite.Raven, 0x08, 0x0B, '', 0x09D282) + create_sprite(0x3b, EnemySprite.HeartPiece, 0x14, 0x0E, '', 0x09D285) + create_sprite(0x3b, EnemySprite.FloppingFish, 0x1B, 0x10, '', 0x09D288) + create_sprite(0x3b, EnemySprite.Toppo, 0x0F, 0x14, '', 0x09D28B) + create_sprite(0x3b, EnemySprite.Raven, 0x14, 0x1B, '', 0x09D28E) + # Screen3C_1: + create_sprite(0x3c, EnemySprite.GreenBushGuard, 0x08, 0x0C, '', 0x09D292) + create_sprite(0x3c, EnemySprite.Octorok, 0x14, 0x0F, '', 0x09D295) + create_sprite(0x3c, EnemySprite.Raven, 0x0E, 0x0F, '', 0x09D298) + create_sprite(0x3c, EnemySprite.Hoarder, 0x09, 0x11, '', 0x09D29B) + create_sprite(0x3c, EnemySprite.Octorok4Way, 0x14, 0x15, '', 0x09D29E) + create_sprite(0x3c, EnemySprite.Crab, 0x16, 0x17, '', 0x09D2A1) + create_sprite(0x3c, EnemySprite.Octorok, 0x0B, 0x18, '', 0x09D2A4) + # Screen3F_1: + create_sprite(0x3f, EnemySprite.Octorok, 0x11, 0x04, '', 0x09D2A8) + create_sprite(0x3f, EnemySprite.Octorok, 0x16, 0x05, '', 0x09D2AB) + create_sprite(0x3f, EnemySprite.FireballZora, 0x08, 0x0B, '', 0x09D2AE) + create_sprite(0x3f, EnemySprite.Whirlpool, 0x07, 0x0C, '', 0x09D2B1) + create_sprite(0x3f, EnemySprite.Octoballoon, 0x10, 0x16, '', 0x09D2B4) + # Screen00_2: + create_sprite(0x90, EnemySprite.BlueGuard, 0x0F, 0x11, '', 0x09D2B8) + create_sprite(0x90, EnemySprite.FakeMasterSword, 0x07, 0x12, '', 0x09D2BB) + create_sprite(0x90, EnemySprite.Mushroom, 0x1E, 0x15, '', 0x09D2BE) + create_sprite(0x90, EnemySprite.Thief, 0x0D, 0x1F, '', 0x09D2C1) + create_sprite(0x90, EnemySprite.FakeMasterSword, 0x28, 0x06, '', 0x09D2C4) + create_sprite(0x90, EnemySprite.RupeePull, 0x2B, 0x08, '', 0x09D2C7) + create_sprite(0x90, EnemySprite.BlueGuard, 0x33, 0x08, '', 0x09D2CA) + create_sprite(0x90, EnemySprite.Thief, 0x2B, 0x0A, '', 0x09D2CD) + create_sprite(0x90, EnemySprite.Buzzblob, 0x31, 0x0A, '', 0x09D2D0) + create_sprite(0x90, EnemySprite.Hoarder, 0x2A, 0x10, '', 0x09D2D3) + create_sprite(0x90, EnemySprite.Hoarder, 0x0D, 0x2C, '', 0x09D2D6) + create_sprite(0x90, EnemySprite.BlueGuard, 0x09, 0x33, '', 0x09D2D9) + create_sprite(0x90, EnemySprite.Bee, 0x29, 0x25, '', 0x09D2DC) + create_sprite(0x90, EnemySprite.Hoarder, 0x28, 0x2F, '', 0x09D2DF) + # Screen02_2: + create_sprite(0x92, EnemySprite.BonkItem, 0x0D, 0x12, '', 0x09D2E3) + # Screen03_2: + create_sprite(0x93, EnemySprite.Boulders, 0x00, 0x00, '', 0x09D2E7) + create_sprite(0x93, EnemySprite.MedallionTablet, 0x0B, 0x04, '', 0x09D2EA) + create_sprite(0x93, EnemySprite.Tektite, 0x10, 0x1A, '', 0x09D2ED) + create_sprite(0x93, EnemySprite.Tektite, 0x1A, 0x1E, '', 0x09D2F0) + create_sprite(0x93, EnemySprite.Deadrock, 0x27, 0x0C, '', 0x09D2F3) + create_sprite(0x93, EnemySprite.Tektite, 0x2C, 0x15, '', 0x09D2F6) + create_sprite(0x93, EnemySprite.HeartPiece, 0x22, 0x16, '', 0x09D2F9) + create_sprite(0x93, EnemySprite.Tektite, 0x28, 0x19, '', 0x09D2FC) + create_sprite(0x93, EnemySprite.Deadrock, 0x0A, 0x35, '', 0x09D2FF) + create_sprite(0x93, EnemySprite.Deadrock, 0x06, 0x36, '', 0x09D302) + create_sprite(0x93, EnemySprite.Deadrock, 0x0D, 0x3B, '', 0x09D305) + create_sprite(0x93, EnemySprite.PositionTarget, 0x12, 0x3B, '', 0x09D308) + create_sprite(0x93, EnemySprite.Deadrock, 0x2C, 0x2D, '', 0x09D30B) + create_sprite(0x93, EnemySprite.Deadrock, 0x34, 0x33, '', 0x09D30E) + create_sprite(0x93, EnemySprite.Deadrock, 0x2F, 0x34, '', 0x09D311) + # Screen05_2: + create_sprite(0x95, EnemySprite.Deadrock, 0x07, 0x0B, '', 0x09D315) + create_sprite(0x95, EnemySprite.Tektite, 0x08, 0x0D, '', 0x09D318) + create_sprite(0x95, EnemySprite.Deadrock, 0x1E, 0x0E, '', 0x09D31B) + create_sprite(0x95, EnemySprite.Tektite, 0x1F, 0x0F, '', 0x09D31E) + create_sprite(0x95, EnemySprite.HeartPiece, 0x2F, 0x03, '', 0x09D321) + create_sprite(0x95, EnemySprite.Deadrock, 0x35, 0x0D, '', 0x09D324) + create_sprite(0x95, EnemySprite.Tektite, 0x29, 0x0F, '', 0x09D327) + create_sprite(0x95, EnemySprite.Deadrock, 0x35, 0x0F, '', 0x09D32A) + create_sprite(0x95, EnemySprite.Faerie, 0x34, 0x10, '', 0x09D32D) + create_sprite(0x95, EnemySprite.Tektite, 0x1E, 0x31, '', 0x09D330) + create_sprite(0x95, EnemySprite.Tektite, 0x35, 0x2A, '', 0x09D333) + create_sprite(0x95, EnemySprite.Deadrock, 0x2A, 0x2F, '', 0x09D336) + create_sprite(0x95, EnemySprite.Tektite, 0x2F, 0x2F, '', 0x09D339) + create_sprite(0x95, EnemySprite.Deadrock, 0x29, 0x36, '', 0x09D33C) + create_sprite(0x95, EnemySprite.Deadrock, 0x36, 0x36, '', 0x09D33F) + # Screen07_2: + create_sprite(0x97, EnemySprite.Deadrock, 0x0E, 0x07, '', 0x09D343) + create_sprite(0x97, EnemySprite.Deadrock, 0x0A, 0x0D, '', 0x09D346) + create_sprite(0x97, EnemySprite.Deadrock, 0x17, 0x15, '', 0x09D349) + create_sprite(0x97, EnemySprite.Deadrock, 0x0F, 0x16, '', 0x09D34C) + create_sprite(0x97, EnemySprite.Deadrock, 0x12, 0x16, '', 0x09D34F) + # Screen0A_2: + create_sprite(0x9a, EnemySprite.Bee, 0x0E, 0x04, '', 0x09D353) + create_sprite(0x9a, EnemySprite.BlueGuard, 0x10, 0x0D, '', 0x09D356) + create_sprite(0x9a, EnemySprite.Raven, 0x11, 0x16, '', 0x09D359) + create_sprite(0x9a, EnemySprite.Raven, 0x13, 0x16, '', 0x09D35C) + create_sprite(0x9a, EnemySprite.Hoarder, 0x0E, 0x16, '', 0x09D35F) + create_sprite(0x9a, EnemySprite.Raven, 0x11, 0x17, '', 0x09D362) + create_sprite(0x9a, EnemySprite.Apple, 0x19, 0x1A, '', 0x09D365) + # Screen0F_2: + create_sprite(0x9f, EnemySprite.Waterfall, 0x06, 0x02, '', 0x09D369) + create_sprite(0x9f, EnemySprite.Crab, 0x0D, 0x0D, '', 0x09D36C) + create_sprite(0x9f, EnemySprite.FireballZora, 0x05, 0x10, '', 0x09D36F) + create_sprite(0x9f, EnemySprite.FireballZora, 0x0A, 0x11, '', 0x09D372) + create_sprite(0x9f, EnemySprite.Crab, 0x11, 0x12, '', 0x09D375) + create_sprite(0x9f, EnemySprite.Whirlpool, 0x08, 0x13, '', 0x09D378) + create_sprite(0x9f, EnemySprite.Octorok4Way, 0x0E, 0x17, '', 0x09D37B) + # Screen10_2: + create_sprite(0xa0, EnemySprite.BlueGuard, 0x05, 0x0C, '', 0x09D37F) + create_sprite(0xa0, EnemySprite.Apple, 0x07, 0x0C, '', 0x09D382) + create_sprite(0xa0, EnemySprite.LargeMagic, 0x17, 0x0F, '', 0x09D385) + create_sprite(0xa0, EnemySprite.BlueGuard, 0x07, 0x12, '', 0x09D388) + create_sprite(0xa0, EnemySprite.BlueGuard, 0x08, 0x18, '', 0x09D38B) + # Screen11_2: + create_sprite(0xa1, EnemySprite.BlueGuard, 0x17, 0x0C, '', 0x09D38F) + create_sprite(0xa1, EnemySprite.BlueGuard, 0x1A, 0x0D, '', 0x09D392) + create_sprite(0xa1, EnemySprite.BombRefill1, 0x08, 0x10, '', 0x09D395) + create_sprite(0xa1, EnemySprite.Cucco, 0x08, 0x17, '', 0x09D398) + # Screen12_2: + create_sprite(0xa2, EnemySprite.Faerie, 0x14, 0x0A, '', 0x09D39C) + create_sprite(0xa2, EnemySprite.BlueGuard, 0x15, 0x0E, '', 0x09D39F) + create_sprite(0xa2, EnemySprite.Whirlpool, 0x0F, 0x10, '', 0x09D3A2) + create_sprite(0xa2, EnemySprite.GreenGuard, 0x15, 0x15, '', 0x09D3A5) + # Screen13_2: + create_sprite(0xa3, EnemySprite.Bee, 0x18, 0x09, '', 0x09D3A9) + create_sprite(0xa3, EnemySprite.BombRefill8, 0x07, 0x0C, '', 0x09D3AC) + create_sprite(0xa3, EnemySprite.BlueGuard, 0x0D, 0x17, '', 0x09D3AF) + create_sprite(0xa3, EnemySprite.BlueGuard, 0x12, 0x1A, '', 0x09D3B2) + # Screen14_2: + create_sprite(0xa4, EnemySprite.Poe, 0x0D, 0x0D, '', 0x09D3B6) + create_sprite(0xa4, EnemySprite.Poe, 0x19, 0x0F, '', 0x09D3B9) + create_sprite(0xa4, EnemySprite.Poe, 0x08, 0x10, '', 0x09D3BC) + create_sprite(0xa4, EnemySprite.Poe, 0x14, 0x11, '', 0x09D3BF) + create_sprite(0xa4, EnemySprite.Poe, 0x13, 0x14, '', 0x09D3C2) + create_sprite(0xa4, EnemySprite.BlueGuard, 0x11, 0x19, '', 0x09D3C5) + # Screen15_2: + create_sprite(0xa5, EnemySprite.Whirlpool, 0x11, 0x09, '', 0x09D3C9) + create_sprite(0xa5, EnemySprite.UsainBolt, 0x16, 0x0E, '', 0x09D3CC) + create_sprite(0xa5, EnemySprite.Faerie, 0x1B, 0x0F, '', 0x09D3CF) + create_sprite(0xa5, EnemySprite.RedSpearGuard, 0x0B, 0x17, '', 0x09D3D2) + create_sprite(0xa5, EnemySprite.Apple, 0x04, 0x1A, '', 0x09D3D5) + # Screen16_2: + create_sprite(0xa6, EnemySprite.Buzzblob, 0x0D, 0x0A, '', 0x09D3D9) + create_sprite(0xa6, EnemySprite.Witch, 0x0F, 0x15, '', 0x09D3DC) + create_sprite(0xa6, EnemySprite.Buzzblob, 0x06, 0x18, '', 0x09D3DF) + # Screen17_2: + create_sprite(0xa7, EnemySprite.Buzzblob, 0x18, 0x08, '', 0x09D3E3) + create_sprite(0xa7, EnemySprite.Buzzblob, 0x17, 0x0A, '', 0x09D3E6) + create_sprite(0xa7, EnemySprite.UsainBolt, 0x0D, 0x0B, '', 0x09D3E9) + create_sprite(0xa7, EnemySprite.Buzzblob, 0x16, 0x0C, '', 0x09D3EC) + create_sprite(0xa7, EnemySprite.Buzzblob, 0x08, 0x16, '', 0x09D3EF) + # Screen18_2: + create_sprite(0xa8, EnemySprite.BlueGuard, 0x12, 0x08, '', 0x09D3F3) + create_sprite(0xa8, EnemySprite.RedRupee, 0x18, 0x0A, '', 0x09D3F6) + create_sprite(0xa8, EnemySprite.BottleMerchant, 0x18, 0x16, '', 0x09D3F9) + create_sprite(0xa8, EnemySprite.BlueGuard, 0x07, 0x1C, '', 0x09D3FC) + create_sprite(0xa8, EnemySprite.BlueGuard, 0x35, 0x0B, '', 0x09D3FF) + create_sprite(0xa8, EnemySprite.FluteQuest, 0x20, 0x18, '', 0x09D402) + create_sprite(0xa8, EnemySprite.BlueGuard, 0x12, 0x2E, '', 0x09D405) + create_sprite(0xa8, EnemySprite.Cucco, 0x14, 0x34, '', 0x09D408) + create_sprite(0xa8, EnemySprite.Cucco, 0x16, 0x35, '', 0x09D40B) + create_sprite(0xa8, EnemySprite.RedSpearGuard, 0x39, 0x22, '', 0x09D40E) + create_sprite(0xa8, EnemySprite.BlueGuard, 0x20, 0x2E, '', 0x09D411) + create_sprite(0xa8, EnemySprite.Bee, 0x36, 0x33, '', 0x09D414) + # Screen1A_2: + create_sprite(0xaa, EnemySprite.BlueGuard, 0x0F, 0x08, '', 0x09D418) + create_sprite(0xaa, EnemySprite.BlueGuard, 0x0C, 0x0E, '', 0x09D41B) + create_sprite(0xaa, EnemySprite.Faerie, 0x0D, 0x11, '', 0x09D41E) + create_sprite(0xaa, EnemySprite.SmallHeart, 0x0A, 0x18, '', 0x09D421) + create_sprite(0xaa, EnemySprite.UsainBolt, 0x0F, 0x18, '', 0x09D424) + # Screen1B_2: + create_sprite(0xab, EnemySprite.UsainBolt, 0x06, 0x0D, '', 0x09D428) + create_sprite(0xab, EnemySprite.Apple, 0x16, 0x14, '', 0x09D42B) + create_sprite(0xab, EnemySprite.UsainBolt, 0x1F, 0x1A, '', 0x09D42E) + create_sprite(0xab, EnemySprite.BlueGuard, 0x37, 0x13, '', 0x09D431) + create_sprite(0xab, EnemySprite.Whirlpool, 0x1E, 0x25, '', 0x09D434) + create_sprite(0xab, EnemySprite.RedSpearGuard, 0x08, 0x28, '', 0x09D437) + create_sprite(0xab, EnemySprite.GreenGuard, 0x1F, 0x2B, '', 0x09D43A) + create_sprite(0xab, EnemySprite.BlueGuard, 0x38, 0x29, '', 0x09D43D) + create_sprite(0xab, EnemySprite.BlueGuard, 0x21, 0x2D, '', 0x09D440) + create_sprite(0xab, EnemySprite.UsainBolt, 0x21, 0x32, '', 0x09D443) + # Screen1D_2: + create_sprite(0xad, EnemySprite.Bee, 0x0B, 0x06, '', 0x09D447) + create_sprite(0xad, EnemySprite.BlueArcher, 0x1B, 0x0C, '', 0x09D44A) + create_sprite(0xad, EnemySprite.UsainBolt, 0x07, 0x0D, '', 0x09D44D) + create_sprite(0xad, EnemySprite.BlueArcher, 0x1B, 0x0F, '', 0x09D450) + # Screen1E_2: + create_sprite(0xae, EnemySprite.ArmosStatue, 0x0E, 0x0E, '', 0x09D454) + create_sprite(0xae, EnemySprite.UsainBolt, 0x11, 0x1A, '', 0x09D457) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x19, 0x1A, '', 0x09D45A) + create_sprite(0xae, EnemySprite.RupeePull, 0x33, 0x04, '', 0x09D45D) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x33, 0x09, '', 0x09D460) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x37, 0x09, '', 0x09D463) + create_sprite(0xae, EnemySprite.UsainBolt, 0x31, 0x10, '', 0x09D466) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x2F, 0x17, '', 0x09D469) + create_sprite(0xae, EnemySprite.BlueGuard, 0x0F, 0x25, '', 0x09D46C) + create_sprite(0xae, EnemySprite.UsainBolt, 0x09, 0x28, '', 0x09D46F) + create_sprite(0xae, EnemySprite.RedSpearGuard, 0x15, 0x2C, '', 0x09D472) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x14, 0x33, '', 0x09D475) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x17, 0x33, '', 0x09D478) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x24, 0x25, '', 0x09D47B) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x31, 0x28, '', 0x09D47E) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x28, 0x29, '', 0x09D481) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x3A, 0x29, '', 0x09D484) + create_sprite(0xae, EnemySprite.ArmosStatue, 0x3D, 0x29, '', 0x09D487) + create_sprite(0xae, EnemySprite.Faerie, 0x22, 0x37, '', 0x09D48A) + create_sprite(0xae, EnemySprite.UsainBolt, 0x2D, 0x3A, '', 0x09D48D) + # Screen22_2: + create_sprite(0xb2, EnemySprite.BunnyBeam, 0x0C, 0x04, '', 0x09D491) + create_sprite(0xb2, EnemySprite.Cucco, 0x0C, 0x14, '', 0x09D494) + create_sprite(0xb2, EnemySprite.Cucco, 0x12, 0x14, '', 0x09D497) + # Screen25_2: + create_sprite(0xb5, EnemySprite.BlueGuard, 0x0E, 0x08, '', 0x09D49B) + create_sprite(0xb5, EnemySprite.BlueGuard, 0x05, 0x0C, '', 0x09D49E) + create_sprite(0xb5, EnemySprite.BlueGuard, 0x09, 0x11, '', 0x09D4A1) + create_sprite(0xb5, EnemySprite.UsainBolt, 0x19, 0x16, '', 0x09D4A4) + # Screen28_2: + create_sprite(0xb8, EnemySprite.BlueGuard, 0x12, 0x0C, '', 0x09D4A8) + create_sprite(0xb8, EnemySprite.HeartPiece, 0x07, 0x13, '', 0x09D4AB) + create_sprite(0xb8, EnemySprite.RaceGameGuy, 0x08, 0x12, '', 0x09D4AE) + create_sprite(0xb8, EnemySprite.RaceGameLady, 0x19, 0x18, '', 0x09D4B1) + create_sprite(0xb8, EnemySprite.BlueGuard, 0x0C, 0x19, '', 0x09D4B4) + # Screen29_2: + create_sprite(0xb9, EnemySprite.BlueGuard, 0x0E, 0x05, '', 0x09D4B8) + create_sprite(0xb9, EnemySprite.UsainBolt, 0x0C, 0x0C, '', 0x09D4BB) + create_sprite(0xb9, EnemySprite.BlueGuard, 0x0B, 0x14, '', 0x09D4BE) + # Screen2A_2: + create_sprite(0xba, EnemySprite.FluteQuest, 0x09, 0x09, '', 0x09D4C2) + create_sprite(0xba, EnemySprite.GroveOstritch, 0x0E, 0x0C, '', 0x09D4C5) + create_sprite(0xba, EnemySprite.GroveBird, 0x0D, 0x0E, '', 0x09D4C8) + create_sprite(0xba, EnemySprite.FluteKid, 0x0E, 0x0E, '', 0x09D4CB) + create_sprite(0xba, EnemySprite.GroveBird, 0x11, 0x0E, '', 0x09D4CE) + create_sprite(0xba, EnemySprite.GroveRabbit, 0x0C, 0x0F, '', 0x09D4D1) + create_sprite(0xba, EnemySprite.GroveRabbit, 0x11, 0x10, '', 0x09D4D4) + create_sprite(0xba, EnemySprite.RedRupee, 0x15, 0x14, '', 0x09D4D7) + create_sprite(0xba, EnemySprite.RedRupee, 0x0F, 0x18, '', 0x09D4DA) + # Screen2B_2: + create_sprite(0xbb, EnemySprite.BlueGuard, 0x08, 0x06, '', 0x09D4DE) + create_sprite(0xbb, EnemySprite.Faerie, 0x16, 0x0D, '', 0x09D4E1) + create_sprite(0xbb, EnemySprite.BlueGuard, 0x14, 0x11, '', 0x09D4E4) + create_sprite(0xbb, EnemySprite.BlueGuard, 0x14, 0x15, '', 0x09D4E7) + create_sprite(0xbb, EnemySprite.BlueGuard, 0x10, 0x17, '', 0x09D4EA) + # Screen2C_2: + create_sprite(0xbc, EnemySprite.BlueGuard, 0x18, 0x14, '', 0x09D4EE) + create_sprite(0xbc, EnemySprite.BlueGuard, 0x09, 0x19, '', 0x09D4F1) + # Screen2D_2: + create_sprite(0xbd, EnemySprite.Octorok4Way, 0x0F, 0x08, '', 0x09D4F5) + create_sprite(0xbd, EnemySprite.BlueGuard, 0x12, 0x0B, '', 0x09D4F8) + create_sprite(0xbd, EnemySprite.UsainBolt, 0x12, 0x16, '', 0x09D4FB) + create_sprite(0xbd, EnemySprite.FireballZora, 0x1C, 0x17, '', 0x09D4FE) + # Screen2E_2: + create_sprite(0xbe, EnemySprite.Faerie, 0x0C, 0x09, '', 0x09D502) + create_sprite(0xbe, EnemySprite.Bee, 0x14, 0x0B, '', 0x09D505) + create_sprite(0xbe, EnemySprite.UsainBolt, 0x0E, 0x0C, '', 0x09D508) + create_sprite(0xbe, EnemySprite.BlueGuard, 0x17, 0x0E, '', 0x09D50B) + create_sprite(0xbe, EnemySprite.FireballZora, 0x05, 0x12, '', 0x09D50E) + create_sprite(0xbe, EnemySprite.Octorok, 0x19, 0x17, '', 0x09D511) + # Screen2F_2: + create_sprite(0xbf, EnemySprite.UsainBolt, 0x0F, 0x0C, '', 0x09D515) + create_sprite(0xbf, EnemySprite.ArmosStatue, 0x07, 0x17, '', 0x09D518) + create_sprite(0xbf, EnemySprite.ArmosStatue, 0x0C, 0x17, '', 0x09D51B) + # Screen30_2: + create_sprite(0xc0, EnemySprite.DesertStatue, 0x12, 0x14, '', 0x09D51F) + create_sprite(0xc0, EnemySprite.PedestalPlaque, 0x12, 0x19, '', 0x09D522) + create_sprite(0xc0, EnemySprite.DesertStatue, 0x0E, 0x1C, '', 0x09D525) + create_sprite(0xc0, EnemySprite.DesertStatue, 0x16, 0x1C, '', 0x09D528) + create_sprite(0xc0, EnemySprite.Geldman, 0x27, 0x19, '', 0x09D52B) + create_sprite(0xc0, EnemySprite.Vulture, 0x22, 0x1C, '', 0x09D52E) + create_sprite(0xc0, EnemySprite.Geldman, 0x2A, 0x1F, '', 0x09D531) + create_sprite(0xc0, EnemySprite.Landmine, 0x0C, 0x23, '', 0x09D534) + create_sprite(0xc0, EnemySprite.Geldman, 0x1D, 0x26, '', 0x09D537) + create_sprite(0xc0, EnemySprite.Vulture, 0x07, 0x29, '', 0x09D53A) + create_sprite(0xc0, EnemySprite.Geldman, 0x0F, 0x29, '', 0x09D53D) + create_sprite(0xc0, EnemySprite.HeartPiece, 0x06, 0x2A, '', 0x09D540) + create_sprite(0xc0, EnemySprite.Geldman, 0x1B, 0x2C, '', 0x09D543) + create_sprite(0xc0, EnemySprite.Geldman, 0x0A, 0x30, '', 0x09D546) + create_sprite(0xc0, EnemySprite.Geldman, 0x14, 0x35, '', 0x09D549) + create_sprite(0xc0, EnemySprite.MedallionTablet, 0x37, 0x2B, '', 0x09D54C) + create_sprite(0xc0, EnemySprite.Geldman, 0x22, 0x24, '', 0x09D54F) + create_sprite(0xc0, EnemySprite.Geldman, 0x28, 0x2A, '', 0x09D552) + create_sprite(0xc0, EnemySprite.Geldman, 0x23, 0x32, '', 0x09D555) + create_sprite(0xc0, EnemySprite.Vulture, 0x34, 0x33, '', 0x09D558) + # Screen32_2: + create_sprite(0xc2, EnemySprite.SmallHeart, 0x1A, 0x09, '', 0x09D55C) + create_sprite(0xc2, EnemySprite.GreenGuard, 0x0B, 0x0C, '', 0x09D55F) + create_sprite(0xc2, EnemySprite.BlueGuard, 0x12, 0x0C, '', 0x09D562) + create_sprite(0xc2, EnemySprite.GreenGuard, 0x13, 0x10, '', 0x09D565) + create_sprite(0xc2, EnemySprite.BombRefill4, 0x19, 0x12, '', 0x09D568) + create_sprite(0xc2, EnemySprite.Landmine, 0x08, 0x15, '', 0x09D56B) + # Screen33_2: + create_sprite(0xc3, EnemySprite.Octorok, 0x13, 0x06, '', 0x09D56F) + create_sprite(0xc3, EnemySprite.Octorok4Way, 0x14, 0x0B, '', 0x09D572) + create_sprite(0xc3, EnemySprite.Whirlpool, 0x17, 0x12, '', 0x09D575) + create_sprite(0xc3, EnemySprite.Octorok, 0x12, 0x16, '', 0x09D578) + create_sprite(0xc3, EnemySprite.Octorok, 0x1A, 0x1B, '', 0x09D57B) + # Screen34_2: + create_sprite(0xc4, EnemySprite.RupeePull, 0x17, 0x0E, '', 0x09D57F) + create_sprite(0xc4, EnemySprite.Raven, 0x08, 0x13, '', 0x09D582) + create_sprite(0xc4, EnemySprite.BlueGuard, 0x11, 0x12, '', 0x09D585) + create_sprite(0xc4, EnemySprite.Octorok, 0x06, 0x13, '', 0x09D588) + create_sprite(0xc4, EnemySprite.Octorok, 0x0C, 0x18, '', 0x09D58B) + # Screen35_2: + create_sprite(0xc5, EnemySprite.Raven, 0x0E, 0x07, '', 0x09D58F) + create_sprite(0xc5, EnemySprite.Octorok, 0x0D, 0x09, '', 0x09D592) + create_sprite(0xc5, EnemySprite.UsainBolt, 0x0A, 0x0C, '', 0x09D595) + create_sprite(0xc5, EnemySprite.HeartPiece, 0x19, 0x13, '', 0x09D598) + create_sprite(0xc5, EnemySprite.Buzzblob, 0x19, 0x14, '', 0x09D59B) + create_sprite(0xc5, EnemySprite.FireballZora, 0x11, 0x17, '', 0x09D59E) + create_sprite(0xc5, EnemySprite.Octorok4Way, 0x38, 0x0A, '', 0x09D5A1) + create_sprite(0xc5, EnemySprite.FireballZora, 0x25, 0x0D, '', 0x09D5A4) + create_sprite(0xc5, EnemySprite.FireballZora, 0x37, 0x19, '', 0x09D5A7) + create_sprite(0xc5, EnemySprite.Buzzblob, 0x27, 0x1F, '', 0x09D5AA) + create_sprite(0xc5, EnemySprite.Buzzblob, 0x2F, 0x1F, '', 0x09D5AD) + create_sprite(0xc5, EnemySprite.FireballZora, 0x1B, 0x26, '', 0x09D5B0) + create_sprite(0xc5, EnemySprite.Raven, 0x0D, 0x2F, '', 0x09D5B3) + create_sprite(0xc5, EnemySprite.Octorok, 0x06, 0x34, '', 0x09D5B6) + create_sprite(0xc5, EnemySprite.Octorok, 0x0A, 0x35, '', 0x09D5B9) + create_sprite(0xc5, EnemySprite.FireballZora, 0x14, 0x35, '', 0x09D5BC) + create_sprite(0xc5, EnemySprite.Octorok, 0x0B, 0x39, '', 0x09D5BF) + create_sprite(0xc5, EnemySprite.Buzzblob, 0x19, 0x3A, '', 0x09D5C2) + create_sprite(0xc5, EnemySprite.Whirlpool, 0x29, 0x2B, '', 0x09D5C5) + create_sprite(0xc5, EnemySprite.FireballZora, 0x39, 0x31, '', 0x09D5C8) + create_sprite(0xc5, EnemySprite.FireballZora, 0x21, 0x36, '', 0x09D5CB) + create_sprite(0xc5, EnemySprite.Buzzblob, 0x32, 0x37, '', 0x09D5CE) + create_sprite(0xc5, EnemySprite.Buzzblob, 0x34, 0x39, '', 0x09D5D1) + # Screen37_2: + create_sprite(0xc7, EnemySprite.Crab, 0x08, 0x08, '', 0x09D5D5) + create_sprite(0xc7, EnemySprite.Crab, 0x10, 0x08, '', 0x09D5D8) + create_sprite(0xc7, EnemySprite.Crab, 0x0F, 0x0B, '', 0x09D5DB) + create_sprite(0xc7, EnemySprite.Crab, 0x16, 0x11, '', 0x09D5DE) + create_sprite(0xc7, EnemySprite.FireballZora, 0x12, 0x19, '', 0x09D5E1) + # Screen3A_2: + create_sprite(0xca, EnemySprite.Locksmith, 0x17, 0x05, '', 0x09D5E5) + create_sprite(0xca, EnemySprite.Hoarder2, 0x0B, 0x0A, '', 0x09D5E8) + create_sprite(0xca, EnemySprite.Raven, 0x14, 0x0D, '', 0x09D5EB) + create_sprite(0xca, EnemySprite.Raven, 0x13, 0x0E, '', 0x09D5EE) + create_sprite(0xca, EnemySprite.Raven, 0x14, 0x0F, '', 0x09D5F1) + create_sprite(0xca, EnemySprite.Raven, 0x13, 0x10, '', 0x09D5F4) + create_sprite(0xca, EnemySprite.UsainBolt, 0x11, 0x0F, '', 0x09D5F7) + create_sprite(0xca, EnemySprite.Hoarder2, 0x17, 0x17, '', 0x09D5FA) + # Screen3B_2: + create_sprite(0xcb, EnemySprite.FloppingFish, 0x13, 0x0D, '', 0x09D5FE) + create_sprite(0xcb, EnemySprite.Octorok, 0x0C, 0x0F, '', 0x09D601) + create_sprite(0xcb, EnemySprite.HeartPiece, 0x14, 0x0E, '', 0x09D604) + create_sprite(0xcb, EnemySprite.Octorok4Way, 0x0F, 0x14, '', 0x09D607) + create_sprite(0xcb, EnemySprite.BlueGuard, 0x17, 0x18, '', 0x09D60A) + create_sprite(0xcb, EnemySprite.Raven, 0x14, 0x1B, '', 0x09D60D) + # Screen3C_2: + create_sprite(0xcc, EnemySprite.Raven, 0x0B, 0x09, '', 0x09D611) + create_sprite(0xcc, EnemySprite.BlueGuard, 0x08, 0x0A, '', 0x09D614) + create_sprite(0xcc, EnemySprite.Octorok, 0x14, 0x0F, '', 0x09D617) + create_sprite(0xcc, EnemySprite.UsainBolt, 0x09, 0x11, '', 0x09D61A) + create_sprite(0xcc, EnemySprite.Octorok4Way, 0x14, 0x15, '', 0x09D61D) + # Screen3F_2: + create_sprite(0xcf, EnemySprite.Octorok4Way, 0x16, 0x05, '', 0x09D621) + create_sprite(0xcf, EnemySprite.Whirlpool, 0x07, 0x0C, '', 0x09D624) + create_sprite(0xcf, EnemySprite.FireballZora, 0x06, 0x13, '', 0x09D627) + create_sprite(0xcf, EnemySprite.Octoballoon, 0x11, 0x16, '', 0x09D62A) diff --git a/source/enemizer/SpriteSheets.py b/source/enemizer/SpriteSheets.py index 9b6a877a..fdcb575c 100644 --- a/source/enemizer/SpriteSheets.py +++ b/source/enemizer/SpriteSheets.py @@ -554,7 +554,7 @@ def setup_required_dungeon_groups(sheets): # non-optional ([None, None, None, 82], [0x2, 0x58, 0x64, 0x8c, 0x10b]), # pull switches - ([None, None, None, 82], [0x1a, 0x3d, 0x44, 0x56, 0x5e, 0x7c, 0x95, 0xc3]), # collasping bridges + ([None, None, None, 82], [0x1a, 0x3d, 0x44, 0x56, 0x5e, 0x7c, 0x95, 0xc3]), # collapsing bridges ([None, None, None, 83], [0x4, 0x3f, 0xce]), # pull tongue ([None, None, None, 83], [0x35, 0x37, 0x76]), # swamp drains ([None, None, 34, None], [0x28]), # tektike forced? - spawn chest @@ -593,7 +593,7 @@ def setup_required_dungeon_groups(sheets): # roomCollection.LoadRooms() # roomCollection.RandomizeRoomSpriteGroups(spriteGroupCollection, optionFlags); # more stuff -uw_sub_group_choices = { +sub_group_choices = { 0: [22, 31, 47, 14], # 70, 72 for guards 1: [44, 30, 32], # 73, 13 2: [12, 18, 23, 24, 28, 46, 34, 35, 39, 40, 38, 41, 36, 37, 42], @@ -611,7 +611,41 @@ def randomize_underworld_sprite_sheets(sheets): sheet.sub_groups[1] = random.choice([13, 73]) for idx in range(0, 4): if not sheet.locked[idx]: - sheet.sub_groups[idx] = random.choice(uw_sub_group_choices[idx]) + sheet.sub_groups[idx] = random.choice(sub_group_choices[idx]) + # lock the group? + + +def setup_required_overworld_groups(sheets): + sheets[7].add_sprite_to_sheet([None, None, 74, None], {0x2}) # lumberjacks + sheets[16].add_sprite_to_sheet([None, None, 18, 16], {0x3, 0x93}) # WDM (pre/post-Aga) + sheets[7].add_sprite_to_sheet([None, None, None, 17], {0xA, 0x9A}) # DM Foothills? (pre/post-Aga) + sheets[4].add_sprite_to_sheet([None, None, None, None], {0xF, 0x9F}) # Waterfall of wishing (pre/post-Aga) + sheets[3].add_sprite_to_sheet([None, None, None, 14], {0x14, 0xA4}) # Graveyard (pre/post-Aga) + sheets[1].add_sprite_to_sheet([None, None, 76, 63], {0x1B, 0xAB}) # Hyrule Castle (pre/post-Aga) + sheets[6].add_sprite_to_sheet([None, None, None, None], {0x22, 0x28, 0xB2, 0xB8}) # Smithy/Race (pre/post-Aga) + sheets[8].add_sprite_to_sheet([None, None, 18, None], {0x30, 0xC0}) # Desert (pre/post-Aga) + sheets[10].add_sprite_to_sheet([None, None, None, None], {0x3A, 0xCA}) # M-rock (pre/post-Aga) + sheets[22].add_sprite_to_sheet([None, None, 24, None], {0x4F, 0xDF}) # Catfish (pre/post-Aga) + sheets[21].add_sprite_to_sheet([21, None, None, 21], {0x62, 0xF2}) # Smith DW (pre/post-Aga) + sheets[27].add_sprite_to_sheet([None, 42, None, None], {0x68, 0xF8}) # Dig Game (pre/post-Aga) + sheets[13].add_sprite_to_sheet([None, None, 76, None], {0x16, 0xA6}) # Witch hut (pre/post-Aga) + sheets[29].add_sprite_to_sheet([None, 77, None, 21], {0x69, 0xF9}) # VoO South (pre/post-Aga) + sheets[15].add_sprite_to_sheet([None, None, 78, None], {0x2A, 0xBA}) # Haunted Grove (pre/post-Aga) + sheets[17].add_sprite_to_sheet([None, None, None, 76], {0x6A, 0xFA}) # Stumpy (pre/post-Aga) + sheets[12].add_sprite_to_sheet([None, None, 55, 54], {0x80, 0x110}) # Specials (pre/post-Aga) + sheets[14].add_sprite_to_sheet([None, None, 12, 68], {0x81, 0x111}) # Zora's Domain (pre/post-Aga) + sheets[26].add_sprite_to_sheet([15, None, None, None], {0x92}) # Lumberjacks post-Aga + sheets[23].add_sprite_to_sheet([None, None, None, 25], {0x5E, 0xEE}) # PoD pre/post-Aga + + +def randomize_overworld_sprite_sheets(sheets): + setup_required_overworld_groups(sheets) + + for num in range(1, 64): # sheets 0x1 to 0x3F inclusive + sheet = sheets[num] + for idx in range(0, 4): + if not sheet.locked[idx]: + sheet.sub_groups[idx] = random.choice(sub_group_choices[idx]) # lock the group? @@ -627,4 +661,3 @@ def randomize_underworld_sprite_sheets(sheets): - diff --git a/source/enemizer/TilePattern.py b/source/enemizer/TilePattern.py new file mode 100644 index 00000000..c5584722 --- /dev/null +++ b/source/enemizer/TilePattern.py @@ -0,0 +1,93 @@ +import os +import json +import codecs + +if __name__ == '__main__': + directory = './EnemizerCLI.Core/tiles' + for filename in os.listdir(directory): + with codecs.open(directory+'/'+filename, 'r', 'utf-8-sig') as fin: + pattern = json.load(fin) + pairs = [f'({x["x"]}, {x["y"]})' for x in pattern["Items"]] + print(f'(\'{filename}\', [{", ".join(pairs)}]),') + +tile_patterns = [ + ('heart soft', [(3, 1), (5, 2), (4, 7), (2, 5), (7, 1), (7, 5), (8, 4), (1, 2), (2, 1), (1, 4), (5, 7), (6, 1), + (6, 6), (4, 2), (8, 3), (1, 3), (3, 6), (8, 2)]), + ('metroid', [(2, 7), (7, 7), (1, 3), (3, 1), (8, 3), (1, 6), (4, 5), (5, 3), (1, 4), (6, 1), (6, 4), (8, 6), (3, 4), + (7, 5), (4, 1), (5, 5), (2, 2), (2, 5), (7, 2), (5, 1), (4, 3), (8, 4)]), + ('moldorm vertical', [(5, 1), (6, 0), (7, 2), (5, 4), (4, 4), (4, 1), (3, 5), (5, 6), (3, 2), (6, 6), (7, 5), + (6, 1), (4, 8), (3, 3), (5, 7), (3, 8), (2, 7), (6, 4), (4, 0), (3, 6), (7, 3), (4, 6)]), + ('scream emoji', [(2, 2), (7, 2), (2, 3), (7, 3), (1, 7), (8, 7), (3, 2), (6, 2), (2, 6), (7, 6), (3, 3), (6, 3), + (2, 7), (7, 7), (4, 5), (5, 7), (5, 5), (4, 7), (4, 6), (5, 6), (2, 5), (7, 5)]), + ('mario mushroom', [(3, 7), (4, 7), (5, 7), (3, 4), (4, 4), (5, 4), (3, 1), (4, 1), (5, 1), (2, 2), (6, 6), (6, 2), + (2, 6), (1, 3), (7, 5), (7, 3), (1, 5), (1, 4), (6, 5), (7, 4), (2, 5)]), + ('moldorm', [(1, 3), (2, 5), (3, 6), (5, 5), (7, 5), (7, 2), (5, 3), (3, 2), (2, 4), (1, 5), (5, 4), (6, 2), (7, 4), + (8, 1), (8, 4), (4, 2), (9, 2), (2, 3), (4, 6), (9, 3), (7, 3), (6, 6)]), + ('thinking emoji', [(5, 6), (6, 4), (4, 3), (3, 1), (2, 6), (5, 3), (6, 6), (6, 1), (3, 0), (4, 7), (2, 4), (3, 8), + (6, 0), (3, 7), (3, 3)]), + ('triangle', [(1, 5), (7, 5), (4, 2), (3, 5), (5, 5), (4, 3), (2, 4), (6, 4), (5, 3), (2, 5), (6, 5), (3, 3), + (4, 5), (5, 4), (3, 4), (4, 4)]), + ('heart', [(8, 3), (2, 3), (5, 7), (2, 4), (8, 4), (4, 6), (6, 6), (8, 2), (2, 2), (5, 2), (7, 1), (3, 1), (3, 5), + (6, 1), (7, 5), (4, 1)]), + ('arrghus', [(4, 1), (6, 2), (2, 3), (4, 3), (3, 4), (4, 5), (5, 6), (3, 7), (1, 4), (2, 5), (5, 1), (6, 3), (2, 2), + (7, 4), (5, 4), (4, 4), (6, 5), (3, 6), (5, 7), (3, 1), (3, 5), (5, 5)]), + ('cowboy smile', [(1, 2), (3, 3), (4, 1), (3, 5), (5, 8), (6, 7), (5, 2), (7, 2), (1, 3), (2, 7), (5, 5), (5, 3), + (3, 2), (4, 3), (7, 3), (2, 3), (4, 2), (3, 8), (4, 8), (6, 3)]), + ('clown face happy', [(2, 2), (7, 6), (7, 2), (2, 6), (3, 3), (6, 7), (6, 3), (3, 7), (2, 3), (5, 6), (7, 3), + (4, 6), (2, 5), (6, 6), (7, 5), (3, 6), (4, 5), (5, 7), (5, 5), (4, 7), (3, 2), (6, 2)]), + ('generic happy face', [(2, 1), (6, 3), (6, 5), (4, 6), (2, 2), (6, 6), (2, 3), (3, 5), (3, 2), (3, 3), (6, 2), + (5, 5), (1, 2), (3, 6), (7, 5), (7, 1), (4, 5), (8, 2), (5, 6), (2, 5), (7, 3), (7, 2)]), + ('YMCA', [(1, 2), (2, 3), (5, 2), (7, 2), (6, 3), (7, 4), (2, 4), (5, 4), (6, 2), (3, 2), (5, 3), (7, 3), (7, 6), + (4, 8), (2, 7), (6, 7), (4, 6), (8, 8), (8, 7), (3, 8), (3, 6), (6, 8)]), + ('ze', [(5, 7), (6, 7), (7, 7), (1, 3), (2, 3), (3, 3), (5, 5), (6, 5), (7, 5), (1, 7), (2, 7), (3, 7), (5, 3), + (6, 3), (7, 3), (3, 4), (2, 5), (1, 6), (5, 4), (5, 6)]), + ('space invader metroid', [(4, 1), (2, 3), (3, 5), (5, 6), (7, 6), (7, 3), (2, 8), (3, 2), (1, 7), (1, 4), (6, 2), + (8, 5), (7, 8), (4, 6), (8, 7), (5, 1), (2, 6), (8, 4), (1, 5), (6, 5)]), + ('screw attack', [(2, 7), (7, 4), (6, 1), (3, 7), (2, 4), (5, 6), (4, 2), (5, 4), (3, 6), (7, 1), (3, 3), (6, 4), + (4, 6), (4, 3), (6, 2), (3, 4), (6, 5), (5, 2), (4, 5), (4, 4), (5, 3), (5, 5)]), + ('vanilla wrong order', [(7, 2), (7, 4), (7, 5), (7, 7), (6, 3), (6, 5), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), + (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (3, 3), (3, 5), (2, 2), (2, 4), (2, 5), (2, 7)]), + ('tile shaped tiles', [(2, 7), (2, 6), (2, 5), (2, 4), (2, 3), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2), (7, 2), + (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (6, 7), (5, 7), (4, 7), (3, 7), (4, 5), (5, 4)]), + ('panda shocked emoji', [(7, 3), (7, 4), (3, 3), (3, 4), (5, 5), (5, 6), (5, 7), (4, 6), (4, 7), (6, 7), (6, 6), + (8, 6), (8, 7), (8, 8), (2, 8), (2, 7), (2, 6), (2, 1), (3, 1), (7, 1), (8, 1), (5, 8)]), + ('JK', [(1, 5), (3, 4), (5, 3), (7, 3), (3, 2), (7, 5), (6, 4), (2, 6), (5, 6), (5, 5), (8, 2), (3, 5), (8, 6), + (5, 2), (3, 3), (5, 4)]), + ('dollar sign', [(6, 2), (5, 1), (4, 1), (3, 1), (2, 2), (2, 6), (3, 7), (4, 7), (5, 7), (6, 6), (2, 3), (6, 5), + (3, 4), (5, 4), (4, 4), (4, 0), (4, 2), (4, 3), (4, 5), (4, 6), (4, 8)]), + ('rupee diagonal', [(1, 4), (1, 5), (1, 6), (1, 7), (2, 7), (3, 7), (4, 7), (5, 6), (6, 5), (7, 4), (7, 3), (7, 2), + (7, 1), (6, 1), (5, 1), (4, 1), (3, 2), (2, 3), (3, 5), (4, 4), (5, 3)]), + ('sword', [(1, 8), (8, 1), (8, 2), (1, 4), (7, 1), (5, 8), (7, 3), (2, 4), (6, 2), (5, 7), (6, 4), (2, 5), (5, 3), + (4, 7), (5, 5), (3, 6), (4, 4), (2, 7), (4, 6), (3, 5)]), + ('z1 dungeon1', [(4, 6), (6, 4), (2, 4), (3, 7), (4, 3), (5, 7), (3, 2), (5, 4), (3, 5), (5, 5), (4, 2), (6, 3), + (4, 7), (3, 4), (7, 3), (4, 5), (4, 4)]), + ('z1 dungeon 4', [(4, 8), (3, 6), (4, 4), (5, 2), (3, 1), (4, 3), (6, 2), (4, 1), (3, 3), (5, 4), (3, 5), (4, 7), + (6, 1), (3, 8), (5, 7), (3, 2), (4, 6), (3, 4), (5, 1)]), + ('LTTP', [(3, 4), (2, 3), (6, 2), (6, 4), (2, 2), (5, 2), (6, 3), (2, 4), (7, 2), (3, 6), (4, 8), (8, 7), (7, 6), + (7, 8), (5, 6), (7, 7), (4, 6), (4, 7), (8, 6)]), + ('triple triforce', [(4, 2), (3, 3), (4, 3), (5, 3), (6, 5), (5, 6), (6, 6), (7, 6), (3, 6), (2, 6), (2, 5), + (1, 6)]), + ('TILE', [(2, 2), (5, 4), (3, 2), (2, 4), (5, 2), (2, 3), (1, 2), (5, 3), (3, 6), (6, 6), (7, 8), (8, 6), (6, 7), + (3, 8), (4, 8), (3, 7), (6, 8), (7, 6), (7, 7), (8, 8)]), + ('panda thinking emoji', [(2, 1), (3, 1), (6, 2), (7, 2), (6, 3), (3, 2), (3, 3), (3, 5), (4, 5), (5, 5), (2, 6), + (2, 7), (1, 7), (2, 8), (1, 8), (3, 7), (4, 7), (3, 8)]), + ('pokata key', [(3, 1), (4, 2), (5, 3), (4, 4), (4, 6), (5, 7), (6, 8), (4, 8), (6, 6), (3, 3), (5, 1), (4, 5), + (3, 2), (4, 3), (5, 4), (5, 6), (4, 7), (5, 8), (3, 4), (5, 2), (4, 1)]), + ('tile shaped tiles randomish', [(4, 2), (2, 2), (7, 5), (5, 4), (3, 2), (4, 5), (4, 7), (7, 7), (2, 7), (2, 4), + (7, 2), (2, 5), (5, 7), (7, 4), (5, 2), (6, 2), (3, 7), (2, 3), (7, 6), (6, 7), + (7, 3), (2, 6)]), + ('NO', [(1, 5), (4, 4), (3, 4), (6, 2), (8, 4), (1, 2), (8, 5), (7, 5), (1, 3), (6, 5), (6, 4), (1, 4), (4, 5), + (4, 2), (2, 3), (7, 2), (8, 2), (8, 3), (4, 3), (6, 3)]), + ('bomb', [(3, 3), (5, 7), (6, 4), (2, 6), (5, 3), (3, 7), (6, 6), (2, 4), (7, 2), (2, 5), (4, 7), (5, 1), (4, 2), + (6, 5), (6, 1), (4, 3), (8, 2)]), + ('boot', [(6, 7), (8, 6), (5, 5), (5, 3), (8, 2), (3, 6), (4, 8), (7, 8), (8, 4), (6, 2), (2, 7), (3, 8), (4, 5), + (5, 4), (7, 2), (8, 7), (8, 8), (8, 3), (5, 8), (2, 8), (5, 2), (8, 5)]), + ('javalogo', [(5, 8), (4, 8), (3, 8), (2, 8), (1, 7), (5, 6), (4, 6), (3, 6), (2, 6), (1, 5), (7, 7), (8, 6), + (7, 5), (3, 4), (3, 3), (2, 2), (3, 1), (5, 4), (5, 3), (6, 2)]), + ('pokata and ender key', [(3, 1), (5, 3), (4, 4), (4, 6), (5, 7), (6, 8), (4, 8), (6, 6), (3, 3), (5, 1), (4, 5), + (3, 2), (4, 7), (4, 1), (5, 8), (5, 2), (3, 4), (5, 6), (5, 4)]), + ('kitty', [(3, 1), (6, 4), (7, 6), (8, 3), (1, 4), (3, 7), (3, 4), (2, 2), (5, 2), (6, 1), (6, 5), (6, 7), (2, 6), + (7, 2), (8, 5), (1, 3), (1, 5), (4, 2), (3, 5), (4, 6), (8, 4), (5, 6)]), + ('creeper face', [(3, 7), (4, 5), (5, 4), (5, 6), (3, 3), (2, 2), (3, 2), (7, 3), (6, 7), (4, 6), (6, 3), (7, 2), + (2, 3), (4, 4), (3, 6), (6, 2), (6, 6), (5, 5)]) +] diff --git a/source/rom/DataTables.py b/source/rom/DataTables.py index 792ae2e7..236f2bea 100644 --- a/source/rom/DataTables.py +++ b/source/rom/DataTables.py @@ -1,19 +1,33 @@ +from collections import defaultdict + from Utils import snes_to_pc, int24_as_bytes, int16_as_bytes from source.dungeon.EnemyList import EnemyTable, init_vanilla_sprites, vanilla_sprites, init_enemy_stats from source.dungeon.RoomHeader import init_room_headers from source.dungeon.RoomList import Room0127 +from source.enemizer.OwEnemyList import init_vanilla_sprites_ow, vanilla_sprites_ow from source.enemizer.SpriteSheets import init_sprite_sheets, init_sprite_requirements +def convert_area_id_to_offset(area_id): + if area_id < 0x40: + return area_id + if 0x40 <= area_id < 0x80: + return area_id + 0x40 + if 0x90 <= area_id < 0xCF: + return area_id - 0x50 + raise Exception(f'{hex(area_id)} is not a valid area id for offset math') + + class DataTables: def __init__(self): self.room_headers = None self.room_list = None self.sprite_sheets = None self.uw_enemy_table = None - self.ow_enemy_table = None # todo : data migration + self.ow_enemy_table = None self.pot_secret_table = None + self.overworld_sprite_sheets = None # associated data self.sprite_requirements = None @@ -33,7 +47,6 @@ class DataTables: door_start, bytes_written = room.write_to_rom(snes_to_pc(room_start_address), rom) rom.write_bytes(snes_to_pc(0x1F83C0 + room_id * 3), int24_as_bytes(room_start_address + door_start)) room_start_address += bytes_written - # todo: room data doors pointers at 1F83C0 if room_start_address > 0x380000: raise Exception('Room list exceeded bank size') # size notes: bank 03 uses 140E bytes @@ -45,7 +58,19 @@ class DataTables: if self.uw_enemy_table.size() > 0x2800: raise Exception('Sprite table is too big for current area') self.uw_enemy_table.write_sprite_data_to_rom(rom) - # todo: write ow enemy table + for area_id, sheet_number in self.overworld_sprite_sheets.items(): + if area_id in [0x80, 0x81]: + offset = area_id - 0x80 # 02E575 for special areas? + rom.write_byte(snes_to_pc(0x02E576+offset), sheet_number) + else: + offset = convert_area_id_to_offset(area_id) + rom.write_byte(snes_to_pc(0x00FA81+offset), sheet_number) + # _00FA81 is LW normal + # _00FAC1 is LW post-aga + # _00FB01 is DW + for area, sprite_list in vanilla_sprites_ow.items(): + for sprite in sprite_list: + rom.write_bytes(snes_to_pc(sprite.original_address), sprite.sprite_data_ow()) def init_data_tables(world, player): @@ -62,4 +87,10 @@ def init_data_tables(world, player): for room, sprite_list in vanilla_sprites.items(): for sprite in sprite_list: uw_table.room_map[room].append(sprite.copy()) + data_tables.overworld_sprite_sheets = {} + data_tables.ow_enemy_table = defaultdict(list) + init_vanilla_sprites_ow() + for area, sprite_list in vanilla_sprites_ow.items(): + for sprite in sprite_list: + data_tables.ow_enemy_table[area].append(sprite.copy()) return data_tables