diff --git a/Rom.py b/Rom.py index 1542420f..e4a999e6 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '9cdc4e5b97fc03af357b4f35ea8802fd' +RANDOMIZERBASEHASH = '5d715dfd920f9eadf5db51b5719e1ff6' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 0986c290..91674e9b 100644 Binary files a/data/base2current.bps and b/data/base2current.bps differ diff --git a/source/enemizer/Enemizer.py b/source/enemizer/Enemizer.py index c4d70a24..5c018733 100644 --- a/source/enemizer/Enemizer.py +++ b/source/enemizer/Enemizer.py @@ -3,7 +3,7 @@ from Utils import snes_to_pc from source.dungeon.EnemyList import SpriteType, EnemySprite, sprite_translation from source.dungeon.RoomList import Room010C -from source.enemizer.SpecialEnemyModes import get_enemy_map_uw, get_enemy_map_ow, write_mimic_changes +from source.enemizer.SpecialEnemyModes import set_mimics, write_mimic_changes from source.enemizer.SpriteSheets import sub_group_choices from source.enemizer.SpriteSheets import randomize_underworld_sprite_sheets, randomize_overworld_sprite_sheets from source.enemizer.TilePattern import tile_patterns @@ -426,10 +426,12 @@ skip_sprites = { def randomize_enemies(world, player): - if world.enemy_shuffle[player] != 'none': + if world.enemy_shuffle[player] == 'mimics': data_tables = world.data_tables[player] - custom_ow = get_enemy_map_ow(world.enemy_shuffle[player], data_tables) - custom_uw = get_enemy_map_uw(world.enemy_shuffle[player], data_tables) + set_mimics(data_tables) + elif world.enemy_shuffle[player] != 'none': + data_tables = world.data_tables[player] + custom_ow, custom_uw = {}, {} enemy_map = world.customizer.get_enemies() if world.customizer else None if enemy_map and player in enemy_map: if 'Underworld' in enemy_map[player]: diff --git a/source/enemizer/SpecialEnemyModes.py b/source/enemizer/SpecialEnemyModes.py index 6779f7a4..f3a27c89 100644 --- a/source/enemizer/SpecialEnemyModes.py +++ b/source/enemizer/SpecialEnemyModes.py @@ -3,52 +3,40 @@ from Utils import snes_to_pc from source.dungeon.EnemyList import EnemySprite, SpriteType, sprite_translation, enemy_names -def can_combine_req(req1, req2): - for i in range(0, 4): - if req1.sub_groups[i] and req2.sub_groups[i]: - if len(set(req1.sub_groups[i]).intersection(req2.sub_groups[i])) == 0: - return False - return True +change_idx_1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 31, 32, 35, 38, 65, 66, 67, 68, 70, 71, 76, 77, 78, 81, 83, 89, 91, 92, 94, 97, 100, 101, 102, 103, 104, 105, 106, 107] -def get_enemy_map(mode, reqs, vanilla_map): - data = {} - if mode != "mimics": - return data - - green_mimic = reqs.get((EnemySprite.GreenMimic, 0)) - - for room_id, sprites in vanilla_map.items(): - data[room_id] = {} +def set_mimic_map(reqs, enemy_map): + for room_id, sprites in enemy_map.items(): for idx, sprite in enumerate(sprites): subtype = 0 if sprite.sub_type != SpriteType.Overlord else sprite.sub_type req = reqs.get((sprite.kind, subtype)) - if not req or isinstance(req, dict) or req.boss: + + if isinstance(req, dict): + if room_id not in req: + continue + req = req[room_id] + if not req or req.boss: continue - if req.static: - if not can_combine_req(green_mimic, req): - data[room_id] = {} - break - continue - if req.killable: + + if not req.static: if random.random() > 0.1: - data[room_id][idx] = 'GreenMimic' + sprite.kind = EnemySprite.GreenMimic else: - data[room_id][idx] = 'RedMimic' - else: - data[room_id][idx] = enemy_names[sprite.kind] - if len(data[room_id]) == 0: - del data[room_id] - return data + sprite.kind = EnemySprite.RedMimic - -def get_enemy_map_ow(mode, data_tables): +def set_mimics(data_tables): reqs = data_tables.sprite_requirements - return get_enemy_map(mode, reqs, data_tables.ow_enemy_table) + sheets = data_tables.sprite_sheets + uw_enemy_map = data_tables.uw_enemy_table.room_map + ow_enemy_map = data_tables.ow_enemy_table + + for idx in change_idx_1: + sheets[idx].sub_groups[1] = 0x2c + + set_mimic_map(reqs, uw_enemy_map) + set_mimic_map(reqs, ow_enemy_map) -def get_enemy_map_uw(mode, data_tables): - reqs = data_tables.sprite_requirements - return get_enemy_map(mode, reqs, data_tables.uw_enemy_table.room_map) def write_mimic_changes(rom, double = False): if double: @@ -60,12 +48,24 @@ def write_mimic_changes(rom, double = False): 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF6, 0xF6, 0x00, 0x20, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xE0, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0xD0, 0xE0, 0xE0, 0x00, 0x30, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00]) else: rom.write_bytes(snes_to_pc(0x1EC71B), [0x00, 0xF0, 0x10, 0x00, 0x00, 0xF3, 0x0D, 0x00, 0x00, 0xF3, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00]) - rom.write_bytes(snes_to_pc(0x1EC75C), [0x01, 0x00]) - # rom.write_byte(snes_to_pc(0x0DB3DD), 0x0D) # make red mimics use green palette + # mimics move during dashes + rom.write_byte(snes_to_pc(0x3080A5), 0x01) + + # reverse green mimic direction + rom.write_bytes(snes_to_pc(0x1EC75C), [0x01, 0x00]) + + # make red mimics use green palette + rom.write_byte(snes_to_pc(0x0DB3DD), 0x0D) + + # make zol-dropper drop mimics + rom.write_byte(snes_to_pc(0x0DB10F), 0x05) + rom.write_byte(snes_to_pc(0x0DB3E8), 0x1D) + rom.write_bytes(snes_to_pc(0x1EB1CC), [0x22, 0x89, 0xF5, 0x1D, 0x60]) + rom.write_bytes(snes_to_pc(0x1EB0D9), [0x83, 0x9D, 0x20, 0x0E, 0xFE, 0xA0, 0x0D, 0x9E, 0xAA, 0x0C])