From 51cac40bab098197d50ac16888b7c50b84252c97 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Mon, 3 Jan 2022 15:59:22 -0600 Subject: [PATCH] Restructured triforce piece pool allocation, capped at 128 --- BaseClasses.py | 13 ++++++------- ItemList.py | 42 +++++++++++++++++++----------------------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index aa03d9f2..4b63d4a4 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -2834,13 +2834,12 @@ class Spoiler(object): 'triforcepool': self.world.treasure_hunt_total, 'code': {p: Settings.make_code(self.world, p) for p in range(1, self.world.players + 1)} } - if self.world.custom: - for p in range(1, self.world.players + 1): - if p in self.world.customitemarray: - if self.world.customitemarray[p]["triforcepiecesgoal"] > 0: - self.metadata['triforcegoal'][p] = max(min(self.world.customitemarray[p]["triforcepiecesgoal"], 99), 1) - if self.world.customitemarray[p]["triforcepieces"] > 0: - self.metadata['triforcepool'][p] = max(min(self.world.customitemarray[p]["triforcepieces"], 168), self.metadata['triforcegoal'][p]) + for p in range(1, self.world.players + 1): + from ItemList import set_default_triforce + if self.world.custom and p in self.world.customitemarray: + self.metadata['triforcegoal'][p], self.metadata['triforcepool'][p] = set_default_triforce(self.metadata['goal'][p], self.world.customitemarray[p]["triforcepiecesgoal"], self.world.customitemarray[p]["triforcepieces"]) + else: + self.metadata['triforcegoal'][p], self.metadata['triforcepool'][p] = set_default_triforce(self.metadata['goal'][p], 0, 0) def parse_data(self): self.medallions = OrderedDict() diff --git a/ItemList.py b/ItemList.py index 6c0d671f..f1ba9724 100644 --- a/ItemList.py +++ b/ItemList.py @@ -263,7 +263,7 @@ def generate_itempool(world, player): # set up item pool if world.custom and player in world.customitemarray: - (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_total, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.bombbag[player], world.customitemarray) + (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_total, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.bombbag[player], world.customitemarray[player]) world.rupoor_cost = min(world.customitemarray[player]["rupoorcost"], 9999) else: (pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms) = get_pool_core(world.progressive, world.shuffle[player], world.difficulty[player], world.treasure_hunt_total[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.bombbag[player], world.doorShuffle[player], world.logic[player]) @@ -338,14 +338,8 @@ def generate_itempool(world, player): world.clock_mode = clock_mode if world.goal[player] in ['triforcehunt', 'trinity']: - if world.treasure_hunt_count[player] == 0: - world.treasure_hunt_count[player] = 20 - if world.treasure_hunt_total[player] == 0: - world.treasure_hunt_total[player] = 30 + world.treasure_hunt_count[player], world.treasure_hunt_total[player] = set_default_triforce(world.goal[player], world.treasure_hunt_count[player], world.treasure_hunt_total[player]) world.treasure_hunt_icon[player] = 'Triforce Piece' - if world.custom and player in world.customitemarray: - world.treasure_hunt_count[player] = treasure_hunt_count - world.treasure_hunt_total[player] = treasure_hunt_total world.itempool.extend([item for item in get_dungeon_item_pool(world) if item.player == player and ((item.smallkey and world.keyshuffle[player]) @@ -902,13 +896,12 @@ def get_pool_core(progressive, shuffle, difficulty, treasure_hunt_total, timer, return (pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms) def make_custom_item_pool(progressive, shuffle, difficulty, timer, goal, mode, swords, retro, bombbag, customitemarray): - if isinstance(customitemarray,dict) and 1 in customitemarray: - customitemarray = customitemarray[1] pool = [] placed_items = {} precollected_items = [] clock_mode = None treasure_hunt_count = None + treasure_hunt_total = None treasure_hunt_icon = None def place_item(loc, item): @@ -917,15 +910,19 @@ def make_custom_item_pool(progressive, shuffle, difficulty, timer, goal, mode, s # Correct for insanely oversized item counts and take initial steps to handle undersized pools. # Bow to Silver Arrows Upgrade, including Generic Keys & Rupoors - for x in [*range(0, 66 + 1), 68, 69]: + for x in [*range(0, 69)]: key = CONST.CUSTOMITEMS[x] if customitemarray[key] > total_items_to_place: customitemarray[key] = total_items_to_place - + # Triforce if customitemarray["triforce"] > total_items_to_place: customitemarray["triforce"] = total_items_to_place + # Triforce Pieces + if goal in ['triforcehunt', 'trinity']: + customitemarray["triforcepiecesgoal"], customitemarray["triforcepieces"] = set_default_triforce(goal, customitemarray["triforcepiecesgoal"], customitemarray["triforcepieces"]) + itemtotal = 0 # Bow to Silver Arrows Upgrade, including Generic Keys & Rupoors for x in [*range(0, 66 + 1), 68, 69]: @@ -956,18 +953,7 @@ def make_custom_item_pool(progressive, shuffle, difficulty, timer, goal, mode, s pool.append(thisbottle) if customitemarray["triforcepieces"] > 0 or customitemarray["triforcepiecesgoal"] > 0: - treasure_hunt_count = 20 - treasure_hunt_total = 30 - if customitemarray["triforcepiecesgoal"] > 0: - treasure_hunt_count = max(min(customitemarray["triforcepiecesgoal"], 99), 1) #To display, count must be between 1 and 99. - if customitemarray["triforcepieces"] > 0: - treasure_hunt_total = max(min(customitemarray["triforcepieces"], 168), treasure_hunt_count) #168 max to ensure other progression can fit. treasure_hunt_icon = 'Triforce Piece' - # Ensure game is always possible to complete here, force sufficient pieces if the player is unwilling. - if (customitemarray["triforcepieces"] < treasure_hunt_count) and (goal in ['triforcehunt', 'trinity']) and (customitemarray["triforce"] == 0): - extrapieces = treasure_hunt_count - customitemarray["triforcepieces"] - pool.extend(['Triforce Piece'] * extrapieces) - itemtotal = itemtotal + extrapieces if timer in ['display', 'timed', 'timed-countdown']: clock_mode = 'countdown' if timer == 'timed-countdown' else 'stopwatch' @@ -1011,6 +997,16 @@ def make_custom_item_pool(progressive, shuffle, difficulty, timer, goal, mode, s return (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_total, treasure_hunt_icon, lamps_needed_for_dark_rooms) +def set_default_triforce(goal, custom_goal, custom_total): + triforce_goal, triforce_total = 0, 0 + if goal in ['triforcehunt', 'trinity']: + triforce_goal, triforce_total = 20, 30 + if custom_goal > 0: + triforce_goal = max(min(custom_goal, 128), 1) + if custom_total > 0: + triforce_total = max(min(custom_total, 128), triforce_goal) #128 max to ensure other progression can fit. + return (triforce_goal, triforce_total) + # A quick test to ensure all combinations generate the correct amount of items. def test(): for difficulty in ['normal', 'hard', 'expert']: