public virtual async UniTask <GameStateMap> SaveGameAsync(string slotId) { var quick = slotId.StartsWithFast(Configuration.QuickSaveSlotMask.GetBefore("{")); OnGameSaveStarted?.Invoke(new GameSaveLoadArgs(slotId, quick)); var state = new GameStateMap(); await scriptPlayer.SynchronizeAndDoAsync(DoSaveAfterSync); OnGameSaveFinished?.Invoke(new GameSaveLoadArgs(slotId, quick)); return(state); async UniTask DoSaveAfterSync() { state.SaveDateTime = DateTime.Now; state.Thumbnail = cameraManager.CaptureThumbnail(); SaveAllServicesToState <IStatefulService <GameStateMap>, GameStateMap>(state); PerformOnGameSerializeTasks(state); state.RollbackStackJson = SerializeRollbackStack(); await GameSlotManager.SaveAsync(slotId, state); // Also save global state on every game save. await SaveGlobalAsync(); } }
public virtual async UniTask <GameStateMap> SaveGameAsync(string slotId) { var quick = slotId.StartsWithFast(Configuration.QuickSaveSlotMask.GetBefore("{")); OnGameSaveStarted?.Invoke(new GameSaveLoadArgs(slotId, quick)); var state = new GameStateMap(); await scriptPlayer.SynchronizeAndDoAsync(DoSaveAfterSync); OnGameSaveFinished?.Invoke(new GameSaveLoadArgs(slotId, quick)); return(state); async UniTask DoSaveAfterSync() { state.SaveDateTime = DateTime.Now; state.Thumbnail = cameraManager.CaptureThumbnail(); SaveAllServicesToState <IStatefulService <GameStateMap>, GameStateMap>(state); for (int i = onGameSerializeTasks.Count - 1; i >= 0; i--) { onGameSerializeTasks[i](state); } if (RollbackStack != null) { // Closest spot with zero inline index is used when changing locale (UI/GameSettings/LanguageDropdown.cs). var nearestStartLineSpot = RollbackStack.FirstOrDefault(s => s.PlaybackSpot.InlineIndex == 0); bool SelectSerializedSnapshots(GameStateMap s) => s.PlayerRollbackAllowed || s == nearestStartLineSpot; state.RollbackStackJson = RollbackStack.ToJson(Configuration.SavedRollbackSteps, SelectSerializedSnapshots); } await GameStateSlotManager.SaveAsync(slotId, state); // Also save global state on every game save. await SaveGlobalStateAsync(); } }