Ejemplo n.º 1
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);
        }
Ejemplo 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);
        }