Babylonia-terminal/babylonia_terminal_launcher/lib/models/game.dart
2024-11-06 19:51:18 +01:00

85 lines
2.3 KiB
Dart

import 'package:babylonia_terminal_launcher/messages/steps/game.pb.dart';
import 'package:fixnum/fixnum.dart';
import 'package:flutter/material.dart';
import './../providers/providers.dart';
enum GameInstallationState {
idle,
checkingFile,
downloading,
patching,
}
enum GameRunState {
idle,
running,
}
class Game with ChangeNotifier {
GameInstallationState gameInstallationState = GameInstallationState.idle;
GameRunState gameRunState = GameRunState.idle;
Int64 currentProgress = Int64(0);
Int64 maxProgress = Int64(0);
Int64 currentSpeed = Int64(0);
Future startInstallation(GameStateProvider gameState, bool isUpdating) async {
StartGameInstallation(isUpdating: isUpdating).sendSignalToRust();
gameInstallationState = GameInstallationState.checkingFile;
notifyListeners();
final downloadProgresStream = GameInstallationProgress.rustSignalStream;
DateTime waitUntil = DateTime.now().add(const Duration(seconds: 1));
Int64 lastProgress = Int64(0);
await for (final rustSignal in downloadProgresStream) {
if (gameInstallationState == GameInstallationState.checkingFile) {
gameInstallationState = GameInstallationState.downloading;
}
currentProgress = rustSignal.message.current;
maxProgress = rustSignal.message.max;
if (waitUntil.isBefore(DateTime.now())) {
if (currentSpeed == 0) {
currentSpeed = currentProgress;
lastProgress = currentProgress;
} else {
currentSpeed = currentProgress - lastProgress;
lastProgress = currentProgress;
}
waitUntil = DateTime.now().add(const Duration(seconds: 1));
}
notifyListeners();
if (currentProgress >= maxProgress) {
break;
}
}
gameInstallationState = GameInstallationState.patching;
notifyListeners();
final successStream = NotifyGameSuccessfullyInstalled.rustSignalStream;
await for (final _ in successStream) {
gameState.updateGameState();
break;
}
}
Future startGame() async {
RunGame().sendSignalToRust();
gameRunState = GameRunState.running;
notifyListeners();
final stream = GameStopped.rustSignalStream;
await for (final _ in stream) {
gameRunState = GameRunState.idle;
notifyListeners();
break;
}
}
}