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