Exemplo n.º 1
0
            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;
            }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }