feat: force_enemy feature
feat: rom-side enemy "spies"
This commit is contained in:
@@ -129,6 +129,7 @@ class World(object):
|
|||||||
set_player_attr('enemy_health', 'default')
|
set_player_attr('enemy_health', 'default')
|
||||||
set_player_attr('enemy_damage', 'default')
|
set_player_attr('enemy_damage', 'default')
|
||||||
set_player_attr('any_enemy_logic', 'allow_all')
|
set_player_attr('any_enemy_logic', 'allow_all')
|
||||||
|
set_player_attr('force_enemy', None)
|
||||||
set_player_attr('beemizer', '0')
|
set_player_attr('beemizer', '0')
|
||||||
set_player_attr('escape_assist', [])
|
set_player_attr('escape_assist', [])
|
||||||
set_player_attr('crystals_needed_for_ganon', 7)
|
set_player_attr('crystals_needed_for_ganon', 7)
|
||||||
|
|||||||
9
Main.py
9
Main.py
@@ -38,7 +38,7 @@ from source.enemizer.DamageTables import DamageTable
|
|||||||
from source.enemizer.Enemizer import randomize_enemies
|
from source.enemizer.Enemizer import randomize_enemies
|
||||||
from source.rom.DataTables import init_data_tables
|
from source.rom.DataTables import init_data_tables
|
||||||
|
|
||||||
version_number = '1.4.11'
|
version_number = '1.5.0'
|
||||||
version_branch = '-u'
|
version_branch = '-u'
|
||||||
__version__ = f'{version_number}{version_branch}'
|
__version__ = f'{version_number}{version_branch}'
|
||||||
|
|
||||||
@@ -170,6 +170,13 @@ def main(args, seed=None, fish=None):
|
|||||||
world.rom_seeds = {player: random.randint(0, 999999999) for player in range(1, world.players + 1)}
|
world.rom_seeds = {player: random.randint(0, 999999999) for player in range(1, world.players + 1)}
|
||||||
world.finish_init()
|
world.finish_init()
|
||||||
|
|
||||||
|
# custom settings - these haven't been promoted to full settings yet
|
||||||
|
in_progress_settings = ['force_enemy']
|
||||||
|
for player in range(1, world.players + 1):
|
||||||
|
for setting in in_progress_settings:
|
||||||
|
if world.customizer and world.customizer.has_setting(player, setting):
|
||||||
|
getattr(world, setting)[player] = world.customizer.get_setting(player, setting)
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
world.fish.translate("cli","cli","app.title") + "\n",
|
world.fish.translate("cli","cli","app.title") + "\n",
|
||||||
__version__,
|
__version__,
|
||||||
|
|||||||
2
Rom.py
2
Rom.py
@@ -42,7 +42,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings
|
|||||||
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = 'f0881c7ccde2f0d0cd5e9cfe481633ad'
|
RANDOMIZERBASEHASH = '1e87ad01a54f1c15e2ec16a79a9bcc20'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
|
|||||||
Binary file not shown.
@@ -189,6 +189,14 @@ class CustomSettings(object):
|
|||||||
args.shuffle_sfx[p] = get_setting(settings['shuffle_sfx'], args.shuffle_sfx[p])
|
args.shuffle_sfx[p] = get_setting(settings['shuffle_sfx'], args.shuffle_sfx[p])
|
||||||
args.msu_resume[p] = get_setting(settings['msu_resume'], args.msu_resume[p])
|
args.msu_resume[p] = get_setting(settings['msu_resume'], args.msu_resume[p])
|
||||||
|
|
||||||
|
def has_setting(self, player, setting):
|
||||||
|
if 'settings' in self.file_source and player in self.file_source['settings']:
|
||||||
|
return setting in self.file_source['settings'][player]
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_setting(self, player, setting):
|
||||||
|
return self.file_source['settings'][player][setting]
|
||||||
|
|
||||||
def get_item_pool(self):
|
def get_item_pool(self):
|
||||||
if 'item_pool' in self.file_source:
|
if 'item_pool' in self.file_source:
|
||||||
return self.file_source['item_pool']
|
return self.file_source['item_pool']
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import RaceRandom as random
|
import RaceRandom as random
|
||||||
|
from collections import defaultdict
|
||||||
from Utils import snes_to_pc
|
from Utils import snes_to_pc
|
||||||
|
|
||||||
from source.dungeon.EnemyList import SpriteType, EnemySprite, sprite_translation
|
from source.dungeon.EnemyList import SpriteType, EnemySprite, sprite_translation
|
||||||
@@ -428,6 +429,10 @@ def randomize_enemies(world, player):
|
|||||||
if world.enemy_shuffle[player] != 'none':
|
if world.enemy_shuffle[player] != 'none':
|
||||||
data_tables = world.data_tables[player]
|
data_tables = world.data_tables[player]
|
||||||
custom_uw, custom_ow = {}, {}
|
custom_uw, custom_ow = {}, {}
|
||||||
|
if world.force_enemy[player]:
|
||||||
|
custom_ow = {area_id: {i: world.force_enemy[player] for i, s in enumerate(sprite_list)} for area_id, sprite_list in world.data_tables[player].ow_enemy_table.items()}
|
||||||
|
custom_uw = {room_id: {i: world.force_enemy[player] for i, s in enumerate(sprite_list)} for room_id, sprite_list in world.data_tables[player].uw_enemy_table.room_map.items()}
|
||||||
|
else:
|
||||||
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]:
|
||||||
|
|||||||
@@ -655,9 +655,11 @@ def setup_custom_enemy_sheets(custom_enemies, sheets, data_tables, sheet_range,
|
|||||||
if key not in requirements:
|
if key not in requirements:
|
||||||
continue
|
continue
|
||||||
req = requirements[key]
|
req = requirements[key]
|
||||||
if isinstance(req, dict):
|
if isinstance(req, dict) and room_id in req:
|
||||||
req = req[room_id]
|
req = req[room_id]
|
||||||
if req.static or not req.can_randomize:
|
else:
|
||||||
|
req = None
|
||||||
|
if req and (req.static or not req.can_randomize):
|
||||||
try:
|
try:
|
||||||
combine_req(sub_groups_choices, req)
|
combine_req(sub_groups_choices, req)
|
||||||
except IncompatibleEnemyException:
|
except IncompatibleEnemyException:
|
||||||
|
|||||||
Reference in New Issue
Block a user