public Editing(IStateMachine machine, Data data, ParachuteStorage parachuteStorage, ITypedDataCursor <ParachuteStorageViewState> storageState) : base(machine) { _editorParachuteChanges = new ReplaySubject <Parachute>(1); _data = data; _editorState = storageState.To(c => c.EditorState); _activeParachuteConfig = _editorState.To(editorState => editorState.Config); // Toggle editor camera off when a gizmo interaction starts to avoid feedback loops //_data._cameraRig.Initialize(); storageState.OnUpdate // Store parachute every time it is changed (by sampling or throttling to reduce disk I/O) // Store parachute every time the use selects a different parachute .Throttle(TimeSpan.FromSeconds(2), Scheduler.ThreadPool) .ObserveOn(UnityThreadScheduler.MainThread) .Select(state => { return(state.AvailableParachutes .Where(p => p.IsEditable) .Select(p => { var config = GameObject.Instantiate(p); var json = JsonUtility.ToJson(config, prettyPrint: true); return new { config, json }; }) .ToList()); }) // Copy object to prevent thread-unsafe editing .ObserveOn(Schedulers.FileWriterScheduler) .Subscribe(parachutes => { parachuteStorage.DeleteAllStoredParachutes(); for (int i = 0; i < parachutes.Count; i++) { var parachute = parachutes[i]; parachuteStorage.StoreParachute(parachute.config, parachute.json); } }); data.ParachuteSelectionView.Initialize(storageState, data.GameSettingsProvider.IsVrActive); data.ParachuteSelectionView.BackToFlight += TransitToFlyingState; }
public Playing(IStateMachine machine, Data data, FlyWingsuit.Data wingsuitData, ParachuteStates.Data parachuteData, SpectatorMode.Data spectatorData) : base(machine) { _data = data; _data.PlayerPilotSpawner.ActiveNetwork = data.ActiveNetwork; wingsuitData.ActiveNetwork = data.ActiveNetwork; wingsuitData.PlayerPilotSpawner.ActiveNetwork = data.ActiveNetwork; var parachuteConfigPath = Path.Combine(VoloAirsportFileStorage.StorageDir.Value, "ParachuteConfig_v" + ParachuteConfig.VersionNumber + ".json"); Debug.Log("parachute config path: " + parachuteConfigPath); var defaultParachuteStorage = new ParachuteStorage(ParachuteStorage.DefaultChutesDir.Value, parachuteData.InitialConfig, parachuteData.HardCodedAirfoilDefinition, isEditable: false); var parachuteStorage = new ParachuteStorage(ParachuteStorage.StorageDir.Value, parachuteData.InitialConfig, parachuteData.HardCodedAirfoilDefinition, isEditable: true); var allParachutes = defaultParachuteStorage.StoredChutes.Concat(parachuteStorage.StoredChutes).ToList(); var initialChute = ParachuteStorage.SelectParachute(allParachutes, _data.GameSettingsProvider.ActiveSettings.Other.SelectedParachuteId); var storageState = TypedDataCursor <ParachuteStorageViewState> .Root(new ParachuteStorageViewState(initialChute, allParachutes, ParachuteStorage.StorageDir.Value)); _activeParachuteConfig = storageState.To(s => s.EditorState).To(s => s.Config); _activeParachuteConfig.OnUpdate.Subscribe(selectedParachute => { var gameSettings = _data.GameSettingsProvider.ActiveSettings; if (gameSettings.Other.SelectedParachuteId != selectedParachute.Id) { gameSettings.Other.SelectedParachuteId = selectedParachute.Id; _data.GameSettingsProvider.UpdateGameSettings(gameSettings); } }); _playingStateMachine = BuildPlayingStateMachine(data.CoroutineScheduler, wingsuitData, parachuteData, parachuteStorage, storageState, spectatorData); _playingStateMachine.Transition(PlayingStates.Initial); }
private IStateMachine BuildPlayingStateMachine( ICoroutineScheduler scheduler, FlyWingsuit.Data wingsuitData, ParachuteStates.Data parachuteData, ParachuteStorage parachuteStorage, ITypedDataCursor <ParachuteStorageViewState> parachuteStorageViewState, SpectatorMode.Data spectatorData) { var machine = new StateMachine <Playing>(this, scheduler); machine.AddState(PlayingStates.Initial, new ParachuteStates.InitialState(machine)) .Permit(PlayingStates.FlyingWingsuit) .PermitChild(PlayingStates.Suspended); machine.AddState(PlayingStates.FlyingWingsuit, new FlyWingsuit(machine, wingsuitData)) .Permit(PlayingStates.EditingParachute) .Permit(PlayingStates.FlyingParachute) .PermitChild(PlayingStates.Suspended) .PermitChild(PlayingStates.Spectating) .Permit(PlayingStates.Initial); machine.AddState(PlayingStates.FlyingParachute, new ParachuteStates.Flying(machine, parachuteData)) .Permit(PlayingStates.EditingParachute) .Permit(PlayingStates.FlyingWingsuit) .PermitChild(PlayingStates.Spectating) .PermitChild(PlayingStates.Suspended) .Permit(PlayingStates.Initial); machine.AddState(PlayingStates.Spectating, new SpectatorMode(machine, spectatorData)) .PermitChild(PlayingStates.Suspended); machine.AddState(PlayingStates.EditingParachute, new ParachuteStates.Editing(machine, parachuteData, parachuteStorage, parachuteStorageViewState)) .Permit(PlayingStates.FlyingParachute) .PermitChild(PlayingStates.Suspended) .Permit(PlayingStates.Initial); machine.AddState(PlayingStates.Suspended, new ParachuteStates.InitialState(machine)) .Permit(PlayingStates.Initial); return(machine); }