From d48f2ab1b40cdea0daced9ab4aa335cf98a8a30c Mon Sep 17 00:00:00 2001 From: Trevor L <80716066+TRPG0@users.noreply.github.com> Date: Wed, 8 May 2024 10:34:32 -0600 Subject: [PATCH] Core: Add list/item group exclusive methods to CollectionState (#3192) * Group exclusive methods * Add docstrings * Apply suggestions from code review Co-authored-by: Doug Hoskisson * Put lines back with no whitespace * Add list methods --------- Co-authored-by: Doug Hoskisson Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> --- BaseClasses.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/BaseClasses.py b/BaseClasses.py index ac749d2f..f8f31a0c 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -731,10 +731,25 @@ class CollectionState(): if found >= count: return True return False + + def has_from_list_exclusive(self, items: Iterable[str], player: int, count: int) -> bool: + """Returns True if the state contains at least `count` items matching any of the item names from a list. + Ignores duplicates of the same item.""" + found: int = 0 + player_prog_items = self.prog_items[player] + for item_name in items: + found += player_prog_items[item_name] > 0 + if found >= count: + return True + return False def count_from_list(self, items: Iterable[str], player: int) -> int: """Returns the cumulative count of items from a list present in state.""" return sum(self.prog_items[player][item_name] for item_name in items) + + def count_from_list_exclusive(self, items: Iterable[str], player: int) -> int: + """Returns the cumulative count of items from a list present in state. Ignores duplicates of the same item.""" + return sum(self.prog_items[player][item_name] > 0 for item_name in items) # item name group related def has_group(self, item_name_group: str, player: int, count: int = 1) -> bool: @@ -747,6 +762,18 @@ class CollectionState(): return True return False + def has_group_exclusive(self, item_name_group: str, player: int, count: int = 1) -> bool: + """Returns True if the state contains at least `count` items present in a specified item group. + Ignores duplicates of the same item. + """ + found: int = 0 + player_prog_items = self.prog_items[player] + for item_name in self.multiworld.worlds[player].item_name_groups[item_name_group]: + found += player_prog_items[item_name] > 0 + if found >= count: + return True + return False + def count_group(self, item_name_group: str, player: int) -> int: """Returns the cumulative count of items from an item group present in state.""" player_prog_items = self.prog_items[player] @@ -755,6 +782,15 @@ class CollectionState(): for item_name in self.multiworld.worlds[player].item_name_groups[item_name_group] ) + def count_group_exclusive(self, item_name_group: str, player: int) -> int: + """Returns the cumulative count of items from an item group present in state. + Ignores duplicates of the same item.""" + player_prog_items = self.prog_items[player] + return sum( + player_prog_items[item_name] > 0 + for item_name in self.multiworld.worlds[player].item_name_groups[item_name_group] + ) + # Item related def collect(self, item: Item, event: bool = False, location: Optional[Location] = None) -> bool: if location: