game_manager_service.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import 'package:fixnum/fixnum.dart';
  2. import 'package:grpc/grpc.dart';
  3. import 'package:trackoffical_app/service/game/game_instance.dart';
  4. import 'package:trackoffical_app/service/game/game_instance_guardian.dart';
  5. import 'package:trackoffical_app/service/game/game_instance_orienteering_assistant.dart';
  6. import 'package:trackoffical_app/service/game/game_instance_std/game_instance_std.dart';
  7. import 'package:trackoffical_app/service/service.dart';
  8. import 'package:trackoffical_app/view/ingame/game_orienteering_assistant/game_orienteering_assistant_view.dart';
  9. import 'dart:async';
  10. import '../../exception/exception.dart';
  11. import '../../logger.dart';
  12. import '../../model/game_state.dart';
  13. import '../api.dart';
  14. import '../database.dart';
  15. class GameManagerService extends IService {
  16. static GameManagerService get to => Get.find();
  17. final _api = ApiService.to;
  18. final _database = DatabaseService.to;
  19. Future<GameInstanceStd?> checkUnFinished()async{
  20. final save = await _database.getExistGameData();
  21. if (save != null) {
  22. info('存在本地未完成游戏');
  23. final instance = GameInstanceStd(
  24. gameState: save.toState(),
  25. );
  26. return instance;
  27. } else {
  28. try {
  29. final online = await _api.getInGameData();
  30. final gameState = GameState()
  31. ..pbGameData = online.data
  32. ..pbGameSave = online.save;
  33. info('存在线上未完成游戏');
  34. final instance = GameInstanceStd(
  35. gameState: gameState,
  36. );
  37. return instance;
  38. } on GrpcError catch (e) {
  39. if (e.code != StatusCode.notFound) {
  40. warn(e);
  41. }
  42. } catch (e) {
  43. warn(e);
  44. }
  45. }
  46. return null;
  47. }
  48. Future<GameInstanceStd> gameStart(int activityId, Int64 mapRouteId) async {
  49. info('项目Id[$activityId]准备开始');
  50. if(statue.value== GameManagerServiceStatus.closing){
  51. throw GameNotClosedError();
  52. }
  53. final data = await ApiService.to.gameStart(activityId, mapRouteId);
  54. final instance = GameInstanceStd(
  55. gameState: data.toGameState(),
  56. );
  57. instanceStart(instance);
  58. info('活动Id[$activityId],游戏Id[${instance.id}]已开始');
  59. return instance;
  60. }
  61. Future<void> instanceStop()async{
  62. if(statue.value == GameManagerServiceStatus.closing){
  63. warn('[${instance.runtimeType}]正在停止,忽略操作');
  64. return;
  65. }
  66. if(instance==null){
  67. return;
  68. }
  69. statue.value = GameManagerServiceStatus.closing;
  70. debug('[${instance.runtimeType}]正在停止');
  71. await instance?.closeUsedByManager();
  72. Get.delete<GameInstance>();
  73. debug('[${instance.runtimeType}]已停止');
  74. instance=null;
  75. statue.value = GameManagerServiceStatus.idle;
  76. }
  77. Future<void> guardianStart(int underGuardianId)async{
  78. final instance = GameInstanceGuardian(underGuardianId: underGuardianId);
  79. await instanceStart(instance);
  80. }
  81. void orienteeringAssistantStart(){
  82. final instance = GameInstanceOrienteeringAssistant();
  83. Get.to(()=>gameOrienteeringAssistantView(instance));
  84. instanceStart(instance);
  85. }
  86. Future<void> instanceStart(GameInstance instance)async{
  87. if(statue.value== GameManagerServiceStatus.closing){
  88. throw GameNotClosedError();
  89. }
  90. await instanceStop();
  91. statue.value = GameManagerServiceStatus.preparing;
  92. this.instance=instance;
  93. instance.stop=(){
  94. instanceStop();
  95. };
  96. statue.value = GameManagerServiceStatus.loading;
  97. await instance.init();
  98. instance.loadProgress.value= 1;
  99. Get.put<GameInstance>(instance, permanent: true);
  100. statue.value = GameManagerServiceStatus.playing;
  101. }
  102. GameInstance? instance;
  103. final statue = GameManagerServiceStatus.idle.obs;
  104. @override
  105. Future<void> init() async{}
  106. }
  107. enum GameManagerServiceStatus {
  108. // 空闲
  109. idle,
  110. // 准备进入游戏
  111. preparing,
  112. loading,
  113. playing,
  114. // 结算中
  115. closing,
  116. }