def test_basic_search_with_translator_gate(has_translator: bool, echoes_resource_database): # Setup scan_visor = echoes_resource_database.get_item(10) node_a = GenericNode("Node A", True, None, 0) node_b = GenericNode("Node B", True, None, 1) node_c = GenericNode("Node C", True, None, 2) translator_node = TranslatorGateNode("Translator Gate", True, None, 3, TranslatorGate(1), scan_visor) world_list = WorldList([ World("Test World", "Test Dark World", 1, [ Area( "Test Area A", False, 10, 0, True, [node_a, node_b, node_c, translator_node], { node_a: { node_b: Requirement.trivial(), translator_node: Requirement.trivial(), }, node_b: { node_a: Requirement.trivial(), }, node_c: { translator_node: Requirement.trivial(), }, translator_node: { node_a: Requirement.trivial(), node_c: Requirement.trivial(), }, }) ]) ]) game_specific = EchoesGameSpecific(energy_per_tank=100, safe_zone_heal_per_second=1, beam_configurations=(), dangerous_energy_tank=False) game = GameDescription(RandovaniaGame.PRIME2, DockWeaknessDatabase([], [], [], []), echoes_resource_database, game_specific, Requirement.impossible(), None, {}, world_list) patches = game.create_game_patches() patches = patches.assign_gate_assignment({TranslatorGate(1): scan_visor}) initial_state = State({scan_visor: 1 if has_translator else 0}, (), 99, node_a, patches, None, echoes_resource_database, game.world_list) # Run reach = reach_with_all_safe_resources(game, initial_state) # Assert if has_translator: assert set( reach.safe_nodes) == {node_a, node_b, translator_node, node_c} else: assert set(reach.safe_nodes) == {node_a, node_b}
def test_basic_search_with_translator_gate(has_translator: bool, echoes_resource_database): # Setup scan_visor = echoes_resource_database.get_by_type_and_index( ResourceType.ITEM, 10) node_a = GenericNode("Node A", True, 0) node_b = GenericNode("Node B", True, 1) node_c = GenericNode("Node C", True, 2) translator_node = TranslatorGateNode("Translator Gate", True, 3, TranslatorGate(1), scan_visor) world_list = WorldList([ World("Test World", 1, [ Area( "Test Area A", False, 10, 0, [node_a, node_b, node_c, translator_node], { node_a: { node_b: RequirementSet.trivial(), translator_node: RequirementSet.trivial(), }, node_b: { node_a: RequirementSet.trivial(), }, node_c: { translator_node: RequirementSet.trivial(), }, translator_node: { node_a: RequirementSet.trivial(), node_c: RequirementSet.trivial(), }, }) ]) ]) game = GameDescription(0, "", DockWeaknessDatabase([], [], [], []), echoes_resource_database, RequirementSet.impossible(), None, {}, world_list) patches = GamePatches.with_game(game) patches = patches.assign_gate_assignment({TranslatorGate(1): scan_visor}) initial_state = State({scan_visor: 1 if has_translator else 0}, (), 99, node_a, patches, None, echoes_resource_database) # Run reach = reach_with_all_safe_resources(game, initial_state) # Assert if has_translator: assert set( reach.safe_nodes) == {node_a, node_b, translator_node, node_c} else: assert set(reach.safe_nodes) == {node_a, node_b}
def read_node(self, data: Dict) -> Node: name: str = data["name"] heal: bool = data["heal"] node_type: int = data["node_type"] if node_type == 0: self.generic_index += 1 return GenericNode(name, heal, self.generic_index) elif node_type == 1: return DockNode(name, heal, data["dock_index"], DockConnection(data["connected_area_asset_id"], data["connected_dock_index"]), self.dock_weakness_database.get_by_type_and_index(DockType(data["dock_type"]), data["dock_weakness_index"])) elif node_type == 2: return PickupNode(name, heal, PickupIndex(data["pickup_index"])) elif node_type == 3: instance_id = data["teleporter_instance_id"] destination_world_asset_id = data["destination_world_asset_id"] destination_area_asset_id = data["destination_area_asset_id"] return TeleporterNode(name, heal, instance_id, AreaLocation(destination_world_asset_id, destination_area_asset_id)) elif node_type == 4: return EventNode(name, heal, self.resource_database.get_by_type_and_index(ResourceType.EVENT, data["event_index"])) else: raise Exception("Unknown node type: {}".format(node_type))
def _do_create_node(self, node_name: str): self.generic_index += 1 new_node = GenericNode(node_name, False, None, self.generic_index) self.current_area.nodes.append(new_node) self.current_area.connections[new_node] = {} self.game_description.world_list.refresh_node_cache() self.on_select_area()
def _create_new_node(self): node_name, did_confirm = QInputDialog.getText(self, "New Node", "Insert node name:") if not did_confirm: return if self.current_area.node_with_name(node_name) is not None: QMessageBox.warning(self, "New Node", "A node named '{}' already exists.".format(node_name)) return self.generic_index += 1 new_node = GenericNode(node_name, True, self.generic_index) self.current_area.nodes.append(new_node) self.current_area.connections[new_node] = {} self.on_select_area()
def read_node(self, data: Dict) -> Node: name: str = data["name"] self.generic_index += 1 try: heal: bool = data["heal"] node_type: int = data["node_type"] location = None if data["coordinates"] is not None: location = location_from_json(data["coordinates"]) if node_type == "generic": return GenericNode(name, heal, location, self.generic_index) elif node_type == "dock": return DockNode( name, heal, location, self.generic_index, data["dock_index"], DockConnection(data["connected_area_asset_id"], data["connected_dock_index"]), self.dock_weakness_database.get_by_type_and_index( DockType(data["dock_type"]), data["dock_weakness_index"])) elif node_type == "pickup": return PickupNode(name, heal, location, self.generic_index, PickupIndex(data["pickup_index"]), data["major_location"]) elif node_type == "teleporter": instance_id = data["teleporter_instance_id"] destination_world_asset_id = data["destination_world_asset_id"] destination_area_asset_id = data["destination_area_asset_id"] return TeleporterNode( name, heal, location, self.generic_index, instance_id, AreaLocation(destination_world_asset_id, destination_area_asset_id), data["scan_asset_id"], data["keep_name_when_vanilla"], data["editable"], ) elif node_type == "event": return EventNode( name, heal, location, self.generic_index, self.resource_database.get_by_type_and_index( ResourceType.EVENT, data["event_index"])) elif node_type == "translator_gate": return TranslatorGateNode(name, heal, location, self.generic_index, TranslatorGate(data["gate_index"]), self._get_scan_visor()) elif node_type == "logbook": lore_type = LoreType(data["lore_type"]) if lore_type == LoreType.LUMINOTH_LORE: required_translator = self.resource_database.get_item( data["extra"]) else: required_translator = None if lore_type in { LoreType.LUMINOTH_WARRIOR, LoreType.SKY_TEMPLE_KEY_HINT }: hint_index = data["extra"] else: hint_index = None return LogbookNode(name, heal, location, self.generic_index, data["string_asset_id"], self._get_scan_visor(), lore_type, required_translator, hint_index) else: raise Exception(f"Unknown type: {node_type}") except Exception as e: raise Exception(f"In node {name}, got error: {e}")
def create_new_node(self) -> Node: node_type = self.node_type_combo.currentData() name = self.name_edit.text() heal = self.heals_check.isChecked() location = None if self.location_group.isChecked(): location = NodeLocation(self.location_x_spin.value(), self.location_y_spin.value(), self.location_z_spin.value()) index = self.node.index if node_type == GenericNode: return GenericNode(name, heal, location, index) elif node_type == DockNode: return DockNode( name, heal, location, index, self.dock_index_spin.value(), DockConnection( self.dock_connection_area_combo.currentData( ).area_asset_id, self.dock_connection_node_combo.currentData()), self.dock_weakness_combo.currentData(), ) elif node_type == PickupNode: return PickupNode( name, heal, location, index, PickupIndex(self.pickup_index_spin.value()), self.major_location_check.isChecked(), ) elif node_type == TeleporterNode: instance_id = self.teleporter_instance_id_edit.text() scan_asset_id = self.teleporter_scan_asset_id_edit.text() return TeleporterNode( name, heal, location, index, int(instance_id, 0) if instance_id != "" else None, AreaLocation( self.teleporter_destination_world_combo.currentData( ).world_asset_id, self.teleporter_destination_area_combo.currentData(). area_asset_id), int(scan_asset_id, 0) if scan_asset_id != "" else None, self.teleporter_vanilla_name_edit.isChecked(), self.teleporter_editable_check.isChecked(), ) elif node_type == EventNode: event = self.event_resource_combo.currentData() if event is None: raise ValueError( "There are no events in the database, unable to create EventNode." ) return EventNode( name, heal, location, index, event, ) elif node_type == TranslatorGateNode: return TranslatorGateNode( name, heal, location, index, TranslatorGate(self.translator_gate_spin.value()), self._get_scan_visor()) elif node_type == LogbookNode: lore_type: LoreType = self.lore_type_combo.currentData() if lore_type == LoreType.LUMINOTH_LORE: required_translator = self.logbook_extra_combo.currentData() if required_translator is None: raise ValueError("Missing required translator.") else: required_translator = None if lore_type == LoreType.LUMINOTH_WARRIOR: hint_index = self.logbook_extra_combo.currentData() else: hint_index = None return LogbookNode( name, heal, location, index, int(self.logbook_string_asset_id_edit.text(), 0), self._get_scan_visor(), lore_type, required_translator, hint_index) elif node_type == PlayerShipNode: return PlayerShipNode(name, heal, location, index, self._unlocked_by_requirement, self._get_command_visor()) else: raise RuntimeError(f"Unknown node type: {node_type}")
def read_node(self, data: Dict) -> Node: name: str = data["name"] heal: bool = data["heal"] node_type: int = data["node_type"] self.generic_index += 1 if node_type == 0: return GenericNode(name, heal, self.generic_index) elif node_type == 1: return DockNode( name, heal, self.generic_index, data["dock_index"], DockConnection(data["connected_area_asset_id"], data["connected_dock_index"]), self.dock_weakness_database.get_by_type_and_index( DockType(data["dock_type"]), data["dock_weakness_index"])) elif node_type == 2: return PickupNode(name, heal, self.generic_index, PickupIndex(data["pickup_index"]), data["major_location"]) elif node_type == 3: instance_id = data["teleporter_instance_id"] destination_world_asset_id = data["destination_world_asset_id"] destination_area_asset_id = data["destination_area_asset_id"] return TeleporterNode( name, heal, self.generic_index, instance_id, AreaLocation(destination_world_asset_id, destination_area_asset_id), data["keep_name_when_vanilla"], data["editable"], ) elif node_type == 4: return EventNode( name, heal, self.generic_index, self.resource_database.get_by_type_and_index( ResourceType.EVENT, data["event_index"])) elif node_type == 5: return TranslatorGateNode( name, heal, self.generic_index, TranslatorGate(data["gate_index"]), find_resource_info_with_long_name(self.resource_database.item, "Scan Visor")) elif node_type == 6: lore_type = list(LoreType)[data["lore_type"]] if lore_type == LoreType.LUMINOTH_LORE: required_translator = self.resource_database.get_item( data["extra"]) else: required_translator = None if lore_type in { LoreType.LUMINOTH_WARRIOR, LoreType.SKY_TEMPLE_KEY_HINT }: hint_index = data["extra"] else: hint_index = None return LogbookNode( name, heal, self.generic_index, data["string_asset_id"], find_resource_info_with_long_name(self.resource_database.item, "Scan Visor"), lore_type, required_translator, hint_index) else: raise Exception("Unknown node type: {}".format(node_type))