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, | ||
|  | )) |