diff --git a/BaseClasses.py b/BaseClasses.py
index ac749d2fe357..f8f31a0cc99b 100644
--- a/BaseClasses.py
+++ b/BaseClasses.py
@@ -731,10 +731,25 @@ def has_from_list(self, items: Iterable[str], player: int, count: int) -> bool:
             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 @@ def has_group(self, item_name_group: str, player: int, count: int = 1) -> bool:
                 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 @@ def count_group(self, item_name_group: str, player: int) -> int:
             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: