예제 #1
0
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,
    )
예제 #2
0
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,
    )
예제 #3
0
    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)
예제 #4
0
    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
예제 #5
0
 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))