def test_round_trip_full(): original_data = default_data.decode_default_prime2() game = data_reader.decode_data(original_data) encoded_data = data_writer.write_game_description(game) assert original_data == encoded_data
def show_data_editor(app: QApplication): from randovania.games.prime import default_data from randovania.gui.data_editor import DataEditorWindow app.data_visualizer = DataEditorWindow( default_data.decode_default_prime2(), True) app.data_visualizer.show()
def __init__(self, game_connection: GameConnection, options: Options): super().__init__() self.setupUi(self) self.game_connection = game_connection common_qt_lib.set_default_window_icon(self) self.game_data = data_reader.decode_data( default_data.decode_default_prime2()) self._energy_tank_item = find_resource_info_with_long_name( self.game_data.resource_database.item, "Energy Tank") self._item_to_label: Dict[ItemResourceInfo, ClickableLabel] = {} self._labels_for_keys = [] self.create_tracker() self.game_connection_setup = GameConnectionSetup( self, self.game_connection_tool, self.connection_status_label, self.game_connection, options) self.force_update_button.setEnabled(not options.tracking_inventory) self.force_update_button.clicked.connect(self.on_force_update_button) self._update_timer = QTimer(self) self._update_timer.setInterval(100) self._update_timer.timeout.connect(self._on_timer_update) self._update_timer.setSingleShot(True)
def test_create_elevators_field_no_elevator(empty_patches): # Setup game = data_reader.decode_data(default_data.decode_default_prime2(), False) # Run result = patcher_file._create_elevators_field(game.world_list, empty_patches) # Assert assert result == []
def test_create_elevators_field_no_elevator(empty_patches): # Setup game = data_reader.decode_data(default_data.decode_default_prime2()) # Run with pytest.raises(ValueError) as exp: patcher_file._create_elevators_field(empty_patches, game) # Assert assert str(exp.value) == "Invalid elevator count. Expected 22, got 0."
def decode_data_file(args) -> Dict: json_database: Optional[Path] = args.json_database if json_database is not None: with json_database.open() as data_file: return json.load(data_file) data_file_path: Optional[Path] = args.binary_database if data_file_path is None: return default_data.decode_default_prime2() else: return binary_data.decode_file_path(data_file_path)
def decode_data_file(args) -> Dict: json_database: Optional[Path] = args.json_database if json_database is not None: with json_database.open() as data_file: return json.load(data_file) data_file_path: Optional[Path] = args.binary_database if data_file_path is None: return default_data.decode_default_prime2() else: extra_path = data_file_path.parent.joinpath(data_file_path.stem + "_extra.json") return binary_data.decode_file_path(data_file_path, extra_path)
def open_data_visualizer_at(self, world_name: Optional[str], area_name: Optional[str], ): self._data_visualizer = DataEditorWindow(default_data.decode_default_prime2(), False) if world_name is not None: self._data_visualizer.focus_on_world(world_name) if area_name is not None: self._data_visualizer.focus_on_area(area_name) self._data_visualizer.show()
def _test_data(default_preset): data = default_data.decode_default_prime2() game = data_reader.decode_data(data) permalink = Permalink( seed_number=15000, spoiler=True, presets={0: default_preset}, ) configuration = permalink.get_preset(0).layout_configuration patches = game.create_game_patches() patches = patches.assign_gate_assignment( base_patches_factory.gate_assignment_for_configuration( configuration, game.resource_database, Random(15000))) game, state = logic_bootstrap(configuration, game, patches) return game, state, permalink
def _test_data(): data = default_data.decode_default_prime2() game = data_reader.decode_data(data) configuration = LayoutConfiguration.from_params() permalink = Permalink( seed_number=15000, spoiler=True, patcher_configuration=PatcherConfiguration.default(), layout_configuration=configuration, ) patches = GamePatches.with_game(game) patches = patches.assign_gate_assignment( base_patches_factory.gate_assignment_for_configuration( configuration, game.resource_database, Random(15000))) game, state = logic_bootstrap(configuration, game, patches) return game, state, permalink
def __init__(self, network_client: QtNetworkClient, game_connection: GameConnection): super().__init__() self.logger = logging.getLogger(__name__) self.network_client = network_client self.game_connection = game_connection self._pickups_lock = asyncio.Lock() pid_name = game_connection.backend.lock_identifier if pid_name is not None: self._pid = pid.PidFile(pid_name) try: self._pid.create() except pid.PidFileError as e: raise BackendInUse(Path(self._pid.filename)) from e self.logger.info(f"Creating pid file at {self._pid.filename}") self._game = data_reader.decode_data(default_data.decode_default_prime2())
def __init__(self, game_connection: GameConnection): super().__init__() self.setupUi(self) self.game_connection = game_connection common_qt_lib.set_default_window_icon(self) self.game_data = data_reader.decode_data( default_data.decode_default_prime2()) self._energy_tank_item = find_resource_info_with_long_name( self.game_data.resource_database.item, "Energy Tank") self._item_to_label: Dict[ItemResourceInfo, ClickableLabel] = {} self._labels_for_keys = [] self.create_tracker() self._update_timer = QTimer(self) self._update_timer.setInterval(100) self._update_timer.timeout.connect(self._on_timer_update) self._update_timer.setSingleShot(True) self.game_connection.StatusUpdated.connect(self._game_status_updated)
def _test_data(): data = default_data.decode_default_prime2() game = data_reader.decode_data(data, False) configuration = LayoutConfiguration.from_params( trick_level=LayoutTrickLevel.NO_TRICKS, sky_temple_keys=LayoutSkyTempleKeyMode.FULLY_RANDOM, elevators=LayoutRandomizedFlag.VANILLA, pickup_quantities={}, starting_location=StartingLocation.default(), starting_resources=StartingResources.default(), ) permalink = Permalink( seed_number=15000, spoiler=True, patcher_configuration=PatcherConfiguration.default(), layout_configuration=configuration, ) logic, state = logic_bootstrap(configuration, game, GamePatches.with_game(game)) return logic, state, permalink
def test_create_elevators_field_elevators_for_a_seed(echoes_resource_database, empty_patches): # Setup game = data_reader.decode_data(default_data.decode_default_prime2(), False) patches = dataclasses.replace(empty_patches, elevator_connection={ 589851: AreaLocation(464164546, 900285955), 1572998: AreaLocation(1039999561, 3479543630), }) # Run result = patcher_file._create_elevators_field(game.world_list, patches) # Assert assert result == [ { "origin_location": { "world_asset_id": 1006255871, "area_asset_id": 2918020398 }, "target_location": { "world_asset_id": 464164546, "area_asset_id": 900285955 }, "room_name": "Transport to Sanctuary Fortress", }, { "origin_location": { "world_asset_id": 1006255871, "area_asset_id": 1660916974 }, "target_location": { "world_asset_id": 1039999561, "area_asset_id": 3479543630 }, "room_name": "Transport to Torvus Bog", }, ]
import sys import zipfile from pathlib import Path import markdown as markdown from randovania import VERSION, get_data_path from randovania.cli import prime_database from randovania.games.prime import default_data zip_folder = "randovania-{}".format(VERSION) package_folder = Path("dist", "randovania") shutil.rmtree(package_folder, ignore_errors=True) prime_database.export_as_binary(default_data.decode_default_prime2(), get_data_path().joinpath("binary_data", "prime2.bin")) subprocess.run([sys.executable, "-m", "PyInstaller", "randovania.spec"]) with zipfile.ZipFile("dist/{}.zip".format(zip_folder), "w", compression=zipfile.ZIP_DEFLATED) as release_zip: for f in package_folder.glob("**/*"): print("Adding", f) release_zip.write(f, "{}/{}".format(zip_folder, f.relative_to(package_folder))) with open("README.md") as readme_file: readme_html = markdown.markdown(readme_file.read()) release_zip.writestr(zip_folder + "/README.html", readme_html) for subdir, _, files in os.walk("randovania-readme"): for file in files:
from pathlib import Path import markdown from randovania import VERSION, get_data_path from randovania.cli import prime_database from randovania.games.prime import default_data zip_folder = "randovania-{}".format(VERSION) package_folder = Path("dist", "randovania") if package_folder.exists(): shutil.rmtree(package_folder, ignore_errors=False) prime_database.export_as_binary( default_data.decode_default_prime2(), get_data_path().joinpath("binary_data", "prime2.bin")) subprocess.run([sys.executable, "-m", "PyInstaller", "randovania.spec"], check=True) with zipfile.ZipFile("dist/{}.zip".format(zip_folder), "w", compression=zipfile.ZIP_DEFLATED) as release_zip: for f in package_folder.glob("**/*"): print("Adding", f) release_zip.write( f, "{}/{}".format(zip_folder, f.relative_to(package_folder))) with open("README.md") as readme_file: readme_html = markdown.markdown(readme_file.read())
def default_prime2_resource_database() -> ResourceDatabase: return read_resource_database( default_data.decode_default_prime2()["resource_database"])
def test_create_elevators_field_elevators_for_a_seed(vanilla_gateway: bool, echoes_resource_database, empty_patches): # Setup game = data_reader.decode_data(default_data.decode_default_prime2()) patches = game.create_game_patches() elevator_connection = copy.copy(patches.elevator_connection) elevator_connection[589851] = AreaLocation(464164546, 900285955) elevator_connection[1572998] = AreaLocation(1039999561, 3479543630) if not vanilla_gateway: elevator_connection[136970379] = AreaLocation(2252328306, 3619928121) patches = dataclasses.replace(patches, elevator_connection=elevator_connection) # Run result = patcher_file._create_elevators_field(patches, game) # Assert expected = [ {"instance_id": 589851, "origin_location": {"world_asset_id": 1006255871, "area_asset_id": 2918020398}, "target_location": {"world_asset_id": 464164546, "area_asset_id": 900285955}, "room_name": "Transport to Sanctuary Spider side"}, {"instance_id": 1572998, "origin_location": {"world_asset_id": 1006255871, "area_asset_id": 1660916974}, "target_location": {"world_asset_id": 1039999561, "area_asset_id": 3479543630}, "room_name": "Transport to Torvus Temple Access"}, {"instance_id": 1966093, "origin_location": {"world_asset_id": 1006255871, "area_asset_id": 2889020216}, "target_location": {"world_asset_id": 1039999561, "area_asset_id": 1868895730}, "room_name": "Transport to Torvus Entrance"}, {"instance_id": 2097251, "origin_location": {"world_asset_id": 1006255871, "area_asset_id": 1287880522}, "target_location": {"world_asset_id": 2252328306, "area_asset_id": 2399252740}, "room_name": "Transport to Temple Transport Violet"}, {"instance_id": 136970379, "origin_location": {"world_asset_id": 1006255871, "area_asset_id": 2278776548}, "target_location": {"world_asset_id": 2252328306, "area_asset_id": 2068511343 if vanilla_gateway else 3619928121}, "room_name": "Sky Temple Gateway" if vanilla_gateway else "Transport to Sanctum"}, {"instance_id": 3342446, "origin_location": {"world_asset_id": 1006255871, "area_asset_id": 3455543403}, "target_location": {"world_asset_id": 464164546, "area_asset_id": 3528156989}, "room_name": "Transport to Sanctuary Entrance"}, {"instance_id": 3538975, "origin_location": {"world_asset_id": 1006255871, "area_asset_id": 1345979968}, "target_location": {"world_asset_id": 2252328306, "area_asset_id": 408633584}, "room_name": "Transport to Temple Transport Emerald"}, {"instance_id": 152, "origin_location": {"world_asset_id": 2252328306, "area_asset_id": 408633584}, "target_location": {"world_asset_id": 1006255871, "area_asset_id": 1345979968}, "room_name": "Transport to Sanctuary Quadrant"}, {"instance_id": 393260, "origin_location": {"world_asset_id": 2252328306, "area_asset_id": 2556480432}, "target_location": {"world_asset_id": 1006255871, "area_asset_id": 2918020398}, "room_name": "Transport to Torvus Quadrant"}, {"instance_id": 524321, "origin_location": {"world_asset_id": 2252328306, "area_asset_id": 2399252740}, "target_location": {"world_asset_id": 1006255871, "area_asset_id": 1287880522}, "room_name": "Transport to Agon Quadrant"}, {"instance_id": 589949, "origin_location": {"world_asset_id": 2252328306, "area_asset_id": 2068511343}, "target_location": {"world_asset_id": 1006255871, "area_asset_id": 2278776548}, "room_name": "Sky Temple Energy Controller"}, {"instance_id": 122, "origin_location": {"world_asset_id": 1119434212, "area_asset_id": 1473133138}, "target_location": {"world_asset_id": 1006255871, "area_asset_id": 1660916974}, "room_name": "Transport to Agon Gate"}, {"instance_id": 1245307, "origin_location": {"world_asset_id": 1119434212, "area_asset_id": 2806956034}, "target_location": {"world_asset_id": 1039999561, "area_asset_id": 3479543630}, "room_name": "Transport to Torvus Temple Access"}, {"instance_id": 2949235, "origin_location": {"world_asset_id": 1119434212, "area_asset_id": 3331021649}, "target_location": {"world_asset_id": 464164546, "area_asset_id": 900285955}, "room_name": "Transport to Sanctuary Spider side"}, {"instance_id": 129, "origin_location": {"world_asset_id": 1039999561, "area_asset_id": 1868895730}, "target_location": {"world_asset_id": 1006255871, "area_asset_id": 2889020216}, "room_name": "Transport to Torvus Gate"}, {"instance_id": 2162826, "origin_location": {"world_asset_id": 1039999561, "area_asset_id": 3479543630}, "target_location": {"world_asset_id": 1119434212, "area_asset_id": 2806956034}, "room_name": "Transport to Agon Portal Access"}, {"instance_id": 4522032, "origin_location": {"world_asset_id": 1039999561, "area_asset_id": 3205424168}, "target_location": {"world_asset_id": 464164546, "area_asset_id": 3145160350}, "room_name": "Transport to Sanctuary Vault side"}, {"instance_id": 38, "origin_location": {"world_asset_id": 464164546, "area_asset_id": 3528156989}, "target_location": {"world_asset_id": 1006255871, "area_asset_id": 3455543403}, "room_name": "Transport to Sanctuary Gate"}, {"instance_id": 1245332, "origin_location": {"world_asset_id": 464164546, "area_asset_id": 900285955}, "target_location": {"world_asset_id": 1119434212, "area_asset_id": 3331021649}, "room_name": "Transport to Agon Temple Access"}, {"instance_id": 1638535, "origin_location": {"world_asset_id": 464164546, "area_asset_id": 3145160350}, "target_location": {"world_asset_id": 1039999561, "area_asset_id": 3205424168}, "room_name": "Transport to Lower Torvus Access"}, {'instance_id': 204865660, 'origin_location': {'world_asset_id': 464164546, 'area_asset_id': 3136899603}, 'target_location': {'world_asset_id': 464164546, 'area_asset_id': 1564082177}, 'room_name': 'Aerie Transport Station'}, {'instance_id': 4260106, 'origin_location': {'world_asset_id': 464164546, 'area_asset_id': 1564082177}, 'target_location': {'world_asset_id': 464164546, 'area_asset_id': 3136899603}, 'room_name': 'Aerie'} ] assert result == expected
def default_prime2_game_description() -> GameDescription: return data_reader.decode_data(default_data.decode_default_prime2())
def default_prime2_game_description(add_self_as_requirement_to_resources: bool = True, ) -> GameDescription: return data_reader.decode_data(default_data.decode_default_prime2(), add_self_as_requirement_to_resources)
def _open_data_visualizer(self): self._data_visualizer = DataEditorWindow( default_data.decode_default_prime2(), False) self._data_visualizer.show()
def game_data(self) -> dict: return default_data.decode_default_prime2()
def _open_data_editor_default(self): self._data_editor = DataEditorWindow( default_data.decode_default_prime2(), True) self._data_editor.show()
def echoes_game_data() -> dict: return default_data.decode_default_prime2()
def default_prime2_pickup_database() -> PickupDatabase: return read_pickup_database(default_data.decode_default_prime2()["pickup_database"], default_prime2_resource_database())