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); }