Example #1
0
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
Example #2
0
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()
Example #3
0
    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)
Example #4
0
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 == []
Example #5
0
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."
Example #6
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)
Example #7
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:
        extra_path = data_file_path.parent.joinpath(data_file_path.stem + "_extra.json")
        return binary_data.decode_file_path(data_file_path, extra_path)
Example #8
0
    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()
Example #9
0
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
Example #11
0
    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)
Example #13
0
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
Example #14
0
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",
        },
    ]
Example #15
0
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())
Example #17
0
def default_prime2_resource_database() -> ResourceDatabase:
    return read_resource_database(
        default_data.decode_default_prime2()["resource_database"])
Example #18
0
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
Example #19
0
def default_prime2_game_description() -> GameDescription:
    return data_reader.decode_data(default_data.decode_default_prime2())
Example #20
0
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)
Example #21
0
 def _open_data_visualizer(self):
     self._data_visualizer = DataEditorWindow(
         default_data.decode_default_prime2(), False)
     self._data_visualizer.show()
Example #22
0
 def game_data(self) -> dict:
     return default_data.decode_default_prime2()
Example #23
0
 def _open_data_editor_default(self):
     self._data_editor = DataEditorWindow(
         default_data.decode_default_prime2(), True)
     self._data_editor.show()
Example #24
0
def echoes_game_data() -> dict:
    return default_data.decode_default_prime2()
Example #25
0
def default_prime2_pickup_database() -> PickupDatabase:
    return read_pickup_database(default_data.decode_default_prime2()["pickup_database"],
                                default_prime2_resource_database())