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 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> loadData([ bool? isShareware, ]) async { final List 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 discoveredVersions = await WolfensteinLoader.discover( directoryPath: 'assets', recursive: true, ); loadedGames.addAll(discoveredVersions.values); } return loadedGames; } }