90 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from typing import Dict
							 | 
						||
| 
								 | 
							
								from BaseClasses import Location
							 | 
						||
| 
								 | 
							
								from .options import TotalLocations, ChestsPerEnvironment, ShrinesPerEnvironment, ScavengersPerEnvironment, \
							 | 
						||
| 
								 | 
							
								    ScannersPerEnvironment, AltarsPerEnvironment
							 | 
						||
| 
								 | 
							
								from .ror2environments import compress_dict_list_horizontal, environment_vanilla_orderedstages_table, \
							 | 
						||
| 
								 | 
							
								    environment_sotv_orderedstages_table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class RiskOfRainLocation(Location):
							 | 
						||
| 
								 | 
							
								    game: str = "Risk of Rain 2"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ror2_locations_start_id = 38000
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def get_classic_item_pickups(n: int) -> Dict[str, int]:
							 | 
						||
| 
								 | 
							
								    """Get n ItemPickups, capped at the max value for TotalLocations"""
							 | 
						||
| 
								 | 
							
								    n = max(n, 0)
							 | 
						||
| 
								 | 
							
								    n = min(n, TotalLocations.range_end)
							 | 
						||
| 
								 | 
							
								    return {f"ItemPickup{i + 1}": ror2_locations_start_id + i for i in range(n)}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								item_pickups = get_classic_item_pickups(TotalLocations.range_end)
							 | 
						||
| 
								 | 
							
								location_table = item_pickups
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# this is so we can easily calculate the environment and location "offset" ids
							 | 
						||
| 
								 | 
							
								ror2_locations_start_ordered_stage = ror2_locations_start_id + TotalLocations.range_end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# TODO is there a better, more generic way to do this?
							 | 
						||
| 
								 | 
							
								offset_chests = 0
							 | 
						||
| 
								 | 
							
								offset_shrines = offset_chests + ChestsPerEnvironment.range_end
							 | 
						||
| 
								 | 
							
								offset_scavengers = offset_shrines + ShrinesPerEnvironment.range_end
							 | 
						||
| 
								 | 
							
								offset_scanners = offset_scavengers + ScavengersPerEnvironment.range_end
							 | 
						||
| 
								 | 
							
								offset_altars = offset_scanners + ScannersPerEnvironment.range_end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# total space allocated to the locations in a single orderedstage environment
							 | 
						||
| 
								 | 
							
								allocation = offset_altars + AltarsPerEnvironment.range_end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def get_environment_locations(chests: int, shrines: int, scavengers: int, scanners: int, altars: int,
							 | 
						||
| 
								 | 
							
								                              environment_name: str, environment_index: int) -> Dict[str, int]:
							 | 
						||
| 
								 | 
							
								    """Get the locations within a specific environment"""
							 | 
						||
| 
								 | 
							
								    locations = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # due to this mapping, since environment ids are not consecutive, there are lots of "wasted" id numbers
							 | 
						||
| 
								 | 
							
								    environment_start_id = environment_index * allocation + ror2_locations_start_ordered_stage
							 | 
						||
| 
								 | 
							
								    for n in range(chests):
							 | 
						||
| 
								 | 
							
								        locations.update({f"{environment_name}: Chest {n + 1}": n + offset_chests + environment_start_id})
							 | 
						||
| 
								 | 
							
								    for n in range(shrines):
							 | 
						||
| 
								 | 
							
								        locations.update({f"{environment_name}: Shrine {n + 1}": n + offset_shrines + environment_start_id})
							 | 
						||
| 
								 | 
							
								    for n in range(scavengers):
							 | 
						||
| 
								 | 
							
								        locations.update({f"{environment_name}: Scavenger {n + 1}": n + offset_scavengers + environment_start_id})
							 | 
						||
| 
								 | 
							
								    for n in range(scanners):
							 | 
						||
| 
								 | 
							
								        locations.update({f"{environment_name}: Radio Scanner {n + 1}": n + offset_scanners + environment_start_id})
							 | 
						||
| 
								 | 
							
								    for n in range(altars):
							 | 
						||
| 
								 | 
							
								        locations.update({f"{environment_name}: Newt Altar {n + 1}": n + offset_altars + environment_start_id})
							 | 
						||
| 
								 | 
							
								    return locations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def get_locations(chests: int, shrines: int, scavengers: int, scanners: int, altars: int, dlc_sotv: bool) \
							 | 
						||
| 
								 | 
							
								        -> Dict[str, int]:
							 | 
						||
| 
								 | 
							
								    """Get a dictionary of locations for the orderedstage environments with the locations from the parameters."""
							 | 
						||
| 
								 | 
							
								    locations = {}
							 | 
						||
| 
								 | 
							
								    orderedstages = compress_dict_list_horizontal(environment_vanilla_orderedstages_table)
							 | 
						||
| 
								 | 
							
								    if dlc_sotv:
							 | 
						||
| 
								 | 
							
								        orderedstages.update(compress_dict_list_horizontal(environment_sotv_orderedstages_table))
							 | 
						||
| 
								 | 
							
								    # for every environment, generate the respective locations
							 | 
						||
| 
								 | 
							
								    for environment_name, environment_index in orderedstages.items():
							 | 
						||
| 
								 | 
							
								        locations.update(get_environment_locations(
							 | 
						||
| 
								 | 
							
								            chests=chests,
							 | 
						||
| 
								 | 
							
								            shrines=shrines,
							 | 
						||
| 
								 | 
							
								            scavengers=scavengers,
							 | 
						||
| 
								 | 
							
								            scanners=scanners,
							 | 
						||
| 
								 | 
							
								            altars=altars,
							 | 
						||
| 
								 | 
							
								            environment_name=environment_name,
							 | 
						||
| 
								 | 
							
								            environment_index=environment_index),
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								    return locations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Get all locations in ordered stages.
							 | 
						||
| 
								 | 
							
								location_table.update(get_locations(
							 | 
						||
| 
								 | 
							
								    chests=ChestsPerEnvironment.range_end,
							 | 
						||
| 
								 | 
							
								    shrines=ShrinesPerEnvironment.range_end,
							 | 
						||
| 
								 | 
							
								    scavengers=ScavengersPerEnvironment.range_end,
							 | 
						||
| 
								 | 
							
								    scanners=ScannersPerEnvironment.range_end,
							 | 
						||
| 
								 | 
							
								    altars=AltarsPerEnvironment.range_end,
							 | 
						||
| 
								 | 
							
								    dlc_sotv=True,
							 | 
						||
| 
								 | 
							
								))
							 |