 7f3f886e41
			
		
	
	7f3f886e41
	
	
	
		
			
			Overcooked! 2 is a couch co-op arcade game with a very high skill ceiling. It has a small but occult following, and the community craves a reason to keep coming back besides just grinding high scores. as such, this PR represents 3 major milestones in one: * The launch of OC2 Modding, a modding framework which is the first public mod for the game beyond simple RAM trainers * The launch of OC2 Randomizer * The integration of OC2 Randomizer in Archipelago
		
			
				
	
	
		
			143 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import unittest
 | |
| import json
 | |
| 
 | |
| from random import Random
 | |
| 
 | |
| from worlds.overcooked2.Items import *
 | |
| from worlds.overcooked2.Overcooked2Levels import Overcooked2Level, level_id_to_shortname
 | |
| from worlds.overcooked2.Logic import level_logic, level_shuffle_factory
 | |
| from worlds.overcooked2.Locations import oc2_location_name_to_id
 | |
| 
 | |
| 
 | |
| class Overcooked2Test(unittest.TestCase):
 | |
|     def testItems(self):
 | |
|         self.assertEqual(len(item_name_to_id), len(item_id_to_name))
 | |
|         self.assertEqual(len(item_name_to_id), len(item_table))
 | |
| 
 | |
|         previous_item = None
 | |
|         for item_name in item_table.keys():
 | |
|             item: Item = item_table[item_name]
 | |
|             self.assertGreaterEqual(item.code, oc2_base_id, "Overcooked Item ID out of range")
 | |
|             self.assertLessEqual(item.code, item_table["Calmer Unbread"].code, "Overcooked Item ID out of range")
 | |
| 
 | |
|             if previous_item is not None:
 | |
|                 self.assertEqual(item.code, previous_item + 1,
 | |
|                                  f"Overcooked Item ID noncontinguous: {item.code-oc2_base_id}")
 | |
|             previous_item = item.code
 | |
| 
 | |
|         self.assertEqual(item_table["Ok Emote"].code - item_table["Cooking Emote"].code,
 | |
|                          5, "Overcooked Emotes noncontigious")
 | |
| 
 | |
|         for item_name in item_frequencies:
 | |
|             self.assertIn(item_name, item_table.keys(), "Unexpected Overcooked Item in item_frequencies")
 | |
| 
 | |
|         for item_name in item_name_to_config_name.keys():
 | |
|             self.assertIn(item_name, item_table.keys(), "Unexpected Overcooked Item in config mapping")
 | |
| 
 | |
|         for config_name in item_name_to_config_name.values():
 | |
|             self.assertIn(config_name, vanilla_values.keys(), "Unexpected Overcooked Item in default config mapping")
 | |
| 
 | |
|         for config_name in vanilla_values.keys():
 | |
|             self.assertIn(config_name, item_name_to_config_name.values(),
 | |
|                           "Unexpected Overcooked Item in default config mapping")
 | |
| 
 | |
|         events = [
 | |
|             ("Kevin-2", {"action": "UNLOCK_LEVEL", "payload": "38"}),
 | |
|             ("Curse Emote", {"action": "UNLOCK_EMOTE", "payload": "1"}),
 | |
|             ("Larger Tip Jar", {"action": "INC_TIP_COMBO", "payload": ""}),
 | |
|             ("Order Lookahead", {"action": "INC_ORDERS_ON_SCREEN", "payload": ""}),
 | |
|             ("Control Stick Batteries", {"action": "SET_VALUE", "payload": "DisableControlStick=False"}),
 | |
|         ]
 | |
|         for (item_name, expected_event) in events:
 | |
|             expected_event["message"] = f"{item_name} Acquired!"
 | |
|             event = item_to_unlock_event(item_name)
 | |
|             self.assertEqual(event, expected_event)
 | |
| 
 | |
|         self.assertFalse(is_progression("Preparing Emote"))
 | |
| 
 | |
|         for item_name in item_table:
 | |
|             item_to_unlock_event(item_name)
 | |
| 
 | |
|     def testOvercooked2Levels(self):
 | |
|         level_count = 0
 | |
|         for _ in Overcooked2Level():
 | |
|             level_count += 1
 | |
|         self.assertEqual(level_count, 44)
 | |
| 
 | |
|     def testOvercooked2ShuffleFactory(self):
 | |
|         previous_runs = set()
 | |
|         for seed in range(0, 5):
 | |
|             levels = level_shuffle_factory(Random(seed), True, False)
 | |
|             self.assertEqual(len(levels), 44)
 | |
|             previous_level_id = None
 | |
|             for level_id in levels.keys():
 | |
|                 if previous_level_id is not None:
 | |
|                     self.assertEqual(previous_level_id+1, level_id)
 | |
|                 previous_level_id = level_id
 | |
| 
 | |
|             self.assertNotIn(levels[15], previous_runs)
 | |
|             previous_runs.add(levels[15])
 | |
| 
 | |
|         levels = level_shuffle_factory(Random(123), False, True)
 | |
|         self.assertEqual(len(levels), 44)
 | |
| 
 | |
|     def testLevelNameRepresentation(self):
 | |
|         shortnames = [level.as_generic_level.shortname for level in Overcooked2Level()]
 | |
| 
 | |
|         for shortname in shortnames:
 | |
|             self.assertIn(shortname, level_logic.keys())
 | |
| 
 | |
|         self.assertEqual(len(level_logic), len(level_id_to_shortname))
 | |
| 
 | |
|         for level_name in level_logic.keys():
 | |
|             if level_name != "*":
 | |
|                 self.assertIn(level_name, level_id_to_shortname.values())
 | |
| 
 | |
|         for level_name in level_id_to_shortname.values():
 | |
|             if level_name != "Tutorial":
 | |
|                 self.assertIn(level_name, level_logic.keys())
 | |
| 
 | |
|         region_names = [level.level_name for level in Overcooked2Level()]
 | |
|         for location_name in oc2_location_name_to_id.keys():
 | |
|             level_name = location_name.split(" ")[0]
 | |
|             self.assertIn(level_name, region_names)
 | |
| 
 | |
|     def testLogic(self):
 | |
|         for level_name in level_logic.keys():
 | |
|             logic = level_logic[level_name]
 | |
|             self.assertEqual(len(logic), 3, "Levels must provide logic for 1, 2, and 3 stars")
 | |
|             
 | |
|             for l in logic:
 | |
|                 self.assertEqual(len(l), 2)
 | |
|                 (exclusive, additive) = l
 | |
| 
 | |
|                 for req in exclusive:
 | |
|                     self.assertEqual(type(req), str)
 | |
|                     self.assertIn(req, item_table.keys())
 | |
| 
 | |
|                 if len(additive) != 0:
 | |
|                     self.assertGreater(len(additive), 1)
 | |
|                     total_weight = 0.0
 | |
|                     for req in additive:
 | |
|                         self.assertEqual(len(req), 2)
 | |
|                         (item_name, weight) = req
 | |
|                         self.assertEqual(type(item_name), str)
 | |
|                         self.assertEqual(type(weight), float)
 | |
|                         total_weight += weight
 | |
|                         self.assertIn(item_name, item_table.keys())
 | |
| 
 | |
|                     self.assertGreaterEqual(total_weight, 0.99, "Additive requirements must add to 1.0 or greater to have any effect")
 | |
| 
 | |
|     def testItemLocationMapping(self):
 | |
|         number_of_items = 0
 | |
|         for item_name in item_frequencies:
 | |
|             freq = item_frequencies[item_name]
 | |
|             self.assertGreaterEqual(freq, 0)
 | |
|             number_of_items += freq
 | |
|         
 | |
|         for item_name in item_table:
 | |
|             if item_name not in item_frequencies.keys():
 | |
|                 number_of_items += 1
 | |
| 
 | |
|         self.assertLessEqual(number_of_items, len(oc2_location_name_to_id), "Too many items (before fillers placed)")
 |