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
 |