52 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			52 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import random
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from Options import NamedRange, Option, Range
							 | 
						||
| 
								 | 
							
								from ... import StardewValleyWorld
							 | 
						||
| 
								 | 
							
								from ...options import StardewValleyOption
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								options_to_exclude = {"profit_margin", "starting_money", "multiple_day_sleep_enabled", "multiple_day_sleep_cost",
							 | 
						||
| 
								 | 
							
								                      "experience_multiplier", "friendship_multiplier", "debris_multiplier",
							 | 
						||
| 
								 | 
							
								                      "quick_start", "gifting", "gift_tax",
							 | 
						||
| 
								 | 
							
								                      "progression_balancing", "accessibility", "start_inventory", "start_hints", "death_link"}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								options_to_include: list[type[StardewValleyOption | Option]] = [
							 | 
						||
| 
								 | 
							
								    option
							 | 
						||
| 
								 | 
							
								    for option_name, option in StardewValleyWorld.options_dataclass.type_hints.items()
							 | 
						||
| 
								 | 
							
								    if option_name not in options_to_exclude
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def get_option_choices(option: type[Option]) -> dict[str, int]:
							 | 
						||
| 
								 | 
							
								    if issubclass(option, NamedRange):
							 | 
						||
| 
								 | 
							
								        return option.special_range_names
							 | 
						||
| 
								 | 
							
								    if issubclass(option, Range):
							 | 
						||
| 
								 | 
							
								        return {f"{val}": val for val in range(option.range_start, option.range_end + 1)}
							 | 
						||
| 
								 | 
							
								    elif option.options:
							 | 
						||
| 
								 | 
							
								        return option.options
							 | 
						||
| 
								 | 
							
								    return {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def generate_random_world_options(seed: int) -> dict[str, int]:
							 | 
						||
| 
								 | 
							
								    num_options = len(options_to_include)
							 | 
						||
| 
								 | 
							
								    world_options = dict()
							 | 
						||
| 
								 | 
							
								    rng = random.Random(seed)
							 | 
						||
| 
								 | 
							
								    for option_index in range(0, num_options):
							 | 
						||
| 
								 | 
							
								        option = options_to_include[option_index]
							 | 
						||
| 
								 | 
							
								        option_choices = get_option_choices(option)
							 | 
						||
| 
								 | 
							
								        if not option_choices:
							 | 
						||
| 
								 | 
							
								            continue
							 | 
						||
| 
								 | 
							
								        chosen_option_value = rng.choice(list(option_choices.values()))
							 | 
						||
| 
								 | 
							
								        world_options[option.internal_name] = chosen_option_value
							 | 
						||
| 
								 | 
							
								    return world_options
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								all_option_choices = [
							 | 
						||
| 
								 | 
							
								    (option.internal_name, value)
							 | 
						||
| 
								 | 
							
								    for option in options_to_include
							 | 
						||
| 
								 | 
							
								    if option.options
							 | 
						||
| 
								 | 
							
								    for value in get_option_choices(option)
							 | 
						||
| 
								 | 
							
								    if option.default != get_option_choices(option)[value]
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								assert all_option_choices
							 |