69 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from argparse import Namespace | ||
|  | from typing import Any, Iterable | ||
|  | 
 | ||
|  | from BaseClasses import PlandoOptions | ||
|  | from Options import VerifyKeys | ||
|  | from ... import StardewValleyWorld | ||
|  | from ...options import StardewValleyOptions, StardewValleyOption | ||
|  | 
 | ||
|  | 
 | ||
|  | def parse_class_option_keys(test_options: dict[str | StardewValleyOption, Any] | None) -> dict: | ||
|  |     """ Now the option class is allowed as key. """ | ||
|  |     if test_options is None: | ||
|  |         return {} | ||
|  |     parsed_options = {} | ||
|  | 
 | ||
|  |     for option, value in test_options.items(): | ||
|  |         if hasattr(option, "internal_name"): | ||
|  |             assert option.internal_name not in test_options, "Defined two times by class and internal_name" | ||
|  |             parsed_options[option.internal_name] = value | ||
|  |         else: | ||
|  |             assert option in StardewValleyOptions.type_hints, \ | ||
|  |                 f"All keys of world_options must be a possible Stardew Valley option, {option} is not." | ||
|  |             parsed_options[option] = value | ||
|  | 
 | ||
|  |     return parsed_options | ||
|  | 
 | ||
|  | 
 | ||
|  | def fill_dataclass_with_default(test_options: dict[str | StardewValleyOption, Any] | None) -> StardewValleyOptions: | ||
|  |     test_options = parse_class_option_keys(test_options) | ||
|  | 
 | ||
|  |     filled_options = {} | ||
|  |     for option_name, option_class in StardewValleyOptions.type_hints.items(): | ||
|  | 
 | ||
|  |         value = option_class.from_any(test_options.get(option_name, option_class.default)) | ||
|  | 
 | ||
|  |         if issubclass(option_class, VerifyKeys): | ||
|  |             # Values should already be verified, but just in case... | ||
|  |             value.verify(StardewValleyWorld, "Tester", PlandoOptions.bosses) | ||
|  | 
 | ||
|  |         filled_options[option_name] = value | ||
|  | 
 | ||
|  |     return StardewValleyOptions(**filled_options) | ||
|  | 
 | ||
|  | 
 | ||
|  | def fill_namespace_with_default(test_options: dict[str, Any] | Iterable[dict[str, Any]]) -> Namespace: | ||
|  |     if isinstance(test_options, dict): | ||
|  |         test_options = [test_options] | ||
|  | 
 | ||
|  |     args = Namespace() | ||
|  |     for option_name, option_class in StardewValleyOptions.type_hints.items(): | ||
|  |         all_players_option = {} | ||
|  | 
 | ||
|  |         for player_id, player_options in enumerate(test_options): | ||
|  |             # Player id starts at 1 | ||
|  |             player_id += 1 | ||
|  |             player_name = f"Tester{player_id}" | ||
|  | 
 | ||
|  |             value = option_class.from_any(player_options.get(option_name, option_class.default)) | ||
|  | 
 | ||
|  |             if issubclass(option_class, VerifyKeys): | ||
|  |                 # Values should already be verified, but just in case... | ||
|  |                 value.verify(StardewValleyWorld, player_name, PlandoOptions.bosses) | ||
|  | 
 | ||
|  |             all_players_option[player_id] = value | ||
|  | 
 | ||
|  |         setattr(args, option_name, all_players_option) | ||
|  | 
 | ||
|  |     return args |