Add Singularity and Duality Boss Shuffles
This commit is contained in:
parent
4e47be38f9
commit
25b43e8357
31
Bosses.py
31
Bosses.py
|
@ -119,6 +119,8 @@ boss_table = {
|
||||||
'Agahnim2': ('Agahnim2', AgahnimDefeatRule)
|
'Agahnim2': ('Agahnim2', AgahnimDefeatRule)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
anywhere_bosses = ["Moldorm", "Helmasaur King", "Mothula", "Vitreous"]
|
||||||
|
|
||||||
def can_place_boss(world, player, boss, dungeon_name, level=None):
|
def can_place_boss(world, player, boss, dungeon_name, level=None):
|
||||||
if world.swords[player] in ['swordless'] and boss == 'Kholdstare' and dungeon_name != 'Ice Palace':
|
if world.swords[player] in ['swordless'] and boss == 'Kholdstare' and dungeon_name != 'Ice Palace':
|
||||||
return False
|
return False
|
||||||
|
@ -178,7 +180,7 @@ def place_bosses(world, player):
|
||||||
['Inverted Ganons Tower', 'bottom'],
|
['Inverted Ganons Tower', 'bottom'],
|
||||||
]
|
]
|
||||||
|
|
||||||
all_bosses = sorted(boss_table.keys()) #s orted to be deterministic on older pythons
|
all_bosses = sorted(boss_table.keys()) #sorted to be deterministic on older pythons
|
||||||
placeable_bosses = [boss for boss in all_bosses if boss not in ['Agahnim', 'Agahnim2', 'Ganon']]
|
placeable_bosses = [boss for boss in all_bosses if boss not in ['Agahnim', 'Agahnim2', 'Ganon']]
|
||||||
|
|
||||||
if world.boss_shuffle[player] in ["basic", "normal"]:
|
if world.boss_shuffle[player] in ["basic", "normal"]:
|
||||||
|
@ -194,7 +196,7 @@ def place_bosses(world, player):
|
||||||
else: # all bosses present, the three duplicates chosen at random
|
else: # all bosses present, the three duplicates chosen at random
|
||||||
bosses = all_bosses + [world.random.choice(placeable_bosses) for _ in range(3)]
|
bosses = all_bosses + [world.random.choice(placeable_bosses) for _ in range(3)]
|
||||||
|
|
||||||
logging.getLogger('').debug('Bosses chosen %s', bosses)
|
logging.debug('Bosses chosen %s', bosses)
|
||||||
|
|
||||||
world.random.shuffle(bosses)
|
world.random.shuffle(bosses)
|
||||||
for [loc, level] in boss_locations:
|
for [loc, level] in boss_locations:
|
||||||
|
@ -204,7 +206,7 @@ def place_bosses(world, player):
|
||||||
raise FillError('Could not place boss for location %s' % loc_text)
|
raise FillError('Could not place boss for location %s' % loc_text)
|
||||||
bosses.remove(boss)
|
bosses.remove(boss)
|
||||||
|
|
||||||
logging.getLogger('').debug('Placing boss %s at %s', boss, loc_text)
|
logging.debug('Placing boss %s at %s', boss, loc_text)
|
||||||
world.get_dungeon(loc, player).bosses[level] = BossFactory(boss, player)
|
world.get_dungeon(loc, player).bosses[level] = BossFactory(boss, player)
|
||||||
elif world.boss_shuffle[player] == "chaos": #all bosses chosen at random
|
elif world.boss_shuffle[player] == "chaos": #all bosses chosen at random
|
||||||
for [loc, level] in boss_locations:
|
for [loc, level] in boss_locations:
|
||||||
|
@ -215,5 +217,26 @@ def place_bosses(world, player):
|
||||||
except IndexError:
|
except IndexError:
|
||||||
raise FillError('Could not place boss for location %s' % loc_text)
|
raise FillError('Could not place boss for location %s' % loc_text)
|
||||||
|
|
||||||
logging.getLogger('').debug('Placing boss %s at %s', boss, loc_text)
|
logging.debug('Placing boss %s at %s', boss, loc_text)
|
||||||
world.get_dungeon(loc, player).bosses[level] = BossFactory(boss, player)
|
world.get_dungeon(loc, player).bosses[level] = BossFactory(boss, player)
|
||||||
|
elif world.boss_shuffle[player] == "singularity":
|
||||||
|
if world.swords[player] == 'swordless':
|
||||||
|
boss = world.random.choice(anywhere_bosses)
|
||||||
|
else:
|
||||||
|
boss = world.random.choice(anywhere_bosses + ["Kholdstare"])
|
||||||
|
for [loc, level] in boss_locations:
|
||||||
|
logging.debug('Placing boss %s at %s', boss, loc + (' ('+level+')' if level else ''))
|
||||||
|
world.get_dungeon(loc, player).bosses[level] = BossFactory(boss, player)
|
||||||
|
elif world.boss_shuffle[player] == "duality":
|
||||||
|
if world.swords[player] == 'swordless':
|
||||||
|
used_anywhere_bosses = anywhere_bosses
|
||||||
|
else:
|
||||||
|
used_anywhere_bosses = anywhere_bosses + ["Kholdstare"]
|
||||||
|
|
||||||
|
limited_boss = world.random.choice([boss for boss in placeable_bosses if boss not in used_anywhere_bosses])
|
||||||
|
anywhere_boss = world.random.choice(used_anywhere_bosses)
|
||||||
|
|
||||||
|
for [loc, level] in boss_locations:
|
||||||
|
boss = limited_boss if can_place_boss(world, player, limited_boss, loc, level) else anywhere_boss
|
||||||
|
logging.debug('Placing boss %s at %s', boss, loc + (' ('+level+')' if level else ''))
|
||||||
|
world.get_dungeon(loc, player).bosses[level] = BossFactory(boss, player)
|
|
@ -290,7 +290,8 @@ def parse_arguments(argv, no_defaults=False):
|
||||||
help="Skip Multiworld Progression balancing.")
|
help="Skip Multiworld Progression balancing.")
|
||||||
parser.add_argument('--skip_playthrough', action='store_true', default=defval(False))
|
parser.add_argument('--skip_playthrough', action='store_true', default=defval(False))
|
||||||
parser.add_argument('--enemizercli', default=defval('EnemizerCLI/EnemizerCLI.Core'))
|
parser.add_argument('--enemizercli', default=defval('EnemizerCLI/EnemizerCLI.Core'))
|
||||||
parser.add_argument('--shufflebosses', default=defval('none'), choices=['none', 'basic', 'normal', 'chaos'])
|
parser.add_argument('--shufflebosses', default=defval('none'), choices=['none', 'basic', 'normal', 'chaos',
|
||||||
|
"singularity", "duality"])
|
||||||
parser.add_argument('--shuffleenemies', default=defval('none'),
|
parser.add_argument('--shuffleenemies', default=defval('none'),
|
||||||
choices=['none', 'shuffled', 'chaos', 'chaosthieves'])
|
choices=['none', 'shuffled', 'chaos', 'chaosthieves'])
|
||||||
parser.add_argument('--enemy_health', default=defval('default'),
|
parser.add_argument('--enemy_health', default=defval('default'),
|
||||||
|
|
3
Gui.py
3
Gui.py
|
@ -384,7 +384,8 @@ def guiMain(args=None):
|
||||||
enemizerBossLabel.pack(side=LEFT)
|
enemizerBossLabel.pack(side=LEFT)
|
||||||
enemizerBossVar = StringVar()
|
enemizerBossVar = StringVar()
|
||||||
enemizerBossVar.set('none')
|
enemizerBossVar.set('none')
|
||||||
enemizerBossOption = OptionMenu(enemizerBossFrame, enemizerBossVar, 'none', 'basic', 'normal', 'chaos')
|
enemizerBossOption = OptionMenu(enemizerBossFrame, enemizerBossVar, 'none', 'basic', 'normal', 'chaos',
|
||||||
|
"singularity", "duality")
|
||||||
enemizerBossOption.pack(side=LEFT)
|
enemizerBossOption.pack(side=LEFT)
|
||||||
|
|
||||||
enemizerDamageFrame = Frame(enemizerFrame)
|
enemizerDamageFrame = Frame(enemizerFrame)
|
||||||
|
|
|
@ -329,7 +329,9 @@ def roll_settings(weights):
|
||||||
ret.shufflebosses = {'none': 'none',
|
ret.shufflebosses = {'none': 'none',
|
||||||
'simple': 'basic',
|
'simple': 'basic',
|
||||||
'full': 'normal',
|
'full': 'normal',
|
||||||
'random': 'chaos'
|
'random': 'chaos',
|
||||||
|
'singularity': 'singularity',
|
||||||
|
'duality': 'duality'
|
||||||
}[get_choice('boss_shuffle', weights)]
|
}[get_choice('boss_shuffle', weights)]
|
||||||
|
|
||||||
ret.shuffleenemies = {'none': 'none',
|
ret.shuffleenemies = {'none': 'none',
|
||||||
|
|
|
@ -147,6 +147,8 @@ boss_shuffle:
|
||||||
simple: 0 # Existing bosses except Ganon and Agahnim are shuffled throughout dungeons
|
simple: 0 # Existing bosses except Ganon and Agahnim are shuffled throughout dungeons
|
||||||
full: 0 # 3 bosses can occur twice
|
full: 0 # 3 bosses can occur twice
|
||||||
random: 0 # Any boss can appear any amount of times
|
random: 0 # Any boss can appear any amount of times
|
||||||
|
singularity: 0 # picks any boss that can appear anywhere and puts that boss into every arena
|
||||||
|
duality: 0 # picks a boss that can only appear in some places and a boss that can appear anywhere, then attempts to put both in that order in every arena
|
||||||
enemy_shuffle:
|
enemy_shuffle:
|
||||||
none: 1 # Vanilla enemy placement
|
none: 1 # Vanilla enemy placement
|
||||||
chaos: 0 # Enemies are randomized
|
chaos: 0 # Enemies are randomized
|
||||||
|
|
Loading…
Reference in New Issue