80 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import typing
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from BaseClasses import Location
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class LocData(typing.NamedTuple):
							 | 
						||
| 
								 | 
							
								    id: int
							 | 
						||
| 
								 | 
							
								    region: str
							 | 
						||
| 
								 | 
							
								    score: int
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class YachtDiceLocation(Location):
							 | 
						||
| 
								 | 
							
								    game: str = "Yacht Dice"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, player: int, name: str, score: int, address: typing.Optional[int], parent):
							 | 
						||
| 
								 | 
							
								        super().__init__(player, name, address, parent)
							 | 
						||
| 
								 | 
							
								        self.yacht_dice_score = score
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								all_locations = {}
							 | 
						||
| 
								 | 
							
								starting_index = 16871244500  # 500 more than the starting index for items (not necessary, but this is what it is now)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def all_locations_fun(max_score):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Function that is called when this file is loaded, which loads in ALL possible locations, score 1 to 1000
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return {f"{i} score": LocData(starting_index + i, "Board", i) for i in range(1, max_score + 1)}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def ini_locations(goal_score, max_score, number_of_locations, dif, skip_early_locations, number_of_players):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    function that loads in all locations necessary for the game, so based on options.
							 | 
						||
| 
								 | 
							
								    will make sure that goal_score and max_score are included locations
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    scaling = 2  # parameter that determines how many low-score location there are.
							 | 
						||
| 
								 | 
							
								    # need more low-score locations or lower difficulties:
							 | 
						||
| 
								 | 
							
								    if dif == 1:
							 | 
						||
| 
								 | 
							
								        scaling = 3
							 | 
						||
| 
								 | 
							
								    elif dif == 2:
							 | 
						||
| 
								 | 
							
								        scaling = 2.3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    scores = []
							 | 
						||
| 
								 | 
							
								    # the scores follow the function int( 1 + (percentage ** scaling) * (max_score-1) )
							 | 
						||
| 
								 | 
							
								    # however, this will have many low values, sometimes repeating.
							 | 
						||
| 
								 | 
							
								    # to avoid repeating scores, highest_score keeps tracks of the highest score location
							 | 
						||
| 
								 | 
							
								    # and the next score will always be at least highest_score + 1
							 | 
						||
| 
								 | 
							
								    # note that current_score is at most max_score-1
							 | 
						||
| 
								 | 
							
								    highest_score = 0
							 | 
						||
| 
								 | 
							
								    start_score = 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if skip_early_locations:
							 | 
						||
| 
								 | 
							
								        scaling = 1.95
							 | 
						||
| 
								 | 
							
								        if number_of_players > 2:
							 | 
						||
| 
								 | 
							
								            scaling = max(1.2, 2.2 - number_of_players * 0.1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for i in range(number_of_locations - 1):
							 | 
						||
| 
								 | 
							
								        percentage = i / number_of_locations
							 | 
						||
| 
								 | 
							
								        current_score = int(start_score + 1 + (percentage**scaling) * (max_score - start_score - 2))
							 | 
						||
| 
								 | 
							
								        if current_score <= highest_score:
							 | 
						||
| 
								 | 
							
								            current_score = highest_score + 1
							 | 
						||
| 
								 | 
							
								        highest_score = current_score
							 | 
						||
| 
								 | 
							
								        scores += [current_score]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if goal_score != max_score:
							 | 
						||
| 
								 | 
							
								        # if the goal score is not in the list, find the closest one and make it the goal.
							 | 
						||
| 
								 | 
							
								        if goal_score not in scores:
							 | 
						||
| 
								 | 
							
								            closest_num = min(scores, key=lambda x: abs(x - goal_score))
							 | 
						||
| 
								 | 
							
								            scores[scores.index(closest_num)] = goal_score
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    scores += [max_score]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    location_table = {f"{score} score": LocData(starting_index + score, "Board", score) for score in scores}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return location_table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# we need to run this function to initialize all scores from 1 to 1000, even though not all are used
							 | 
						||
| 
								 | 
							
								all_locations = all_locations_fun(1000)
							 |