Editor für .save (Gamesavefiles)

iBroker

Neues Mitglied
Guten Tag ich hätte da mal ein anliegen, ich bin gerade dabei einen .sav File Reader für Games zu erstellen und habe da nun ein Problem und komme einfach nicht weiter. Die Savefile ist in einer binären Datenbank gespeichert und wird in eine .db (sqlite3) Datei umgewandelt und dann ausgelesen funktioniert auch alles soweit kann auch Daten ändern usw. jedoch habe ich, jetzt das Problem die Datei wieder zurück in das Ursprüngliche Dateiformat zu bringen normal wäre ja logisch, dass was man beim auslesen und umwandeln macht nur anders herum jedoch ist es leider nicht so einfach kennt sich da wer aus ?

Python:
import os
import gui
import sqlite3
import module.querys as querys
from customtkinter import filedialog

# from typing import Optional, IO, List, Dict, Any, Type


def get_savefile():
    db_header = b"GVAS"
    db_img_string = b"RawDatabaseImage"

    # Save File Open #
    save_file_path: str = filedialog.askopenfilename(
        initialdir=" ", title="Open Save File", filetypes=(("Save File", "*.sav"), ("All Files", "*.*"))
    )
    save_file = open(save_file_path, "rb").read()
    assert save_file.startswith(db_header)
    db_start_index = save_file.index(db_img_string) + 65
    db_start_size = int.from_bytes(save_file[db_start_index - 4 : db_start_index], byteorder="little")
    db_start_data = save_file[db_start_index : db_start_index + db_start_size]

    # Create Temp Database #
    db_tmp_file = os.path.join("src/db_temp.db")
    open(db_tmp_file, "wb+").write(db_start_data)

    # Connection to the Temp Database #
    db_connect = sqlite3.connect(db_tmp_file)
    db_cursor = db_connect.cursor()

    # Cursor on the Database #
    db_cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    db_tables = set(map(lambda x: x[0], db_cursor.fetchall()))
    assert db_tables.issuperset(querys.TABLES.keys())
    # All Tables #
    # print(f'{db_tables}\n')
 
Woran scheitert es denn? Also ich nehme an, du fügst den geänderten DB-Inhalt (db_temp.db) nach dem Header wieder ein aber die Datei wird nicht erkannt.

Kann es sein, dass nach dem RawDatabaseImage-Block auch noch ein anderer Block folgt, den du nach der DB wieder anfügen musst?
 
Mhhh. Hallo Hallo :D

Also nur damit ich es richtig verstehe...
  • Der User speichert das Spiel und das wird in eine .save gespeichert.
  • Die Save welche als UE4/5 GVas Format vorliegt kann nun in deinem Reade ausgelesen werden, dazu...
  • ...wandelst du dann die .save in eine .db für SQlite3 um und ließt die Daten aus.
  • Nach dem auslesen möchtest du die gleiche Datei wieder in eine .sav zurück wandeln
So richtig verstanden?

Ich müsste mich dazu intensiver damit befassen. Aber es ist sehr unwahrscheinlich, dass dies mal eben einfach gemacht ist, da das Konvertieren von binären Daten in ein anderes Format komplex sein kann und möglicherweise Spezifikationen des ursprünglichen Formats erfordert.

Das GVas Format wird ja auch von UnrealEngine4/5 genutzt, daher glückauf, habe ich zwar keine Lösung die schnelle Hilfe bringt, aber weil ich gerne mal Astroneer spiele und auch mal eine Idee hatte. Habe ich da ein Rep gehabt, der vielleicht zumindest dir aufzeigen kann, wie ein Lösungsweg aussehen könnte (den du dann natürlich für dich anpassen musst). Ich hoffe das es dir weiterhilft :)

https://gist.github.com/MartyMacGyver/ebeb8f803ef66be87c7c7d95d000ab42
 
Zurück
Oben Unten