any_enemy_logic option added

This commit is contained in:
aerinon
2023-04-10 09:07:01 -06:00
parent 5d86ed4055
commit 907639b984
15 changed files with 73 additions and 13 deletions

View File

@@ -134,6 +134,7 @@ class CustomSettings(object):
args.shuffleenemies[p] = get_setting(settings['enemy_shuffle'], args.shuffleenemies[p])
args.enemy_health[p] = get_setting(settings['enemy_health'], args.enemy_health[p])
args.enemy_damage[p] = get_setting(settings['enemy_damage'], args.enemy_damage[p])
args.any_enemy_logic[p] = get_setting(settings['any_enemy_logic'], args.any_enemy_logic[p])
args.shufflepots[p] = get_setting(settings['shufflepots'], args.shufflepots[p])
args.bombbag[p] = get_setting(settings['bombbag'], args.bombbag[p])
args.shufflelinks[p] = get_setting(settings['shufflelinks'], args.shufflelinks[p])
@@ -254,6 +255,7 @@ class CustomSettings(object):
settings_dict[p]['shuffleenemies'] = world.enemy_shuffle[p]
settings_dict[p]['enemy_health'] = world.enemy_health[p]
settings_dict[p]['enemy_damage'] = world.enemy_damage[p]
settings_dict[p]['any_enemy_logic'] = world.any_enemy_logic[p]
settings_dict[p]['shufflepots'] = world.potshuffle[p]
settings_dict[p]['bombbag'] = world.bombbag[p]
settings_dict[p]['shufflelinks'] = world.shufflelinks[p]

View File

@@ -114,7 +114,8 @@ SETTINGSTOPROCESS = {
"enemyshuffle": "shuffleenemies",
"bossshuffle": "shufflebosses",
"enemydamage": "enemy_damage",
"enemyhealth": "enemy_health"
"enemyhealth": "enemy_health",
"enemylogic": "any_enemy_logic"
},
"gameoptions": {
"nobgm": "disablemusic",

View File

@@ -289,16 +289,12 @@ def randomize_underworld_rooms(data_tables, world, player):
if wallmaster_chosen:
candidate_sprites = [x for x in candidate_sprites if x.sprite != EnemySprite.Wallmaster]
if sprite.drops_item:
choice_list = [x for x in candidate_sprites if x.good_for_key_drop()]
forbidden = determine_forbidden(any_enemy_logic == 'none', room_id, True)
choice_list = [x for x in candidate_sprites if x.good_for_key_drop(forbidden)]
# terrorpin, deadrock, buzzblob, lynel, redmimic/eyegore
elif room_id in shutter_sprites and i in shutter_sprites[room_id]:
forbidden_set = set()
if not any_enemy_logic:
forbidden_set.update({EnemySprite.Terrorpin, EnemySprite.Deadrock, EnemySprite.Buzzblob,
EnemySprite.Lynel})
if room_id not in {0x6b, 0x4b, 0x1b, 0xd8}: # mimics/eyegore are allowed in vanilla
forbidden_set.add(EnemySprite.RedEyegoreMimic)
choice_list = [x for x in candidate_sprites if x.good_for_shutter(forbidden_set)]
forbidden = determine_forbidden(any_enemy_logic != 'allow_all', room_id)
choice_list = [x for x in candidate_sprites if x.good_for_shutter(forbidden)]
else:
choice_list = [x for x in candidate_sprites if not x.water_only]
choice_list = filter_choices(choice_list, room_id, i, data_tables.uw_enemy_denials)
@@ -317,6 +313,20 @@ def randomize_underworld_rooms(data_tables, world, player):
# done with rooms
def determine_forbidden(forbid, room_id, drop_flag=False):
forbidden_set = set()
if forbid:
forbidden_set.update({EnemySprite.Terrorpin, EnemySprite.Deadrock, EnemySprite.Buzzblob,
EnemySprite.Lynel})
if drop_flag:
forbidden_set.add(EnemySprite.RedBari) # requires FireRod to Drop
# else: Not yet able to protect triggers, would change default GT tile room behavior
# forbidden_set.add(EnemySprite.AntiFairy) # can't drop anyway
if room_id not in {0x6b, 0x4b, 0x1b, 0xd8}: # mimics/eyegore are allowed in vanilla rooms
forbidden_set.add(EnemySprite.RedEyegoreMimic)
return forbidden_set
def filter_choices(options, room_id, sprite_idx, denials):
key = room_id, sprite_idx
return [x for x in options if key not in denials or x.sprite not in denials[key]]

View File

@@ -96,8 +96,8 @@ class SpriteRequirement:
return False
return self.killable and not self.static and not self.dont_use and self.uw_valid
def good_for_key_drop(self):
return self.good_for_shutter() and self.can_drop
def good_for_key_drop(self, forbidden):
return self.good_for_shutter(forbidden) and self.can_drop
def __str__(self):
return f'Req for {enemy_names[self.sprite]}'

View File

@@ -26,7 +26,7 @@ def enemizer_page(parent,settings):
self.frames["selectOptionsFrame"].pack(fill=X)
self.frames["leftEnemizerFrame"].pack(side=LEFT)
self.frames["rightEnemizerFrame"].pack(side=RIGHT)
self.frames["bottomEnemizerFrame"].pack(fill=X)
self.frames["bottomEnemizerFrame"].pack(fill=X, padx=(12, 0))
# Load Enemizer option widgets as defined by JSON file
# Defns include frame name, widget type, widget options, widget placement attributes
@@ -40,6 +40,8 @@ def enemizer_page(parent,settings):
packAttrs = {"anchor":E}
if self.widgets[key].type == "checkbox":
packAttrs["anchor"] = W
if framename == 'bottomEnemizerFrame':
packAttrs["anchor"] = W
self.widgets[key].pack(packAttrs)
return self, settings

View File

@@ -182,6 +182,7 @@ def roll_settings(weights):
ret.enemy_damage = damage_choice
ret.enemy_health = get_choice('enemy_health')
ret.any_enemy_logic = get_choice('any_enemy_logic')
ret.beemizer = get_choice('beemizer') if 'beemizer' in weights else '0'