Add all-mimics mode

This commit is contained in:
2025-03-01 13:09:40 -06:00
parent 1ae183b519
commit b9a11e75bb
4 changed files with 53 additions and 4 deletions

View File

@@ -3,6 +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
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
@@ -427,7 +428,8 @@ skip_sprites = {
def randomize_enemies(world, player):
if world.enemy_shuffle[player] != 'none':
data_tables = world.data_tables[player]
custom_uw, custom_ow = {}, {}
custom_ow = get_enemy_map_ow(world.enemy_shuffle[player], data_tables)
custom_uw = get_enemy_map_uw(world.enemy_shuffle[player], data_tables)
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]:

View File

@@ -0,0 +1,46 @@
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
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] = {}
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:
continue
if req.static:
if not can_combine_req(green_mimic, req):
data[room_id] = {}
break
continue
if req.killable:
data[room_id][idx] = 'GreenMimic'
else:
data[room_id][idx] = enemy_names[sprite.kind]
if len(data[room_id]) == 0:
del data[room_id]
return data
def get_enemy_map_ow(mode, data_tables):
reqs = data_tables.sprite_requirements
return get_enemy_map(mode, reqs, data_tables.ow_enemy_table)
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)