Mimic mode
This commit is contained in:
2
Rom.py
2
Rom.py
@@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings
|
|||||||
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = '9cdc4e5b97fc03af357b4f35ea8802fd'
|
RANDOMIZERBASEHASH = '5d715dfd920f9eadf5db51b5719e1ff6'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
|
|||||||
Binary file not shown.
@@ -3,7 +3,7 @@ from Utils import snes_to_pc
|
|||||||
|
|
||||||
from source.dungeon.EnemyList import SpriteType, EnemySprite, sprite_translation
|
from source.dungeon.EnemyList import SpriteType, EnemySprite, sprite_translation
|
||||||
from source.dungeon.RoomList import Room010C
|
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 sub_group_choices
|
||||||
from source.enemizer.SpriteSheets import randomize_underworld_sprite_sheets, randomize_overworld_sprite_sheets
|
from source.enemizer.SpriteSheets import randomize_underworld_sprite_sheets, randomize_overworld_sprite_sheets
|
||||||
from source.enemizer.TilePattern import tile_patterns
|
from source.enemizer.TilePattern import tile_patterns
|
||||||
@@ -426,10 +426,12 @@ skip_sprites = {
|
|||||||
|
|
||||||
|
|
||||||
def randomize_enemies(world, player):
|
def randomize_enemies(world, player):
|
||||||
if world.enemy_shuffle[player] != 'none':
|
if world.enemy_shuffle[player] == 'mimics':
|
||||||
data_tables = world.data_tables[player]
|
data_tables = world.data_tables[player]
|
||||||
custom_ow = get_enemy_map_ow(world.enemy_shuffle[player], data_tables)
|
set_mimics(data_tables)
|
||||||
custom_uw = get_enemy_map_uw(world.enemy_shuffle[player], 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
|
enemy_map = world.customizer.get_enemies() if world.customizer else None
|
||||||
if enemy_map and player in enemy_map:
|
if enemy_map and player in enemy_map:
|
||||||
if 'Underworld' in enemy_map[player]:
|
if 'Underworld' in enemy_map[player]:
|
||||||
|
|||||||
@@ -3,52 +3,40 @@ from Utils import snes_to_pc
|
|||||||
|
|
||||||
from source.dungeon.EnemyList import EnemySprite, SpriteType, sprite_translation, enemy_names
|
from source.dungeon.EnemyList import EnemySprite, SpriteType, sprite_translation, enemy_names
|
||||||
|
|
||||||
def can_combine_req(req1, req2):
|
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]
|
||||||
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
|
|
||||||
|
|
||||||
def get_enemy_map(mode, reqs, vanilla_map):
|
|
||||||
data = {}
|
|
||||||
|
|
||||||
if mode != "mimics":
|
def set_mimic_map(reqs, enemy_map):
|
||||||
return data
|
for room_id, sprites in enemy_map.items():
|
||||||
|
|
||||||
green_mimic = reqs.get((EnemySprite.GreenMimic, 0))
|
|
||||||
|
|
||||||
for room_id, sprites in vanilla_map.items():
|
|
||||||
data[room_id] = {}
|
|
||||||
for idx, sprite in enumerate(sprites):
|
for idx, sprite in enumerate(sprites):
|
||||||
subtype = 0 if sprite.sub_type != SpriteType.Overlord else sprite.sub_type
|
subtype = 0 if sprite.sub_type != SpriteType.Overlord else sprite.sub_type
|
||||||
req = reqs.get((sprite.kind, subtype))
|
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
|
continue
|
||||||
if req.static:
|
|
||||||
if not can_combine_req(green_mimic, req):
|
if not req.static:
|
||||||
data[room_id] = {}
|
|
||||||
break
|
|
||||||
continue
|
|
||||||
if req.killable:
|
|
||||||
if random.random() > 0.1:
|
if random.random() > 0.1:
|
||||||
data[room_id][idx] = 'GreenMimic'
|
sprite.kind = EnemySprite.GreenMimic
|
||||||
else:
|
else:
|
||||||
data[room_id][idx] = 'RedMimic'
|
sprite.kind = EnemySprite.RedMimic
|
||||||
else:
|
|
||||||
data[room_id][idx] = enemy_names[sprite.kind]
|
|
||||||
if len(data[room_id]) == 0:
|
|
||||||
del data[room_id]
|
|
||||||
return data
|
|
||||||
|
|
||||||
|
def set_mimics(data_tables):
|
||||||
def get_enemy_map_ow(mode, data_tables):
|
|
||||||
reqs = data_tables.sprite_requirements
|
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):
|
def write_mimic_changes(rom, double = False):
|
||||||
if double:
|
if double:
|
||||||
@@ -60,12 +48,24 @@ def write_mimic_changes(rom, double = False):
|
|||||||
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0xE0, 0xF6, 0xF6, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0xE0, 0xF6, 0xF6, 0x00,
|
||||||
0x20, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 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])
|
0x30, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00])
|
||||||
else:
|
else:
|
||||||
rom.write_bytes(snes_to_pc(0x1EC71B),
|
rom.write_bytes(snes_to_pc(0x1EC71B),
|
||||||
[0x00, 0xF0, 0x10, 0x00, 0x00, 0xF3, 0x0D, 0x00,
|
[0x00, 0xF0, 0x10, 0x00, 0x00, 0xF3, 0x0D, 0x00,
|
||||||
0x00, 0xF3, 0x0D, 0x00, 0x00, 0x00, 0x00, 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])
|
||||||
|
|||||||
Reference in New Issue
Block a user