diff --git a/Rom.py b/Rom.py index e4d8a072..42f0cfa8 100644 --- a/Rom.py +++ b/Rom.py @@ -33,14 +33,14 @@ from InitialSram import InitialSram from source.classes.SFX import randomize_sfx from source.item.FillUtil import valid_pot_items -from source.dungeon.EnemyList import EnemySprite +from source.dungeon.EnemyList import EnemySprite, setup_enemy_dungeon_tables from source.dungeon.RoomObject import DoorObject from source.enemizer.Bossmizer import boss_writes from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '8c20d2bcccfc543a1201ff082e0ebe8e' +RANDOMIZERBASEHASH = '6d43fb7bd4cf5ec2d10d03cf04772240' class JsonRom(object): @@ -1408,6 +1408,7 @@ def patch_rom(world, rom, player, team, is_mystery=False): if world.data_tables[player]: colorize_pots = (world.pottery[player] != 'vanilla', 'lottery' and (world.colorizepots[player] or world.pottery[player] in ['reduced', 'clustered'])) + setup_enemy_dungeon_tables(world, player) world.data_tables[player].write_to_rom(rom, colorize_pots, world.enemy_shuffle[player] == 'random') write_enemizer_tweaks(rom, world, player) diff --git a/data/base2current.bps b/data/base2current.bps index 14f6759a..a51a2d26 100644 Binary files a/data/base2current.bps and b/data/base2current.bps differ diff --git a/source/dungeon/EnemyList.py b/source/dungeon/EnemyList.py index f15308c5..360dd9b6 100644 --- a/source/dungeon/EnemyList.py +++ b/source/dungeon/EnemyList.py @@ -536,6 +536,7 @@ class Sprite(object): self.static = False # don't randomize me self.water = False # water types can spawn here self.embedded = False # sprite starts on impassible terrian + self.never_drop = False def copy(self): sprite = Sprite(self.super_tile, self.kind, self.sub_type, self.layer, self.tile_x, self.tile_y, self.region, @@ -571,7 +572,7 @@ vanilla_sprites = {} def create_sprite(super_tile, kind, sub_type, layer, tile_x, tile_y, region=None, - drops_item=False, drop_item_kind=None, fix=False, water=False, embed=False): + drops_item=False, drop_item_kind=None, fix=False, water=False, embed=False, never_drop=False): if super_tile not in vanilla_sprites: vanilla_sprites[super_tile] = [] sprite = Sprite(super_tile, kind, sub_type, layer, tile_x, tile_y, region, drops_item, drop_item_kind) @@ -581,6 +582,8 @@ def create_sprite(super_tile, kind, sub_type, layer, tile_x, tile_y, region=None sprite.water = True if embed: sprite.embedded = True + if never_drop: + sprite.never_drop = True vanilla_sprites[super_tile].append(sprite) @@ -705,9 +708,9 @@ def init_vanilla_sprites(): create_sprite(0x0016, EnemySprite.Blob, 0x00, 0, 0x15, 0x08, 'Swamp C') create_sprite(0x0016, EnemySprite.BlueBari, 0x00, 0, 0x15, 0x09, 'Swamp C') create_sprite(0x0016, EnemySprite.Blob, 0x00, 0, 0x10, 0x0a, 'Swamp I') - create_sprite(0x0016, EnemySprite.Hover, 0x00, 1, 0x0c, 0x18, 'Swamp Waterway', False, fix=True) - create_sprite(0x0016, EnemySprite.Hover, 0x00, 1, 0x07, 0x1b, 'Swamp Waterway', False, fix=True) - create_sprite(0x0016, EnemySprite.Hover, 0x00, 1, 0x14, 0x1b, 'Swamp Waterway', False, fix=True) + create_sprite(0x0016, EnemySprite.Hover, 0x00, 1, 0x0c, 0x18, 'Swamp Waterway', fix=True, never_drop=True) + create_sprite(0x0016, EnemySprite.Hover, 0x00, 1, 0x07, 0x1b, 'Swamp Waterway', fix=True, never_drop=True) + create_sprite(0x0016, EnemySprite.Hover, 0x00, 1, 0x14, 0x1b, 'Swamp Waterway', fix=True, never_drop=True) create_sprite(0x0017, EnemySprite.Bumper, 0x00, 0, 0x07, 0x0b, 'Hera 5F') create_sprite(0x0017, EnemySprite.Bumper, 0x00, 0, 0x10, 0x0e, 'Hera 5F') create_sprite(0x0017, EnemySprite.Bumper, 0x00, 0, 0x07, 0x16, 'Hera 5F') @@ -1282,8 +1285,8 @@ def init_vanilla_sprites(): create_sprite(0x0074, EnemySprite.GreenEyegoreMimic, 0x00, 0, 0x0c, 0x05, 'Desert Map Room') create_sprite(0x0074, EnemySprite.GreenEyegoreMimic, 0x00, 0, 0x13, 0x05, 'Desert Map Room') create_sprite(0x0074, EnemySprite.Leever, 0x00, 0, 0x0c, 0x0a, 'Desert Map Room') - create_sprite(0x0074, EnemySprite.Leever, 0x00, 0, 0x13, 0x0a, 'Desert Dead End') - create_sprite(0x0074, EnemySprite.Leever, 0x00, 0, 0x0e, 0x1b, 'Desert Map Room') + create_sprite(0x0074, EnemySprite.Leever, 0x00, 0, 0x13, 0x0a, 'Desert Map Room') + create_sprite(0x0074, EnemySprite.Leever, 0x00, 0, 0x0e, 0x1b, 'Desert Dead End') create_sprite(0x0074, EnemySprite.Leever, 0x00, 0, 0x12, 0x1b, 'Desert Dead End') create_sprite(0x0075, EnemySprite.Debirando, 0x00, 0, 0x08, 0x07, 'Desert Trap Room') create_sprite(0x0075, EnemySprite.Debirando, 0x00, 0, 0x04, 0x1b, 'Desert Arrow Pot Corner') @@ -2102,6 +2105,7 @@ layered_oam_rooms = { class EnemyTable: def __init__(self): self.room_map = defaultdict(list) + self.special_bitmasks = None def write_sprite_data_to_rom(self, rom): pointer_address = snes_to_pc(0x09D62E) @@ -2139,6 +2143,30 @@ class EnemyTable: size += sum(len(sprite.sprite_data()) for sprite in self.room_map[room]) + 2 return size + def check_special_bitmasks_size(self): + size = 0 + for super_tile, dungeon_list in self.special_bitmasks.items(): + size += (1 if len(dungeon_list) % 2 == 1 else 2) + len(dungeon_list) * 3 + if size > 256: + raise Exception("256 bytes limit reached on special bitmask table. Please revise") + + def write_special_bitmask_table(self, rom): + pointer = 0 + for super_tile, dungeon_list in self.special_bitmasks.items(): + pointer_index = pointer // 2 + rom.write_byte(snes_to_pc(0x28AF00) + super_tile, pointer_index) + is_even = len(dungeon_list) % 2 == 0 + for dungeon, bitmask in dungeon_list.items(): + dungeon_id = dungeon * 2 + rom.write_bytes(snes_to_pc(0x28B028) + pointer, [dungeon_id] + int16_as_bytes(bitmask)) + pointer += 3 + if is_even: + rom.write_bytes(snes_to_pc(0x28B028) + pointer, [0xFF, 0xFF]) + pointer += 2 + else: + rom.write_byte(snes_to_pc(0x28B028) + pointer, 0xFF) + pointer += 1 + def setup_enemy_locations(world, player): for super_tile, enemy_list in world.data_tables[player].uw_enemy_table.room_map.items(): @@ -2147,11 +2175,49 @@ def setup_enemy_locations(world, player): create_drop_location(sprite, index, super_tile, world, player) +# 1,1,1,1,2,1,2,2,1,2,3,2,2,2,2,2,2,1,2,1(2),1,1,1,1,2 +splittable_supertiles = {0x9, 0x1a, 0x35, 0x36, 0x37, 0x2a, 0x57, 0x74, 0x75, 0x6a, 0x7b, 0x7c, 0x7d, 0x9d, 0x8c, + 0x9b, 0x87, 0x82, 0xa2, 0xb2, 0xb6, 0xa9, 0xaa, 0xbc, 0xdb, 0xd1} +# minimum 159 bytes maybe reserve 256 (0x100) +# tr pipes, mire left/right bridges, eastern cannonball, tr front entrance = have zero enemies so far but are splittable +# 0x14, 0xa2, 0xb9, 0xd6 + +# only a concern once pits are done and cave interiors are shuffled somehow? +# identify by entrance ids, maybe? may need multiple +# e8? - separated hardhats, fa (if fairies (quardants)), fd (if fairies (quadrants almost...) + + +def setup_enemy_dungeon_tables(world, player): + enemy_table = world.data_tables[player].uw_enemy_table + dungeon_map = defaultdict(lambda: defaultdict(list)) + for super_tile, enemy_list in enemy_table.room_map.items(): + if super_tile in splittable_supertiles: + idx_adj = 0 + for index, sprite in enumerate(enemy_list): + loc_name = f'{sprite.region} Enemy #{index+1}' + loc = world.get_location_unsafe(loc_name, player) + if sprite.sub_type == 0x07: # overlord + idx_adj += 1 + continue # overlords can't have locations + if loc: + # possible to-do: caves really aren't supported yet - entrance ids? + dungeon = loc.parent_region.dungeon.dungeon_id if loc.parent_region.dungeon else 0xFF + dungeon_map[super_tile][dungeon].append((loc, index-idx_adj)) + special_bitmasks = defaultdict(lambda: defaultdict(int)) + for super_tile, dungeon_list in dungeon_map.items(): + for dungeon, data_list in dungeon_list.items(): + for loc, index in data_list: + special_bitmasks[super_tile][dungeon] |= (1 << (15 - index)) + enemy_table.special_bitmasks = special_bitmasks + + def valid_drop_location(sprite, index, world, player): if world.dropshuffle[player] == 'underworld': if sprite.drops_item and sprite.drop_item_kind in [0xe4, 0xe5]: # already has a location return False + elif sprite.never_drop: + return False elif sprite.sub_type != SpriteType.Overlord: stat = world.data_tables[player].enemy_stats[sprite.kind] return stat.drop_flag and (not sprite.embedded or sprite.static) # static for the babusu spawners in Ice diff --git a/source/enemizer/enemy_deny.yaml b/source/enemizer/enemy_deny.yaml index 7e07e370..b98a4b98 100644 --- a/source/enemizer/enemy_deny.yaml +++ b/source/enemizer/enemy_deny.yaml @@ -29,8 +29,10 @@ UwGeneralDeny: - [ 0x001e, 5, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ice Palace - Blob Ambush - Zol 1" - [ 0x001e, 6, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ice Palace - Blob Ambush - Zol 2" - [ 0x001f, 0, [ "RollerHorizontalRight" ] ] #"Ice Palace - Big Key View - Pengator 1" + - [ 0x001f, 3, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x0021, 3, [ "RollerVerticalDown", "RollerVerticalUp" ] ] #"Sewers - Dark U - Rat 2" - [ 0x0021, 4, [ "RollerVerticalDown", "RollerVerticalUp" ] ] #"Sewers - Dark U - Rat 3" + - [ 0x0024, 6, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x0026, 1, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Big Spoon - Red Bari 1" - [ 0x0026, 8, [ "AntiFairyCircle", "Bumper" ] ] #"Swamp Palace - Big Spoon - Red Bari 3" - [ 0x0026, 9, [ "RollerHorizontalRight" ] ] #"Swamp Palace - Big Spoon - Kyameron" @@ -70,6 +72,7 @@ UwGeneralDeny: - [ 0x003d, 13, [ "AntiFairyCircle", "Bumper" ] ] #"Ganon's Tower - Torches 2 - Antifairy" - [ 0x003f, 1, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Ice Palace - P Room - Stalfos Knight 1" - [ 0x003f, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - P Room - Stalfos Knight 2" + - [ 0x003f, 4, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x0040, 0, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] # Agahnims Tower - Bridge - Blue Guard 1 - [ 0x0040, 1, [ "Statue", "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] # Agahnims Tower - Bridge - Blue Guard 2 - [ 0x0041, 0, [ "RollerHorizontalLeft" ] ] #"Sewers - Dark Cactus - Rat 1" @@ -85,6 +88,7 @@ UwGeneralDeny: - [ 0x0044, 6, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "BigSpike" ] ] #"Thieves' Town - Joke Room - Red Bari" - [ 0x0044, 8, [ "Statue", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Joke Room - Blue Bari 4" - [ 0x0045, 1, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Thieves' Town - Basement Block Totems - Red Zazak" + - [ 0x0045, 4, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x0045, 7, [ "AntiFairyCircle", "Bumper" ] ] #"Thieves' Town - Cells - Blue Zazak 4" - [ 0x0045, 8, [ "RollerHorizontalRight" ] ] #"Thieves' Town - Cells - Zol" - [ 0x0046, 0, [ "RollerVerticalUp", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Swamp Palace - Big O Top - Hover 1" @@ -111,6 +115,7 @@ UwGeneralDeny: - [ 0x0053, 5, [ "RollerVerticalDown" ] ] #"Desert Palace - Popo Genocide - Popo TL" - [ 0x0053, 7, [ "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Desert Palace - Bridge - Popo 5" - [ 0x0055, 1, [ "RollerVerticalUp", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Secret Passage Exit - Green Knife Guard 1" + - [ 0x0057, 0, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x0057, 2, [ "RollerVerticalUp", "AntiFairyCircle", "Bumper" ] ] #"Skull Woods - Big Key Room - Spike Trap" - [ 0x0057, 7, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Big Key Room - Gibdo 2" - [ 0x0057, 12, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Big Key Room - Gibdo 6" @@ -127,6 +132,7 @@ UwGeneralDeny: - [ 0x0060, 0, [ "RollerVerticalUp", "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Hyrule Castle - West - Blue Guard" - [ 0x0062, 0, [ "RollerVerticalUp", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Hyrule Castle - East - Blue Guard" - [ 0x0064, 2, [ "Bumper" , "Beamos" ] ] #"Thieves' Town - Attic Hall Left - Keese 2" + - [ 0x0064, 3, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x0064, 4, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Thieves' Town - Attic Hall Left - Rat 1" - [ 0x0065, 0, [ "RollerVerticalUp", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Attic Window - Rat 1" - [ 0x0065, 1, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Thieves' Town - Attic Window - Rat 2" @@ -190,6 +196,7 @@ UwGeneralDeny: - [ 0x008d, 9, [ "Statue", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ganon's Tower - Tile Room - Fire Bar (Clockwise)" - [ 0x008d, 10, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Ganon's Tower - Tile Room - Blue Bari 1" - [ 0x008d, 12, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Ganon's Tower - Tile Room - Blue Bari 2" + - [ 0x008e, 2, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x0092, 8, [ "RollerVerticalUp", "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Misery Mire - Dark Weave - Spike Trap" - [ 0x0092, 9, [ "RollerHorizontalRight" ] ] #"Misery Mire - Dark Weave - Antifairy 3" - [ 0x0092, 10, [ "RollerHorizontalLeft" ] ] #"Misery Mire - Dark Weave - Stalfos" @@ -225,6 +232,7 @@ UwGeneralDeny: - [ 0x009e, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Fairy Drop - blue - Red Bari 3" - [ 0x00a0, 1, [ "RollerHorizontalLeft", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Boss Antechamber - Antifairy" - [ 0x00a1, 2, [ "Statue", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Misery Mire - Fish Room - Spark (Clockwise) 2" + - [ 0x00a1, 7, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x00a5, 2, [ "BigSpike" ] ] #"GT Wizzrobes 1 - Wizzrobe 3" - [ 0x00a5, 10, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Ganon's Tower - Laser Bridge - Red Spear Guard" - [ 0x00a8, 1, [ "RollerVerticalUp", "RollerHorizontalLeft" ] ] #"Eastern Palace - West Wing - Top - Stalfos 2" @@ -237,6 +245,8 @@ UwGeneralDeny: - [ 0x00af, 0, [ "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Ice Clock - Fire Bar (Clockwise)" - [ 0x00b1, 2, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Misery Mire - Hourglass - Spike Trap 1" - [ 0x00b1, 3, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Misery Mire - Hourglass - Spike Trap 2" + - [ 0x00b2, 1, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots + - [ 0x00b2, 3, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x00b2, 6, [ "RollerVerticalUp", "RollerHorizontalLeft" ] ] #"Misery Mire - Sluggula Cross - Sluggula TR" - [ 0x00b2, 8, [ "RollerVerticalDown" ] ] #"Misery Mire - Popo Push - Medusa 1" - [ 0x00b2, 9, [ "RollerVerticalUp" ] ] #"Misery Mire - Sluggula Cross - Sluggula BL" @@ -259,12 +269,18 @@ UwGeneralDeny: - [ 0x00bc, 6, [ "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Toilet - Stalfos 2" - [ 0x00bc, 7, [ "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Toilet - Stalfos 3" - [ 0x00bc, 8, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Thieves' Town - Toilet - Stalfos 4" + - [ 0x00bf, 0, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on collision - [ 0x00c1, 3, [ "RollerVerticalUp", "RollerHorizontalLeft" ] ] #"Misery Mire - 4 Rails - Stalfos 1" - [ 0x00c2, 0, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Misery Mire - Main Lobby - blue - Fire Snake 1" + - [ 0x00c2, 5, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x00c5, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Turtle Rock - Catwalk - Mini Helmasaur" - [ 0x00c5, 7, [ "Statue" ] ] #"Turtle Rock - Catwalk - Laser Eye (Left) 4" + - [ 0x00cb, 0, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x00cb, 3, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Grand Room NW - Zol 1" - [ 0x00cb, 5, [ "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Grand Room NW - Zol 2" + - [ 0x00cb, 11, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots + - [ 0x00cc, 8, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #Prevents Pot access (Beamos okay?) + - [ 0x00cc, 12, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #Prevents Pot access (Beamos okay?) - [ 0x00ce, 0, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "AntiFairyCircle", "Antifairy", "BigSpike", "FirebarCCW", "Bumper" ] ] #"Ice Palace - Over Boss - top - Red Bari 1" - [ 0x00ce, 1, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "AntiFairyCircle", "Antifairy", "BigSpike", "FirebarCW", "Bumper" ] ] #"Ice Palace - Over Boss - top - Red Bari 2" - [ 0x00ce, 3, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "Antifairy", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Over Boss - top - Statue" @@ -281,6 +297,7 @@ UwGeneralDeny: - [ 0x00d8, 7, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Eastern Palace - Kill Room 2 - Popo RB" - [ 0x00d8, 8, [ "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Eastern Palace - Kill Room 1 - Red Eyegore" - [ 0x00d9, 1, [ "RollerHorizontalRight" ] ] #"Eastern Palace - Dodgeball - Green Eyegore 1" + - [ 0x00db, 0, [ "Wizzrobe" ] ] # Wizzrobes can't spawn on pots - [ 0x00dc, 9, [ "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Thieves' Town - Grand Room SE - Fire Snake 2" - [ 0x00df, 0, [ "RollerVerticalDown", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Paradox Cave - Top - Mini Moldorm 1" - [ 0x00df, 1, [ "RollerVerticalDown", "RollerHorizontalRight", "AntiFairyCircle" ] ] #"Paradox Cave - Top - Mini Moldorm 2" diff --git a/source/enemizer/enemy_weight.yaml b/source/enemizer/enemy_weight.yaml index a140e861..58126bf3 100644 --- a/source/enemizer/enemy_weight.yaml +++ b/source/enemizer/enemy_weight.yaml @@ -52,7 +52,7 @@ UW: # Total 94431 Kyameron: 237 # 0.42147% raw:398 3.52212% Landmine: 19 # 5.40077% raw:5100 45.13274% Leever: 154 # 0.65127% raw:615 5.44248% - Lynel: 559 # 0.17897% raw:169 1.49558% + Lynel: 500 # 0.17897% raw:169 1.49558% MiniHelmasaur: 109 # 0.91495% raw:864 7.64602% MiniMoldorm: 109 # 0.91495% raw:864 7.64602% Moblin: 367 # 0.27216% raw:257 2.27434% diff --git a/source/rom/DataTables.py b/source/rom/DataTables.py index 41b1f7ec..c818dfc4 100644 --- a/source/rom/DataTables.py +++ b/source/rom/DataTables.py @@ -82,6 +82,8 @@ 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) + self.uw_enemy_table.check_special_bitmasks_size() + self.uw_enemy_table.write_special_bitmask_table(rom) for area_id, sheet in self.overworld_sprite_sheets.items(): if area_id in [0x80, 0x81]: offset = area_id - 0x80 # 02E575 for special areas?