mirror of
https://github.com/ALEZ-DEV/Babylonia-terminal.git
synced 2025-12-16 09:28:53 +00:00
85 lines
2.3 KiB
Dart
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;
|
|
}
|
|
}
|
|
}
|