Files
wolf_dart/lib/game_select_screen.dart
2026-03-15 11:23:41 +01:00

107 lines
3.5 KiB
Dart

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;
}
}