From d86eb69b4cf1b6eabab6d2a2a6ed7d5455c7a7e7 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Tue, 25 Aug 2020 17:44:03 +0200 Subject: [PATCH] Remove old fill algorithms that I have no intention to optimize or support in the future --- BaseClasses.py | 1 - EntranceRandomizer.py | 11 +-- Fill.py | 154 ------------------------------------------ Gui.py | 2 +- Main.py | 10 +-- 5 files changed, 4 insertions(+), 174 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 42502b58..f39e9ad2 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -972,7 +972,6 @@ class Location(object): self.spot_type = 'Location' self.hint_text: str = hint_text if hint_text else name self.recursion_count = 0 - self.staleness_count = 0 self.event = False self.locked = False self.always_allow = lambda item, state: False diff --git a/EntranceRandomizer.py b/EntranceRandomizer.py index 97cd0946..bada7a32 100755 --- a/EntranceRandomizer.py +++ b/EntranceRandomizer.py @@ -155,7 +155,8 @@ def parse_arguments(argv, no_defaults=False): category, be randomly progressive or not. Link will die in one hit. ''') - parser.add_argument('--algorithm', default=defval('balanced'), const='balanced', nargs='?', choices=['freshness', 'flood', 'vt21', 'vt22', 'vt25', 'vt26', 'balanced'], + parser.add_argument('--algorithm', default=defval('balanced'), const='balanced', nargs='?', + choices=['freshness', 'flood', 'vt25', 'vt26', 'balanced'], help='''\ Select item filling algorithm. (default: %(default)s balanced: vt26 derivitive that aims to strike a balance between @@ -166,14 +167,6 @@ def parse_arguments(argv, no_defaults=False): dungeon keys and items. vt25: Shuffle items and place them in a random location that it is not impossible to be in. - vt21: Unbiased in its selection, but has tendency to put - Ice Rod in Turtle Rock. - vt22: Drops off stale locations after 1/3 of progress - items were placed to try to circumvent vt21\'s - shortcomings. - Freshness: Keep track of stale locations (ones that cannot be - reached yet) and decrease likeliness of selecting - them the more often they were found unreachable. Flood: Push out items starting from Link\'s House and slightly biased to placing progression items with less restrictions. diff --git a/Fill.py b/Fill.py index 77fa1818..2aef1b84 100644 --- a/Fill.py +++ b/Fill.py @@ -7,160 +7,6 @@ from BaseClasses import CollectionState class FillError(RuntimeError): pass -def distribute_items_cutoff(world, cutoffrate=0.33): - # get list of locations to fill in - fill_locations = world.get_unfilled_locations() - world.random.shuffle(fill_locations) - - # get items to distribute - world.random.shuffle(world.itempool) - itempool = world.itempool - - total_advancement_items = len([item for item in itempool if item.advancement]) - placed_advancement_items = 0 - - progress_done = False - advancement_placed = False - - # sweep once to pick up preplaced items - world.state.sweep_for_events() - - while itempool and fill_locations: - candidate_item_to_place = None - item_to_place = None - for item in itempool: - if advancement_placed or (progress_done and (item.advancement or item.priority)): - item_to_place = item - break - if item.advancement: - candidate_item_to_place = item - if world.unlocks_new_location(item): - item_to_place = item - placed_advancement_items += 1 - break - - if item_to_place is None: - # check if we can reach all locations and that is why we find no new locations to place - if not progress_done and len(world.get_reachable_locations()) == len(world.get_locations()): - progress_done = True - continue - # check if we have now placed all advancement items - if progress_done: - advancement_placed = True - continue - # we might be in a situation where all new locations require multiple items to reach. If that is the case, just place any advancement item we've found and continue trying - if candidate_item_to_place is not None: - item_to_place = candidate_item_to_place - placed_advancement_items += 1 - else: - # we placed all available progress items. Maybe the game can be beaten anyway? - if world.can_beat_game(): - logging.getLogger('').warning('Not all locations reachable. Game beatable anyway.') - progress_done = True - continue - raise FillError('No more progress items left to place.') - - spot_to_fill = None - for location in fill_locations if placed_advancement_items / total_advancement_items < cutoffrate else reversed(fill_locations): - if location.can_fill(world.state, item_to_place): - spot_to_fill = location - break - - if spot_to_fill is None: - # we filled all reachable spots. Maybe the game can be beaten anyway? - if world.can_beat_game(): - logging.getLogger('').warning('Not all items placed. Game beatable anyway.') - break - raise FillError('No more spots to place %s' % item_to_place) - - world.push_item(spot_to_fill, item_to_place, True) - itempool.remove(item_to_place) - fill_locations.remove(spot_to_fill) - - logging.getLogger('').debug('Unplaced items: %s - Unfilled Locations: %s', [item.name for item in itempool], [location.name for location in fill_locations]) - - -def distribute_items_staleness(world): - # get list of locations to fill in - fill_locations = world.get_unfilled_locations() - world.random.shuffle(fill_locations) - - # get items to distribute - world.random.shuffle(world.itempool) - itempool = world.itempool - - progress_done = False - advancement_placed = False - - # sweep once to pick up preplaced items - world.state.sweep_for_events() - - while itempool and fill_locations: - candidate_item_to_place = None - item_to_place = None - for item in itempool: - if advancement_placed or (progress_done and (item.advancement or item.priority)): - item_to_place = item - break - if item.advancement: - candidate_item_to_place = item - if world.unlocks_new_location(item): - item_to_place = item - break - - if item_to_place is None: - # check if we can reach all locations and that is why we find no new locations to place - if not progress_done and len(world.get_reachable_locations()) == len(world.get_locations()): - progress_done = True - continue - # check if we have now placed all advancement items - if progress_done: - advancement_placed = True - continue - # we might be in a situation where all new locations require multiple items to reach. If that is the case, just place any advancement item we've found and continue trying - if candidate_item_to_place is not None: - item_to_place = candidate_item_to_place - else: - # we placed all available progress items. Maybe the game can be beaten anyway? - if world.can_beat_game(): - logging.getLogger('').warning('Not all locations reachable. Game beatable anyway.') - progress_done = True - continue - raise FillError('No more progress items left to place.') - - spot_to_fill = None - for location in fill_locations: - # increase likelyhood of skipping a location if it has been found stale - if not progress_done and world.random.randint(0, location.staleness_count) > 2: - continue - - if location.can_fill(world.state, item_to_place): - spot_to_fill = location - break - else: - location.staleness_count += 1 - - # might have skipped too many locations due to potential staleness. Do not check for staleness now to find a candidate - if spot_to_fill is None: - for location in fill_locations: - if location.can_fill(world.state, item_to_place): - spot_to_fill = location - break - - if spot_to_fill is None: - # we filled all reachable spots. Maybe the game can be beaten anyway? - if world.can_beat_game(): - logging.getLogger('').warning('Not all items placed. Game beatable anyway.') - break - raise FillError('No more spots to place %s' % item_to_place) - - world.push_item(spot_to_fill, item_to_place, True) - itempool.remove(item_to_place) - fill_locations.remove(spot_to_fill) - - logging.getLogger('').debug('Unplaced items: %s - Unfilled Locations: %s', [item.name for item in itempool], [location.name for location in fill_locations]) - - def fill_restrictive(world, base_state: CollectionState, locations, itempool, single_player_placement=False): def sweep_from_pool(): new_state = base_state.copy() diff --git a/Gui.py b/Gui.py index cc2286b0..d15a0a64 100755 --- a/Gui.py +++ b/Gui.py @@ -336,7 +336,7 @@ def guiMain(args=None): algorithmFrame = Frame(drowDownFrame) algorithmVar = StringVar() algorithmVar.set('balanced') - algorithmOptionMenu = OptionMenu(algorithmFrame, algorithmVar, 'freshness', 'flood', 'vt21', 'vt22', 'vt25', 'vt26', 'balanced') + algorithmOptionMenu = OptionMenu(algorithmFrame, algorithmVar, 'flood', 'vt25', 'vt26', 'balanced') algorithmOptionMenu.pack(side=RIGHT) algorithmLabel = Label(algorithmFrame, text='Item distribution algorithm') algorithmLabel.pack(side=LEFT) diff --git a/Main.py b/Main.py index cf0594b1..6e944017 100644 --- a/Main.py +++ b/Main.py @@ -17,8 +17,7 @@ from EntranceShuffle import link_entrances, link_inverted_entrances from Rom import patch_rom, patch_race_rom, patch_enemizer, apply_rom_settings, LocalRom, get_hash_string from Rules import set_rules from Dungeons import create_dungeons, fill_dungeons, fill_dungeons_restrictive -from Fill import distribute_items_cutoff, distribute_items_staleness, distribute_items_restrictive, flood_items, \ - balance_multiworld_progression +from Fill import distribute_items_restrictive, flood_items, balance_multiworld_progression from ItemPool import generate_itempool, difficulties, fill_prizes from Utils import output_path, parse_player_names, get_options, __version__, _version_tuple import Patch @@ -160,16 +159,9 @@ def main(args, seed=None): if args.algorithm == 'flood': flood_items(world) # different algo, biased towards early game progress items - elif args.algorithm == 'vt21': - distribute_items_cutoff(world, 1) - elif args.algorithm == 'vt22': - distribute_items_cutoff(world, 0.66) - elif args.algorithm == 'freshness': - distribute_items_staleness(world) elif args.algorithm == 'vt25': distribute_items_restrictive(world, False) elif args.algorithm == 'vt26': - distribute_items_restrictive(world, True, shuffled_locations) elif args.algorithm == 'balanced': distribute_items_restrictive(world, True)