feat: Implement packaged games loading and update engine initialization to support seeded games

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-25 11:38:01 +01:00
parent d393ca98ec
commit d63d742695
9 changed files with 345 additions and 14 deletions
@@ -94,6 +94,57 @@ void main() {
},
);
test('init can seed available games from host-provided data', () async {
final tempDir = await Directory.systemTemp.createTemp(
'wolf3d-seeded-games-',
);
addTearDown(() async {
if (await tempDir.exists()) {
await tempDir.delete(recursive: true);
}
});
final persistence = DefaultGameDataDirectoryPersistence(
filePath: '${tempDir.path}/settings.json',
);
final wolf3d = Wolf3dFlutterEngine(
audioBackend: _NoopAudio(),
dataDirectoryPersistence: persistence,
);
final retail = _buildTestData(version: GameVersion.retail);
final shareware = _buildTestData(version: GameVersion.shareware);
await wolf3d.init(seededGames: [retail, shareware]);
expect(wolf3d.availableGames, hasLength(2));
expect(
wolf3d.availableGames.map((g) => g.version),
containsAll([GameVersion.retail, GameVersion.shareware]),
);
});
test('loadGameDataFromAssets prefixes keys for package assets', () async {
final requestedKeys = <String>[];
await expectLater(
() => Wolf3dFlutterEngine.loadGameDataFromAssets(
version: GameVersion.retail,
assetDirectory: 'assets/retail',
packageName: 'wolf_3d_assets',
assetLoader: (String key) async {
requestedKeys.add(key);
throw Exception('Expected test stop after first key.');
},
),
throwsException,
);
expect(
requestedKeys,
contains('packages/wolf_3d_assets/assets/retail/VSWAP.WL6'),
);
});
testWidgets('GameScreen hides debug FAB when debug mode is disabled', (
tester,
) async {
@@ -168,7 +219,9 @@ class _TestWolf3d extends Wolf3dFlutterEngine {
}
}
WolfensteinData _buildTestData() {
WolfensteinData _buildTestData({
GameVersion version = GameVersion.retail,
}) {
final wallGrid = List.generate(64, (_) => List.filled(64, 0));
final objectGrid = List.generate(64, (_) => List.filled(64, 0));
@@ -181,9 +234,11 @@ WolfensteinData _buildTestData() {
objectGrid[2][2] = MapObject.playerEast;
return WolfensteinData(
version: GameVersion.retail,
version: version,
dataVersion: DataVersion.unknown,
registry: RetailAssetRegistry(),
registry: version == GameVersion.shareware
? SharewareAssetRegistry()
: RetailAssetRegistry(),
walls: [_sprite(1), _sprite(1), _sprite(2), _sprite(2)],
sprites: List.generate(436, (_) => _sprite(255)),
sounds: List.generate(200, (_) => PcmSound(Uint8List(1))),