diff --git a/worlds/overcooked2/Logic.py b/worlds/overcooked2/Logic.py index a4f1f0fb..5be28844 100644 --- a/worlds/overcooked2/Logic.py +++ b/worlds/overcooked2/Logic.py @@ -135,10 +135,10 @@ def level_shuffle_factory( shuffle_horde_levels: bool, ) -> Dict[int, Overcooked2GenericLevel]: # return # Create a list of all valid levels for selection - # (excludes tutorial, throne, kevin and sometimes horde levels) + # (excludes tutorial, throne and sometimes horde/prep levels) pool = list() for dlc in Overcooked2Dlc: - for level_id in range(dlc.start_level_id(), dlc.end_level_id()): + for level_id in range(dlc.start_level_id, dlc.end_level_id): if level_id in dlc.excluded_levels(): continue @@ -165,11 +165,12 @@ def level_shuffle_factory( rng.shuffle(pool) # Return the first 44 levels and assign those to each level - for level_id in range(story.start_level_id(), story.end_level_id()): + for level_id in range(story.start_level_id, story.end_level_id): if level_id not in story.excluded_levels(): result[level_id] = pool[level_id-1] - else: - result[level_id] = Overcooked2GenericLevel(level_id) # This is just 6-6 right now + elif level_id == 36: + # Level 6-6 is exempt from shuffling + result[level_id] = Overcooked2GenericLevel(level_id) return result diff --git a/worlds/overcooked2/Overcooked2Levels.py b/worlds/overcooked2/Overcooked2Levels.py index 4c14a8f8..624e2741 100644 --- a/worlds/overcooked2/Overcooked2Levels.py +++ b/worlds/overcooked2/Overcooked2Levels.py @@ -32,16 +32,16 @@ class Overcooked2Dlc(Enum): assert False # inclusive + @property def start_level_id(self) -> int: - if self == Overcooked2Dlc.STORY: - return 1 return 0 # exclusive + @property def end_level_id(self) -> int: id = None if self == Overcooked2Dlc.STORY: - id = 6*6 + 8 # world_count*level_count + kevin count + id = 1 + 6*6 + 8 # tutorial + world_count*level_count + kevin count if self == Overcooked2Dlc.SURF_N_TURF: id = 3*4 + 1 if self == Overcooked2Dlc.CAMPFIRE_COOK_OFF: @@ -51,9 +51,9 @@ class Overcooked2Dlc(Enum): if self == Overcooked2Dlc.CARNIVAL_OF_CHAOS: id = 3*4 + 3 if self == Overcooked2Dlc.SEASONAL: - id = 31 + id = 31 + 1 - return self.start_level_id() + id + return self.start_level_id + id # Tutorial + Horde Levels + Endgame def excluded_levels(self) -> List[int]: diff --git a/worlds/overcooked2/test/TestOvercooked2.py b/worlds/overcooked2/test/TestOvercooked2.py index aad71211..e5bd55e4 100644 --- a/worlds/overcooked2/test/TestOvercooked2.py +++ b/worlds/overcooked2/test/TestOvercooked2.py @@ -147,3 +147,26 @@ class Overcooked2Test(unittest.TestCase): for item in ITEMS_TO_EXCLUDE_IF_NO_DLC: self.assertIn(item, item_table.keys()) + + def testLevelCounts(self): + for dlc in Overcooked2Dlc: + level_id_range = range(dlc.start_level_id, dlc.end_level_id) + + for level_id in dlc.excluded_levels(): + self.assertIn(level_id, level_id_range, f"Excluded level {dlc.name} - {level_id} out of range") + + for level_id in dlc.horde_levels(): + self.assertIn(level_id, level_id_range, f"Horde level {dlc.name} - {level_id} out of range") + + for level_id in dlc.prep_levels(): + self.assertIn(level_id, level_id_range, f"Prep level {dlc.name} - {level_id} out of range") + + for level_id in level_id_range: + self.assertIn((dlc, level_id), level_id_to_shortname, "A valid level is not represented in level directory") + + count = 0 + for (dlc_key, _) in level_id_to_shortname: + if dlc == dlc_key: + count += 1 + + self.assertEqual(count, len(level_id_range), f"Number of levels in {dlc.name} has discrepancy between level_id range and directory")