Added dynamic discovery of available game data
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
106
lib/game_select_screen.dart
Normal file
106
lib/game_select_screen.dart
Normal file
@@ -0,0 +1,106 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:wolf_3d_data/wolf_3d_data.dart';
|
||||
import 'package:wolf_dart/features/difficulty/difficulty_screen.dart';
|
||||
|
||||
class GameSelectScreen extends StatelessWidget {
|
||||
const GameSelectScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: FutureBuilder(
|
||||
future: loadData(),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.waiting) {
|
||||
return CircularProgressIndicator();
|
||||
}
|
||||
|
||||
if (!snapshot.hasData) {
|
||||
return Text("Unable to load data");
|
||||
}
|
||||
|
||||
final List<WolfensteinData> loadedGames = snapshot.data!;
|
||||
|
||||
if (loadedGames.length == 1) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => DifficultyScreen(loadedGames.first),
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
return ListView.builder(
|
||||
itemCount: loadedGames.length,
|
||||
itemBuilder: (context, i) {
|
||||
final WolfensteinData data = loadedGames[i];
|
||||
final GameVersion version = data.version;
|
||||
|
||||
return Card(
|
||||
child: ListTile(
|
||||
title: Text(version.name),
|
||||
onTap: () {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => DifficultyScreen(data),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<List<WolfensteinData>> loadData([
|
||||
bool? isShareware,
|
||||
]) async {
|
||||
final List<WolfensteinData> loadedGames = [];
|
||||
if (kIsWeb) {
|
||||
switch (isShareware) {
|
||||
case false:
|
||||
loadedGames.add(
|
||||
WolfensteinLoader.loadFromBytes(
|
||||
version: GameVersion.retail,
|
||||
vswap: await rootBundle.load('assets/retail/VSWAP.WL6'),
|
||||
mapHead: await rootBundle.load('assets/retail/MAPHEAD.WL6'),
|
||||
gameMaps: await rootBundle.load('assets/retail/GAMEMAPS.WL6'),
|
||||
vgaDict: await rootBundle.load('assets/retail/VGADICT.WL6'),
|
||||
vgaHead: await rootBundle.load('assets/retail/VGAHEAD.WL6'),
|
||||
vgaGraph: await rootBundle.load('assets/retail/VGAGRAPH.WL6'),
|
||||
),
|
||||
);
|
||||
break;
|
||||
default:
|
||||
loadedGames.add(
|
||||
WolfensteinLoader.loadFromBytes(
|
||||
version: GameVersion.shareware,
|
||||
vswap: await rootBundle.load('assets/shareware/VSWAP.WL1'),
|
||||
mapHead: await rootBundle.load('assets/shareware/MAPHEAD.WL1'),
|
||||
gameMaps: await rootBundle.load('assets/shareware/GAMEMAPS.WL1'),
|
||||
vgaDict: await rootBundle.load('assets/shareware/VGADICT.WL1'),
|
||||
vgaHead: await rootBundle.load('assets/shareware/VGAHEAD.WL1'),
|
||||
vgaGraph: await rootBundle.load('assets/shareware/VGAGRAPH.WL1'),
|
||||
),
|
||||
);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
final Map<GameVersion, WolfensteinData> discoveredVersions =
|
||||
await WolfensteinLoader.discover(
|
||||
directoryPath: 'assets',
|
||||
recursive: true,
|
||||
);
|
||||
|
||||
loadedGames.addAll(discoveredVersions.values);
|
||||
}
|
||||
|
||||
return loadedGames;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user