public SpawnScreen(IStateMachine machine, Data data) : base(machine) { _data = data; var billboardDependencies = new DependencyContainer(new Dictionary <string, object> { { "clock", _data.MenuClock }, { "cameraTransform", _data.CameraMount.transform } }); _spawnpoints = GameObject.FindObjectOfType <SpawnpointDiscoverer>().Spawnpoints; var spawnpointBillboards = new List <GameObject>(_spawnpoints.Count); var billboardGroup = new GameObject("SpawnpointBillboards"); for (int i = 0; i < _spawnpoints.Count; i++) { var spawnpoint = _spawnpoints[i]; var spawnpointBillBoard = (GameObject)GameObject.Instantiate(_data.SpawnpointBillboardPrefab); spawnpointBillBoard.SetActive(spawnpoint.IsDiscovered); DependencyInjector.Default.Inject(spawnpointBillBoard, billboardDependencies); spawnpointBillBoard.SetParent(billboardGroup); spawnpointBillBoard.transform.Set(spawnpoint.Location.AsTransform); spawnpointBillBoard.SetActive(false); spawnpointBillboards.Add(spawnpointBillBoard); } _uiState = TypedDataCursor <SpawnScreenUIState> .Root(new SpawnScreenUIState( spawnpointUiList : new UIListState(spawnpointBillboards))); var spawnpointUiState = _uiState.To(s => s.SpawnpointUIList); var spawnpointIndexChanged = spawnpointUiState .To(s => s.HighlightedIndex) .OnUpdate .DistinctUntilChanged(IntComparer.Instance) .Skip(1); _data.SelectedSpawnpointName.text = _spawnpoints[spawnpointUiState.Get().HighlightedIndex].Name; spawnpointIndexChanged.Subscribe(i => { Fmod.PlayOneShot("event:/ui/drop_hover"); var spawnpoint = _spawnpoints[i]; _data.SelectedSpawnpointName.text = spawnpoint.Name; _data.CameraAnimator.LookTarget = spawnpointBillboards[i].transform; }); _uiList = new UISketch.NavigableUIList( spawnpointUiState, data.CameraManager.Rig.GetMainCamera(), spawnpointIndex => { _data.EventSystem.Emit(new Events.SpawnpointSelected(_spawnpoints[spawnpointIndex].Location)); }); }
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); }