Verstehe ich das richtig: Unter DOS wurde der Spielstand nicht serialisiert, sondern 1:1 auf die HDD geschrieben, in der Annahme, dass beim nächsten Start wieder alles an derselben Adresse gespeichert wird? Wild, aber damals, ohne viel malloc/new und mit fast nur globalen Variablen, vermutlich eine valide Möglichkeit. Auf modernen Systemen gilt diese Annahme nicht, da Speicheradressen durch Mechanismen wie ASLR variieren und das Speicherlayout von Compiler, Linker und Betriebssystem beeinflusst wird.
Ich bin nicht wirklich in der Sache drin und könnte es falsch verstanden haben, aber ich würde hier einfach einen (De-)Serialisierer schreiben. Also die Zeiger beim Speichern auflösen in so etwas wie „3. Held“ und beim Neueinlesen wieder entsprechend setzen. Hilft natürlich nicht, wenn der Held dann im laufenden Spiel entfernt wird. ich vermute, er wird dann ausgenullt. In diesem Fall würde, wie hier im Screenshot zu sehen, ein „\0“ gelesen, was aber ein Bug im Originalspiel wäre und separat behoben werden müsste.
Edit: Wenn man Spielstände zwischen Versionen kompatibel halten will, kann man beim Speichern statt wie vorgeschlagen „3. Held“ den Wert DosHeldenStartOffset + 3 * Heldengröße ablegen. Beim Einlesen lässt sich der Index mit (value - DosHeldenStartOffset) / Heldengröße bestimmen und der Zeiger entsprechend setzen.
Ich bin nicht wirklich in der Sache drin und könnte es falsch verstanden haben, aber ich würde hier einfach einen (De-)Serialisierer schreiben. Also die Zeiger beim Speichern auflösen in so etwas wie „3. Held“ und beim Neueinlesen wieder entsprechend setzen. Hilft natürlich nicht, wenn der Held dann im laufenden Spiel entfernt wird. ich vermute, er wird dann ausgenullt. In diesem Fall würde, wie hier im Screenshot zu sehen, ein „\0“ gelesen, was aber ein Bug im Originalspiel wäre und separat behoben werden müsste.
Edit: Wenn man Spielstände zwischen Versionen kompatibel halten will, kann man beim Speichern statt wie vorgeschlagen „3. Held“ den Wert DosHeldenStartOffset + 3 * Heldengröße ablegen. Beim Einlesen lässt sich der Index mit (value - DosHeldenStartOffset) / Heldengröße bestimmen und der Zeiger entsprechend setzen.

