def decode_data_with_world_reader( data: Dict) -> Tuple[WorldReader, GameDescription]: game = data["game"] game_name = data["game_name"] resource_database = read_resource_database(data["resource_database"]) dock_weakness_database = read_dock_weakness_database( data["dock_weakness_database"], resource_database) if game == 2: game_specific = read_game_specific(data["game_specific"], resource_database) else: game_specific = None world_reader = WorldReader(resource_database, dock_weakness_database) world_list = world_reader.read_world_list(data["worlds"]) victory_condition = read_requirement(data["victory_condition"], resource_database) starting_location = AreaLocation.from_json(data["starting_location"]) initial_states = read_initial_states(data["initial_states"], resource_database) return world_reader, GameDescription( game=game, game_name=game_name, resource_database=resource_database, game_specific=game_specific, dock_weakness_database=dock_weakness_database, world_list=world_list, victory_condition=victory_condition, starting_location=starting_location, initial_states=initial_states, )
def decode_data( data: Dict, add_self_as_requirement_to_resources: bool = True) -> GameDescription: game = data["game"] game_name = data["game_name"] resource_database = read_resource_database(data["resource_database"]) pickup_database = read_pickup_database(data["pickup_database"], resource_database) dock_weakness_database = read_dock_weakness_database( data["dock_weakness_database"], resource_database) world_reader = WorldReader(resource_database, dock_weakness_database, add_self_as_requirement_to_resources) world_list = world_reader.read_world_list(data["worlds"]) victory_condition = read_requirement_set(data["victory_condition"], resource_database) starting_location = AreaLocation.from_json(data["starting_location"]) initial_states = read_initial_states(data["initial_states"], resource_database) return GameDescription( game=game, game_name=game_name, resource_database=resource_database, pickup_database=pickup_database, dock_weakness_database=dock_weakness_database, world_list=world_list, victory_condition=victory_condition, starting_location=starting_location, initial_states=initial_states, add_self_as_requirement_to_resources= add_self_as_requirement_to_resources, )
def from_json(cls, value: List[dict], game: RandovaniaGame) -> "LocationList": if not isinstance(value, list): raise ValueError( "StartingLocation from_json must receive a list, got {}". format(type(value))) elements = [AreaLocation.from_json(location) for location in value] return cls.with_elements(elements, game)
def apply_previous_state(self, previous_state: Optional[dict]) -> bool: if previous_state is None: return False starting_location = None needs_starting_location = len( self.layout_configuration.starting_location.locations) > 1 resource_db = self.game_description.resource_database translator_gates = {} try: pickup_name_to_pickup = { pickup.name: pickup for pickup in self._collected_pickups.keys() } quantity_to_change = { pickup_name_to_pickup[pickup_name]: quantity for pickup_name, quantity in previous_state["collected_pickups"].items() } previous_actions = [ self.game_description.world_list.all_nodes[index] for index in previous_state["actions"] ] if needs_starting_location: starting_location = AreaLocation.from_json( previous_state["starting_location"]) elevators: Dict[Teleporter, Optional[AreaLocation]] = { Teleporter.from_json(item["teleporter"]): AreaLocation.from_json(item["data"]) if item["data"] is not None else None for item in previous_state["elevators"] } if self.layout_configuration.game == RandovaniaGame.PRIME2: translator_gates = { TranslatorGate(int(gate)): (resource_db.get_item(item) if item is not None else self._undefined_item) for gate, item in previous_state["translator_gates"].items() } except KeyError: return False self.setup_starting_location(starting_location) for teleporter, area_location in elevators.items(): combo = self._elevator_id_to_combo[teleporter] if area_location is None: combo.setCurrentIndex(0) continue for i in range(combo.count()): if area_location == combo.itemData(i): combo.setCurrentIndex(i) break for gate, item in translator_gates.items(): combo = self._translator_gate_to_combo[gate] for i in range(combo.count()): if item == combo.itemData(i): combo.setCurrentIndex(i) break self.bulk_change_quantity(quantity_to_change) self._add_new_actions(previous_actions) return True
def from_json(cls, value: Union[str, dict]) -> "StartingLocation": if isinstance(value, str): return cls(StartingLocationConfiguration(value), None) else: return cls(StartingLocationConfiguration.CUSTOM, AreaLocation.from_json(value))