feat: Implement CompatibleSaveGameCodec for block payload format and legacy support

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-23 15:18:49 +01:00
parent 85fddd3df5
commit 1ed63d5f9b
2 changed files with 369 additions and 0 deletions
@@ -164,6 +164,59 @@ void main() {
expect(decoded.description, 'Legacy Save');
expect(decoded.createdAtMs, 777);
});
test('CompatibleSaveGameCodec round-trips with block payload format', () {
final WolfEngine engine = _buildEngine();
engine.init();
final CompatibleSaveGameCodec codec = CompatibleSaveGameCodec();
final SaveGameFile file = SaveGameFile(
slot: 2,
gameVersion: engine.data.version,
dataVersionName: engine.data.dataVersion.name,
description: 'Compatible Block Save',
createdAtMs: 1234,
snapshot: engine.captureSaveState(),
checksum: 0,
);
final Uint8List encoded = codec.encode(file);
final SaveGameFile decoded = codec.decode(encoded);
expect(decoded.slot, 2);
expect(decoded.description, 'Compatible Block Save');
expect(decoded.createdAtMs, 1234);
expect(
decoded.snapshot.currentEpisodeIndex,
file.snapshot.currentEpisodeIndex,
);
expect(decoded.snapshot.currentLevelIndex, file.snapshot.currentLevelIndex);
});
test('CompatibleSaveGameCodec decodes old envelope payload format', () {
final WolfEngine engine = _buildEngine();
engine.init();
final OriginalLayoutEnvelopeSaveGameCodec oldEnvelopeCodec =
OriginalLayoutEnvelopeSaveGameCodec();
final SaveGameFile file = SaveGameFile(
slot: 4,
gameVersion: engine.data.version,
dataVersionName: engine.data.dataVersion.name,
description: 'Old Envelope Save',
createdAtMs: 333,
snapshot: engine.captureSaveState(),
checksum: 0,
);
final Uint8List oldEncoded = oldEnvelopeCodec.encode(file);
final CompatibleSaveGameCodec compatibleCodec = CompatibleSaveGameCodec();
final SaveGameFile decoded = compatibleCodec.decode(oldEncoded);
expect(decoded.slot, 4);
expect(decoded.description, 'Old Envelope Save');
expect(decoded.createdAtMs, 333);
});
}
class _TestInput extends Wolf3dInput {