feat: Add CompatibleSaveGameCodec for legacy W3DS support and enhance SaveGamePersistence with existence check
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
@@ -578,6 +578,21 @@ class OriginalLayoutEnvelopeSaveGameCodec extends SaveGameCodec {
|
||||
}
|
||||
}
|
||||
|
||||
/// Writes classic-envelope saves while remaining able to read legacy W3DS
|
||||
/// saves created by earlier engine builds.
|
||||
class CompatibleSaveGameCodec extends OriginalLayoutEnvelopeSaveGameCodec {
|
||||
final SaveGameCodec _legacyCodec = SaveGameCodec();
|
||||
|
||||
@override
|
||||
SaveGameFile decode(Uint8List bytes) {
|
||||
try {
|
||||
return super.decode(bytes);
|
||||
} on FormatException {
|
||||
return _legacyCodec.decode(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class _BinaryWriter {
|
||||
final BytesBuilder _builder = BytesBuilder(copy: false);
|
||||
|
||||
|
||||
@@ -9,6 +9,12 @@ abstract class SaveGamePersistence {
|
||||
/// Loads raw bytes for [slot] and [version], or `null` when no save exists.
|
||||
Future<Uint8List?> load({required int slot, required GameVersion version});
|
||||
|
||||
/// Returns whether a non-empty save exists for [slot] and [version].
|
||||
Future<bool> exists({required int slot, required GameVersion version}) async {
|
||||
final Uint8List? bytes = await load(slot: slot, version: version);
|
||||
return bytes != null && bytes.isNotEmpty;
|
||||
}
|
||||
|
||||
/// Persists [bytes] for [slot] and [version].
|
||||
Future<void> save({
|
||||
required int slot,
|
||||
|
||||
@@ -50,7 +50,7 @@ class WolfEngine {
|
||||
'Provide either data or a non-empty availableGames list.',
|
||||
),
|
||||
_availableGames = availableGames ?? <WolfensteinData>[data!],
|
||||
saveGameCodec = saveGameCodec ?? SaveGameCodec(),
|
||||
saveGameCodec = saveGameCodec ?? CompatibleSaveGameCodec(),
|
||||
audio = engineAudio ?? CliSilentAudio(),
|
||||
doorManager = DoorManager(
|
||||
onPlaySound: (effect) => engineAudio?.playSoundEffect(effect),
|
||||
@@ -498,18 +498,10 @@ class WolfEngine {
|
||||
return;
|
||||
}
|
||||
|
||||
bool hasSave = false;
|
||||
for (final game in _availableGames) {
|
||||
final Uint8List? bytes = await saveGamePersistence!.load(
|
||||
slot: defaultSaveSlot,
|
||||
version: game.version,
|
||||
);
|
||||
if (bytes != null && bytes.isNotEmpty) {
|
||||
hasSave = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
final bool hasSave = await saveGamePersistence!.exists(
|
||||
slot: defaultSaveSlot,
|
||||
version: data.version,
|
||||
);
|
||||
_setLoadGameAvailability(hasSave);
|
||||
}
|
||||
|
||||
@@ -921,6 +913,9 @@ class WolfEngine {
|
||||
_currentEpisodeIndex = 0;
|
||||
onEpisodeSelected?.call(null);
|
||||
menuManager.clearEpisodeSelection();
|
||||
if (saveGamePersistence != null) {
|
||||
unawaited(_refreshLoadGameAvailability());
|
||||
}
|
||||
menuManager.beginIntroSplash(
|
||||
includeRetailWarning: data.version == GameVersion.retail,
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user