* adding back parens that got deleted by accident. * Void Locus and The Planetarium ids backwards * change required client version * beads of fealty was missing for A Moment, whole victory * found another logic bug * Update worlds/ror2/__init__.py Co-authored-by: Zach Parks <zach@alliware.com> * Remove unnecessary comment --------- Co-authored-by: Zach Parks <zach@alliware.com>
		
			
				
	
	
		
			119 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import Dict, List, TypeVar
 | 
						|
 | 
						|
# TODO probably move to Locations
 | 
						|
 | 
						|
environment_vanilla_orderedstage_1_table: Dict[str, int] = {
 | 
						|
    "Distant Roost":                            7, # blackbeach
 | 
						|
    "Distant Roost (2)":                        8, # blackbeach2
 | 
						|
    "Titanic Plains":                          15, # golemplains
 | 
						|
    "Titanic Plains (2)":                      16, # golemplains2
 | 
						|
}
 | 
						|
environment_vanilla_orderedstage_2_table: Dict[str, int] = {
 | 
						|
    "Abandoned Aqueduct":                      17, # goolake
 | 
						|
    "Wetland Aspect":                          12, # foggyswamp
 | 
						|
}
 | 
						|
environment_vanilla_orderedstage_3_table: Dict[str, int] = {
 | 
						|
    "Rallypoint Delta":                        13, # frozenwall
 | 
						|
    "Scorched Acres":                          47, # wispgraveyard
 | 
						|
}
 | 
						|
environment_vanilla_orderedstage_4_table: Dict[str, int] = {
 | 
						|
    "Abyssal Depths":                          10, # dampcavesimple
 | 
						|
    "Siren's Call":                            37, # shipgraveyard
 | 
						|
    "Sundered Grove":                          35, # rootjungle
 | 
						|
}
 | 
						|
environment_vanilla_orderedstage_5_table: Dict[str, int] = {
 | 
						|
    "Sky Meadow":                              38, # skymeadow
 | 
						|
}
 | 
						|
 | 
						|
environment_vanilla_hidden_realm_table: Dict[str, int] = {
 | 
						|
    "Hidden Realm: Bulwark's Ambry":            5, # artifactworld
 | 
						|
    "Hidden Realm: Bazaar Between Time":        6, # bazaar
 | 
						|
    "Hidden Realm: Gilded Coast":              14, # goldshores
 | 
						|
    "Hidden Realm: A Moment, Whole":           27, # limbo
 | 
						|
    "Hidden Realm: A Moment, Fractured":       33, # mysteryspace
 | 
						|
}
 | 
						|
 | 
						|
environment_vanilla_special_table: Dict[str, int] = {
 | 
						|
    "Void Fields":                              4, # arena
 | 
						|
    "Commencement":                            32, # moon2
 | 
						|
}
 | 
						|
 | 
						|
environment_sotv_orderedstage_1_table: Dict[str, int] = {
 | 
						|
    "Siphoned Forest":                         39, # snowyforest
 | 
						|
}
 | 
						|
environment_sotv_orderedstage_2_table: Dict[str, int] = {
 | 
						|
    "Aphelian Sanctuary":                       3, # ancientloft
 | 
						|
}
 | 
						|
environment_sotv_orderedstage_3_table: Dict[str, int] = {
 | 
						|
    "Sulfur Pools":                            41, # sulfurpools
 | 
						|
}
 | 
						|
environment_sotv_orderedstage_4_table: Dict[str, int] = { }
 | 
						|
environment_sotv_orderedstage_5_table: Dict[str, int] = { }
 | 
						|
 | 
						|
# TODO idk much and idc much about simulacrum, is there a forced order or something?
 | 
						|
environment_sotv_simulacrum_table: Dict[str, int] = {
 | 
						|
    "The Simulacrum (Aphelian Sanctuary)":     20, # itancientloft
 | 
						|
    "The Simulacrum (Abyssal Depths)":         21, # itdampcave
 | 
						|
    "The Simulacrum (Rallypoint Delta)":       22, # itfrozenwall
 | 
						|
    "The Simulacrum (Titanic Plains)":         23, # itgolemplains
 | 
						|
    "The Simulacrum (Abandoned Aqueduct)":     24, # itgoolake
 | 
						|
    "The Simulacrum (Commencement)":           25, # itmoon
 | 
						|
    "The Simulacrum (Sky Meadow)":             26, # itskymeadow
 | 
						|
}
 | 
						|
 | 
						|
environment_sotv_special_table: Dict[str, int] = {
 | 
						|
    "Void Locus":                              46, # voidstage
 | 
						|
    "The Planetarium":                         45, # voidraid
 | 
						|
}
 | 
						|
 | 
						|
X = TypeVar("X")
 | 
						|
Y = TypeVar("Y")
 | 
						|
 | 
						|
 | 
						|
def compress_dict_list_horizontal(list_of_dict: List[Dict[X, Y]]) -> Dict[X, Y]:
 | 
						|
    """Combine all dictionaries in a list together into one dictionary."""
 | 
						|
    compressed: Dict[X,Y] = {}
 | 
						|
    for individual in list_of_dict: compressed.update(individual)
 | 
						|
    return compressed
 | 
						|
 | 
						|
def collapse_dict_list_vertical(list_of_dict1: List[Dict[X, Y]], *args: List[Dict[X, Y]]) -> List[Dict[X, Y]]:
 | 
						|
    """Combine all parallel dictionaries in lists together to make a new list of dictionaries of the same length."""
 | 
						|
    # find the length of the longest list
 | 
						|
    length = len(list_of_dict1)
 | 
						|
    for list_of_dictN in args:
 | 
						|
        length = max(length, len(list_of_dictN))
 | 
						|
 | 
						|
    # create a combined list with a length the same as the longest list
 | 
						|
    collapsed = [{}] * (length)
 | 
						|
    # The reason the list_of_dict1 is not directly used to make collapsed is
 | 
						|
    #   side effects can occur if all the dictionaries are not manually unioned.
 | 
						|
 | 
						|
    # merge contents from list_of_dict1
 | 
						|
    for i in range(len(list_of_dict1)):
 | 
						|
        collapsed[i] = {**collapsed[i],  **list_of_dict1[i]}
 | 
						|
 | 
						|
    # merge contents of remaining lists_of_dicts
 | 
						|
    for list_of_dictN in args:
 | 
						|
        for i in range(len(list_of_dictN)):
 | 
						|
            collapsed[i] = {**collapsed[i], **list_of_dictN[i]}
 | 
						|
 | 
						|
    return collapsed
 | 
						|
 | 
						|
# TODO potentially these should only be created when they are directly referenced (unsure of the space/time cost of creating these initially)
 | 
						|
 | 
						|
environment_vanilla_orderedstages_table = [ environment_vanilla_orderedstage_1_table, environment_vanilla_orderedstage_2_table, environment_vanilla_orderedstage_3_table, environment_vanilla_orderedstage_4_table, environment_vanilla_orderedstage_5_table ]
 | 
						|
environment_vanilla_table = {**compress_dict_list_horizontal(environment_vanilla_orderedstages_table), **environment_vanilla_hidden_realm_table, **environment_vanilla_special_table}
 | 
						|
 | 
						|
environment_sotv_orderedstages_table = [ environment_sotv_orderedstage_1_table, environment_sotv_orderedstage_2_table, environment_sotv_orderedstage_3_table, environment_sotv_orderedstage_4_table, environment_sotv_orderedstage_5_table ]
 | 
						|
environment_sotv_non_simulacrum_table = {**compress_dict_list_horizontal(environment_sotv_orderedstages_table), **environment_sotv_special_table}
 | 
						|
environment_sotv_table = {**environment_sotv_non_simulacrum_table}
 | 
						|
 | 
						|
environment_non_orderedstages_table = {**environment_vanilla_hidden_realm_table, **environment_vanilla_special_table, **environment_sotv_simulacrum_table, **environment_sotv_special_table}
 | 
						|
environment_orderedstages_table = collapse_dict_list_vertical(environment_vanilla_orderedstages_table, environment_sotv_orderedstages_table)
 | 
						|
environment_ALL_table = {**environment_vanilla_table,  **environment_sotv_table}
 | 
						|
 | 
						|
 | 
						|
def shift_by_offset(dictionary: Dict[str, int], offset:int) -> Dict[str, int]:
 | 
						|
    """Shift all indexes in a dictionary by an offset"""
 | 
						|
    return {name:index+offset for name, index in dictionary.items()}
 |