Merge pull request from Berserker66/tweaks_and_fixes

Tweaks and fixes
This commit is contained in:
Fabian Dill 2020-06-19 04:52:07 +02:00 committed by GitHub
commit 10f675a61e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 31 deletions

View File

@ -82,10 +82,10 @@ def parse_arguments(argv, no_defaults=False):
20 of them to beat the game. 20 of them to beat the game.
''') ''')
parser.add_argument('--triforce_pieces_available', default=defval(30), parser.add_argument('--triforce_pieces_available', default=defval(30),
type=lambda value: min(max(int(value), 1), 112), type=lambda value: min(max(int(value), 1), 90),
help='''Set Triforce Pieces available in item pool.''') help='''Set Triforce Pieces available in item pool.''')
parser.add_argument('--triforce_pieces_required', default=defval(20), parser.add_argument('--triforce_pieces_required', default=defval(20),
type=lambda value: min(max(int(value), 1), 112), type=lambda value: min(max(int(value), 1), 90),
help='''Set Triforce Pieces required to win a Triforce Hunt''') help='''Set Triforce Pieces required to win a Triforce Hunt''')
parser.add_argument('--difficulty', default=defval('normal'), const='normal', nargs='?', parser.add_argument('--difficulty', default=defval('normal'), const='normal', nargs='?',
choices=['normal', 'hard', 'expert'], choices=['normal', 'hard', 'expert'],

View File

@ -64,8 +64,8 @@ difficulties = {
progressive_armor_limit = 2, progressive_armor_limit = 2,
progressive_bow_limit = 2, progressive_bow_limit = 2,
progressive_bottle_limit = 4, progressive_bottle_limit = 4,
boss_heart_container_limit = 255, boss_heart_container_limit = 10,
heart_piece_limit = 255, heart_piece_limit = 24,
), ),
'hard': Difficulty( 'hard': Difficulty(
baseitems = normalbaseitems, baseitems = normalbaseitems,

View File

@ -63,14 +63,14 @@ def main():
weights_cache[args.weights] = get_weights(args.weights) weights_cache[args.weights] = get_weights(args.weights)
except Exception as e: except Exception as e:
raise ValueError(f"File {args.weights} is destroyed. Please fix your yaml.") from e raise ValueError(f"File {args.weights} is destroyed. Please fix your yaml.") from e
print(f"Weights: {args.weights} >> {weights_cache[args.weights]['description']}") print(f"Weights: {args.weights} >> {get_choice('description', weights_cache[args.weights], 'No description specified')}")
if args.meta: if args.meta:
try: try:
weights_cache[args.meta] = get_weights(args.meta) weights_cache[args.meta] = get_weights(args.meta)
except Exception as e: except Exception as e:
raise ValueError(f"File {args.meta} is destroyed. Please fix your yaml.") from e raise ValueError(f"File {args.meta} is destroyed. Please fix your yaml.") from e
meta_weights = weights_cache[args.meta] meta_weights = weights_cache[args.meta]
print(f"Meta: {args.meta} >> {meta_weights['meta_description']}") print(f"Meta: {args.meta} >> {get_choice('meta_description', meta_weights, 'No description specified')}")
if args.samesettings: if args.samesettings:
raise Exception("Cannot mix --samesettings with --meta") raise Exception("Cannot mix --samesettings with --meta")
@ -80,7 +80,7 @@ def main():
try: try:
if path not in weights_cache: if path not in weights_cache:
weights_cache[path] = get_weights(path) weights_cache[path] = get_weights(path)
print(f"P{player} Weights: {path} >> {weights_cache[path]['description']}") print(f"P{player} Weights: {path} >> {get_choice('description', weights_cache[path], 'No description specified')}")
except Exception as e: except Exception as e:
raise ValueError(f"File {path} is destroyed. Please fix your yaml.") from e raise ValueError(f"File {path} is destroyed. Please fix your yaml.") from e
@ -223,15 +223,17 @@ def convert_to_on_off(value):
return {True: "on", False: "off"}.get(value, value) return {True: "on", False: "off"}.get(value, value)
def get_choice(option, root) -> typing.Any: def get_choice(option, root, value=None) -> typing.Any:
if option not in root: if option not in root:
return None return value
if type(root[option]) is not dict: if type(root[option]) is not dict:
return interpret_on_off(root[option]) return interpret_on_off(root[option])
if not root[option]: if not root[option]:
return None return value
return interpret_on_off( if any(root[option].values()):
random.choices(list(root[option].keys()), weights=list(map(int, root[option].values())))[0]) return interpret_on_off(
random.choices(list(root[option].keys()), weights=list(map(int, root[option].values())))[0])
raise RuntimeError(f"All options specified in {option} are weighted as zero.")
def handle_name(name: str): def handle_name(name: str):
@ -257,8 +259,7 @@ def roll_settings(weights):
ret.logic = {None: 'noglitches', 'none': 'noglitches', 'no_logic': 'nologic', 'overworld_glitches': 'owglitches', ret.logic = {None: 'noglitches', 'none': 'noglitches', 'no_logic': 'nologic', 'overworld_glitches': 'owglitches',
'minor_glitches' : 'minorglitches'}[ 'minor_glitches' : 'minorglitches'}[
glitches_required] glitches_required]
ret.progression_balancing = get_choice('progression_balancing', ret.progression_balancing = get_choice('progression_balancing', weights, True)
weights) if 'progression_balancing' in weights else True
# item_placement = get_choice('item_placement') # item_placement = get_choice('item_placement')
# not supported in ER # not supported in ER
@ -270,10 +271,10 @@ def roll_settings(weights):
elif not dungeon_items: elif not dungeon_items:
dungeon_items = "" dungeon_items = ""
ret.mapshuffle = get_choice('map_shuffle', weights) if 'map_shuffle' in weights else 'm' in dungeon_items ret.mapshuffle = get_choice('map_shuffle', weights, 'm' in dungeon_items)
ret.compassshuffle = get_choice('compass_shuffle', weights) if 'compass_shuffle' in weights else 'c' in dungeon_items ret.compassshuffle = get_choice('compass_shuffle', weights, 'c' in dungeon_items)
ret.keyshuffle = get_choice('smallkey_shuffle', weights) if 'smallkey_shuffle' in weights else 's' in dungeon_items ret.keyshuffle = get_choice('smallkey_shuffle', weights, 's' in dungeon_items)
ret.bigkeyshuffle = get_choice('bigkey_shuffle', weights) if 'bigkey_shuffle' in weights else 'b' in dungeon_items ret.bigkeyshuffle = get_choice('bigkey_shuffle', weights, 'b' in dungeon_items)
ret.accessibility = get_choice('accessibility', weights) ret.accessibility = get_choice('accessibility', weights)
@ -295,14 +296,11 @@ def roll_settings(weights):
ret.crystals_ganon = get_choice('ganon_open', weights) ret.crystals_ganon = get_choice('ganon_open', weights)
ret.triforce_pieces_available = get_choice('triforce_pieces_available', ret.triforce_pieces_available = get_choice('triforce_pieces_available', weights, 30)
weights) if "triforce_pieces_available" in weights else 30 ret.triforce_pieces_available = min(max(1, int(ret.triforce_pieces_available)), 90)
ret.triforce_pieces_available = min(max(1, int(ret.triforce_pieces_available)), 112) ret.triforce_pieces_required = get_choice('triforce_pieces_required', weights, 20)
ret.triforce_pieces_required = min(max(1, int(ret.triforce_pieces_required)), 90)
ret.triforce_pieces_required = get_choice('triforce_pieces_required',
weights) if "triforce_pieces_required" in weights else 20
ret.triforce_pieces_required = min(max(1, int(ret.triforce_pieces_required)), 112)
ret.mode = get_choice('world_state', weights) ret.mode = get_choice('world_state', weights)
if ret.mode == 'retro': if ret.mode == 'retro':
@ -341,7 +339,7 @@ def roll_settings(weights):
ret.shufflepots = get_choice('pot_shuffle', weights) ret.shufflepots = get_choice('pot_shuffle', weights)
ret.beemizer = int(get_choice('beemizer', weights)) if 'beemizer' in weights else 0 ret.beemizer = int(get_choice('beemizer', weights, 0))
ret.timer = {'none': False, ret.timer = {'none': False,
None: False, None: False,
@ -350,11 +348,11 @@ def roll_settings(weights):
'timed_ohko': 'timed-ohko', 'timed_ohko': 'timed-ohko',
'ohko': 'ohko', 'ohko': 'ohko',
'timed_countdown': 'timed-countdown', 'timed_countdown': 'timed-countdown',
'display': 'display'}[get_choice('timer', weights)] if 'timer' in weights.keys() else False 'display': 'display'}[get_choice('timer', weights, False)]
ret.dungeon_counters = get_choice('dungeon_counters', weights) if 'dungeon_counters' in weights else 'default' ret.dungeon_counters = get_choice('dungeon_counters', weights, 'default')
ret.progressive = convert_to_on_off(get_choice('progressive', weights)) if "progressive" in weights else 'on' ret.progressive = convert_to_on_off(get_choice('progressive', weights, 'on'))
inventoryweights = weights.get('startinventory', {}) inventoryweights = weights.get('startinventory', {})
startitems = [] startitems = []
for item in inventoryweights.keys(): for item in inventoryweights.keys():
@ -368,9 +366,9 @@ def roll_settings(weights):
startitems.append(item) startitems.append(item)
ret.startinventory = ','.join(startitems) ret.startinventory = ','.join(startitems)
ret.glitch_boots = get_choice('glitch_boots', weights) if 'glitch_boots' in weights else True ret.glitch_boots = get_choice('glitch_boots', weights, True)
ret.remote_items = get_choice('remote_items', weights) if 'remote_items' in weights else False ret.remote_items = get_choice('remote_items', weights, False)
if "l" in dungeon_items: if "l" in dungeon_items:
ret.local_items = {"Small Keys", "Big Keys"} ret.local_items = {"Small Keys", "Big Keys"}