def from_json_dict(cls, json_dict: dict) -> "LayoutConfiguration": return LayoutConfiguration( trick_level_configuration=TrickLevelConfiguration.from_json( json_dict["trick_level"]), damage_strictness=LayoutDamageStrictness( json_dict["damage_strictness"]), sky_temple_keys=LayoutSkyTempleKeyMode( json_dict["sky_temple_keys"]), elevators=LayoutElevators(json_dict["elevators"]), starting_location=StartingLocation.from_json( json_dict["starting_location"]), available_locations=AvailableLocationsConfiguration.from_json( json_dict["available_locations"]), major_items_configuration=MajorItemsConfiguration.from_json( json_dict["major_items_configuration"], default_prime2_item_database(), ), ammo_configuration=AmmoConfiguration.from_json( json_dict["ammo_configuration"], default_prime2_item_database(), ), translator_configuration=TranslatorConfiguration.from_json( json_dict["translator_configuration"]), hints=HintConfiguration.from_json(json_dict["hints"]), beam_configuration=BeamConfiguration.from_json( json_dict["beam_configuration"]), skip_final_bosses=json_dict["skip_final_bosses"], energy_per_tank=json_dict["energy_per_tank"], split_beam_ammo=json_dict["split_beam_ammo"], )
def bit_pack_unpack(cls, decoder: BitPackDecoder, metadata): from randovania.game_description import default_database item_database = default_database.default_prime2_item_database() default = cls.default() has_value = { item_key: bool(decoder.decode_single(2)) for item_key in default.maximum_ammo.keys() } maximum_ammo = { item_key: decoder.decode_single(256) if has_value[item_key] else default.maximum_ammo[item_key] for item_key, default_value in default.maximum_ammo.items() } num_items = decoder.decode_single(len(default.items_state)) indices_with_custom = { decoder.decode_single(len(default.items_state)) for _ in range(num_items) } items_state = {} for index, item in enumerate(item_database.ammo.values()): if index in indices_with_custom: items_state[item] = AmmoState.bit_pack_unpack(decoder, {}) else: items_state[item] = default.items_state[item] return cls(maximum_ammo, items_state)
def __init__(self, editor: PresetEditor): super().__init__() self.setupUi(self) self._editor = editor size_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self.gridLayout.setAlignment(Qt.AlignTop) # Relevant Items item_database = default_prime2_item_database() self._dark_suit = item_database.major_items["Dark Suit"] self._light_suit = item_database.major_items["Light Suit"] self._progressive_suit = item_database.major_items["Progressive Suit"] self._grapple_beam = item_database.major_items["Grapple Beam"] self._screw_attack = item_database.major_items["Screw Attack"] self._progressive_grapple = item_database.major_items["Progressive Grapple"] self._energy_tank_item = item_database.major_items["Energy Tank"] self._dark_ammo_item = item_database.ammo["Dark Ammo Expansion"] self._light_ammo_item = item_database.ammo["Light Ammo Expansion"] self._beam_ammo_item = item_database.ammo["Beam Ammo Expansion"] self._register_alternatives_events() self._register_random_starting_events() self._create_categories_boxes(size_policy) self._create_major_item_boxes(item_database) self._create_energy_tank_box() self._create_ammo_pickup_boxes(size_policy, item_database)
def bit_pack_unpack(cls, decoder: BitPackDecoder, metadata) -> "MajorItemsConfiguration": from randovania.game_description import default_database item_database = default_database.default_prime2_item_database() progressive_suit = bitpacking.decode_bool(decoder) progressive_grapple = bitpacking.decode_bool(decoder) progressive_launcher = bitpacking.decode_bool(decoder) default = MajorItemsConfiguration.default() num_items = decoder.decode_single(len(default.items_state)) indices_with_custom = { decoder.decode_single(len(default.items_state)) for _ in range(num_items) } items_state = {} for index, item in enumerate(item_database.major_items.values()): if index in indices_with_custom: items_state[item] = MajorItemState.bit_pack_unpack( decoder, item) else: items_state[item] = default.items_state[item] minimum, maximum = decoder.decode(RANDOM_STARTING_ITEMS_LIMIT, RANDOM_STARTING_ITEMS_LIMIT) return cls(items_state, progressive_suit=progressive_suit, progressive_grapple=progressive_grapple, progressive_launcher=progressive_launcher, minimum_random_starting_items=minimum, maximum_random_starting_items=maximum)
def __init__(self, tab_service: TabService, background_processor: BackgroundTaskMixin, options: Options): super().__init__() self.setupUi(self) self._options = options size_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self.gridLayout.setAlignment(Qt.AlignTop) # Relevant Items item_database = default_prime2_item_database() self._dark_suit = item_database.major_items["Dark Suit"] self._light_suit = item_database.major_items["Light Suit"] self._progressive_suit = item_database.major_items["Progressive Suit"] self._grapple_beam = item_database.major_items["Grapple Beam"] self._screw_attack = item_database.major_items["Screw Attack"] self._progressive_grapple = item_database.major_items["Progressive Grapple"] self._missile_launcher = item_database.major_items["Missile Launcher"] self._seeker_launcher = item_database.major_items["Seeker Launcher"] self._progressive_launcher = item_database.major_items["Progressive Launcher"] self._energy_tank_item = item_database.major_items["Energy Tank"] self._dark_ammo_item = item_database.ammo["Dark Ammo Expansion"] self._light_ammo_item = item_database.ammo["Light Ammo Expansion"] self._beam_ammo_item = item_database.ammo["Beam Ammo Expansion"] self._register_alternatives_events() self._setup_randomization_mode_combo() self._register_random_starting_events() self._create_categories_boxes(size_policy) self._create_major_item_boxes(item_database) self._create_energy_tank_box() self._create_ammo_pickup_boxes(size_policy, item_database)
def get_default_ammo_configurations() -> AmmoConfiguration: item_database = default_prime2_item_database() with get_data_path().joinpath("item_database", "default_state", "ammo.json").open() as open_file: data = json.load(open_file) return AmmoConfiguration.from_json(data, item_database)
def from_json_dict(cls, json_dict: dict) -> "LayoutConfiguration": return cls.from_params( trick_level_configuration=TrickLevelConfiguration.from_json(json_dict["trick_level"]), sky_temple_keys=LayoutSkyTempleKeyMode(json_dict["sky_temple_keys"]), elevators=LayoutElevators(json_dict["elevators"]), starting_location=StartingLocation.from_json(json_dict["starting_location"]), randomization_mode=RandomizationMode(json_dict["randomization_mode"]), major_items_configuration=MajorItemsConfiguration.from_json( json_dict["major_items_configuration"], default_prime2_item_database(), ), ammo_configuration=AmmoConfiguration.from_json( json_dict["ammo_configuration"], default_prime2_item_database(), ), translator_configuration=TranslatorConfiguration.from_json(json_dict["translator_configuration"]), hints=HintConfiguration.from_json(json_dict["hints"]), split_beam_ammo=json_dict["split_beam_ammo"], )
def get_default_major_items_configurations() -> MajorItemsConfiguration: item_database = default_prime2_item_database() with get_data_path().joinpath("item_database", "default_state", "major-items.json").open() as open_file: data = json.load(open_file) return MajorItemsConfiguration( items_state={ item_database.major_items[name]: MajorItemState.from_json(state_data) for name, state_data in data["items_state"].items() } )
def _config_with_data(request): with get_data_path().joinpath("item_database", "default_state", "ammo.json").open() as open_file: data = json.load(open_file) for key, value in request.param.get("items_state", {}).items(): data["items_state"][key] = value for key, value in request.param.get("maximum_ammo", {}).items(): data["maximum_ammo"][key] = value return request.param["encoded"], AmmoConfiguration.from_json( data, default_prime2_item_database())
def _config_with_data(request): with get_data_path().joinpath("item_database", "default_state", "major-items.json").open() as open_file: data = json.load(open_file) data["progressive_suit"] = True data["progressive_grapple"] = True data["progressive_launcher"] = True data["minimum_random_starting_items"] = True data["maximum_random_starting_items"] = True for field, value in request.param["replace"].items(): for key, inner_value in value.items(): data[field][key] = inner_value return request.param["encoded"], MajorItemsConfiguration.from_json(data, default_prime2_item_database())
def _update_hints_text(self): game_description = default_database.default_prime2_game_description() item_database = default_database.default_prime2_item_database() rows = [] for item in item_database.major_items.values(): rows.append(( item.name, item.item_category.hint_details[1], item.item_category.general_details[1], item.broad_category.hint_details[1], )) from randovania.games.prime.echoes_items import DARK_TEMPLE_KEY_NAMES for dark_temple_key in DARK_TEMPLE_KEY_NAMES: rows.append(( dark_temple_key.format("").strip(), ItemCategory.TEMPLE_KEY.hint_details[1], ItemCategory.TEMPLE_KEY.general_details[1], ItemCategory.KEY.hint_details[1], )) rows.append(( "Sky Temple Key", ItemCategory.SKY_TEMPLE_KEY.hint_details[1], ItemCategory.SKY_TEMPLE_KEY.general_details[1], ItemCategory.KEY.hint_details[1], )) for item in item_database.ammo.values(): rows.append(( item.name, ItemCategory.EXPANSION.hint_details[1], ItemCategory.EXPANSION.general_details[1], item.broad_category.hint_details[1], )) self.hint_item_names_tree_widget.setRowCount(len(rows)) for i, elements in enumerate(rows): for j, element in enumerate(elements): self.hint_item_names_tree_widget.setItem( i, j, QtWidgets.QTableWidgetItem(element)) for i in range(4): self.hint_item_names_tree_widget.resizeColumnToContents(i) number_for_hint_type = { hint_type: i + 1 for i, hint_type in enumerate(LoreType) } used_hint_types = set() self.hint_tree_widget.setSortingEnabled(False) # TODO: This ignores the Dark World names. But there's currently no logbook nodes in Dark World. for world in game_description.world_list.worlds: world_item = QtWidgets.QTreeWidgetItem(self.hint_tree_widget) world_item.setText(0, world.name) world_item.setExpanded(True) for area in world.areas: hint_types = {} for node in area.nodes: if isinstance(node, LogbookNode): if node.required_translator is not None: hint_types[ node. lore_type] = node.required_translator.short_name else: hint_types[node.lore_type] = "✓" if hint_types: area_item = QtWidgets.QTreeWidgetItem(world_item) area_item.setText(0, area.name) for hint_type, text in hint_types.items(): area_item.setText(number_for_hint_type[hint_type], text) used_hint_types.add(hint_type) self.hint_tree_widget.resizeColumnToContents(0) self.hint_tree_widget.setSortingEnabled(True) self.hint_tree_widget.sortByColumn(0, QtCore.Qt.AscendingOrder) for hint_type in used_hint_types: self.hint_tree_widget.headerItem().setText( number_for_hint_type[hint_type], hint_type.long_name)
def echoes_item_database() -> ItemDatabase: return default_database.default_prime2_item_database()