mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
Add Singularity and Duality Boss Shuffles
This commit is contained in:
31
Bosses.py
31
Bosses.py
@@ -119,6 +119,8 @@ boss_table = {
|
||||
'Agahnim2': ('Agahnim2', AgahnimDefeatRule)
|
||||
}
|
||||
|
||||
anywhere_bosses = ["Moldorm", "Helmasaur King", "Mothula", "Vitreous"]
|
||||
|
||||
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':
|
||||
return False
|
||||
@@ -178,7 +180,7 @@ def place_bosses(world, player):
|
||||
['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']]
|
||||
|
||||
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
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
elif world.boss_shuffle[player] == "chaos": #all bosses chosen at random
|
||||
for [loc, level] in boss_locations:
|
||||
@@ -215,5 +217,26 @@ def place_bosses(world, player):
|
||||
except IndexError:
|
||||
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)
|
||||
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)
|
Reference in New Issue
Block a user