Various fixes:

Full boss shuffle samples without replacement
Vanilla doors simply unmarks ugly smalls
Money balance: handle multiworld solvent players better
Perf for item pool adjustment
Add loglevel to Mystery
This commit is contained in:
aerinon
2021-08-03 08:43:47 -06:00
parent cd86e14677
commit aeb910e274
5 changed files with 18 additions and 7 deletions

View File

@@ -176,8 +176,8 @@ def place_bosses(world, player):
if world.boss_shuffle[player] == "simple": # vanilla bosses shuffled if world.boss_shuffle[player] == "simple": # vanilla bosses shuffled
bosses = placeable_bosses + ['Armos Knights', 'Lanmolas', 'Moldorm'] bosses = placeable_bosses + ['Armos Knights', 'Lanmolas', 'Moldorm']
else: # all bosses present, the three duplicates chosen at random else: # all bosses present, the three duplicates chosen at random
bosses = all_bosses + [random.choice(placeable_bosses) for _ in range(3)] bosses = all_bosses + random.sample(placeable_bosses, 3)
logging.getLogger('').debug('Bosses chosen %s', bosses) logging.getLogger('').debug('Bosses chosen %s', bosses)

View File

@@ -101,6 +101,8 @@ def link_doors_main(world, player):
connect_portal(portal, world, player) connect_portal(portal, world, player)
if not world.doorShuffle[player] == 'vanilla': if not world.doorShuffle[player] == 'vanilla':
fix_big_key_doors_with_ugly_smalls(world, player) fix_big_key_doors_with_ugly_smalls(world, player)
else:
unmark_ugly_smalls(world, player)
if world.doorShuffle[player] == 'vanilla': if world.doorShuffle[player] == 'vanilla':
for entrance, ext in open_edges: for entrance, ext in open_edges:
connect_two_way(world, entrance, ext, player) connect_two_way(world, entrance, ext, player)
@@ -316,6 +318,13 @@ def connect_one_way(world, entrancename, exitname, player):
y.dest = x y.dest = x
def unmark_ugly_smalls(world, player):
for d in ['Eastern Hint Tile Blocked Path SE', 'Eastern Darkness S', 'Thieves Hallway SE', 'Mire Left Bridge S',
'TR Lava Escape SE', 'GT Hidden Spikes SE']:
door = world.get_door(d, player)
door.smallKey = False
def fix_big_key_doors_with_ugly_smalls(world, player): def fix_big_key_doors_with_ugly_smalls(world, player):
remove_ugly_small_key_doors(world, player) remove_ugly_small_key_doors(world, player)
unpair_big_key_doors(world, player) unpair_big_key_doors(world, player)

View File

@@ -736,7 +736,7 @@ def balance_money_progression(world):
solvent.add(player) solvent.add(player)
if sphere_costs[player] > 0 and sphere_costs[player] > wallet[player]: if sphere_costs[player] > 0 and sphere_costs[player] > wallet[player]:
insolvent.add(player) insolvent.add(player)
if len(solvent) == 0: if len([p for p in solvent if len(locked_by_money[p]) > 0]) == 0:
target_player = min(insolvent, key=lambda p: sphere_costs[p]-wallet[p]) target_player = min(insolvent, key=lambda p: sphere_costs[p]-wallet[p])
difference = sphere_costs[target_player]-wallet[target_player] difference = sphere_costs[target_player]-wallet[target_player]
logger.debug(f'Money balancing needed: Player {target_player} short {difference}') logger.debug(f'Money balancing needed: Player {target_player} short {difference}')

View File

@@ -347,11 +347,11 @@ def generate_itempool(world, player):
# rather than making all hearts/heart pieces progression items (which slows down generation considerably) # rather than making all hearts/heart pieces progression items (which slows down generation considerably)
# We mark one random heart container as an advancement item (or 4 heart pieces in expert mode) # We mark one random heart container as an advancement item (or 4 heart pieces in expert mode)
if world.difficulty[player] in ['normal', 'hard'] and not (world.custom and world.customitemarray[player]["heartcontainer"] == 0): if world.difficulty[player] in ['normal', 'hard'] and not (world.custom and world.customitemarray[player]["heartcontainer"] == 0):
[item for item in items if item.name == 'Boss Heart Container'][0].advancement = True next(item for item in items if item.name == 'Boss Heart Container').advancement = True
elif world.difficulty[player] in ['expert'] and not (world.custom and world.customitemarray[player]["heartpiece"] < 4): elif world.difficulty[player] in ['expert'] and not (world.custom and world.customitemarray[player]["heartpiece"] < 4):
adv_heart_pieces = [item for item in items if item.name == 'Piece of Heart'][0:4] adv_heart_pieces = (item for item in items if item.name == 'Piece of Heart')
for hp in adv_heart_pieces: for i in range(4):
hp.advancement = True next(adv_heart_pieces).advancement = True
beeweights = {'0': {None: 100}, beeweights = {'0': {None: 100},
'1': {None: 75, 'trap': 25}, '1': {None: 75, 'trap': 25},

View File

@@ -31,6 +31,7 @@ def main():
parser.add_argument('--rom') parser.add_argument('--rom')
parser.add_argument('--enemizercli') parser.add_argument('--enemizercli')
parser.add_argument('--outputpath') parser.add_argument('--outputpath')
parser.add_argument('--loglevel', default='info', choices=['debug', 'info', 'warning', 'error', 'critical'])
for player in range(1, multiargs.multi + 1): for player in range(1, multiargs.multi + 1):
parser.add_argument(f'--p{player}', help=argparse.SUPPRESS) parser.add_argument(f'--p{player}', help=argparse.SUPPRESS)
args = parser.parse_args() args = parser.parse_args()
@@ -63,6 +64,7 @@ def main():
erargs.race = True erargs.race = True
erargs.outputname = seedname erargs.outputname = seedname
erargs.outputpath = args.outputpath erargs.outputpath = args.outputpath
erargs.loglevel = args.loglevel
if args.rom: if args.rom:
erargs.rom = args.rom erargs.rom = args.rom