Beispiel #1
0
        protected bool TryFinishChangeState(State target, params object[] args)
        {
            switch (target)
            {
            case State.Menu:
                _state = target;
                return(true);

            case State.CharacterSelection:
                OnCharacterSelectHandler?.Invoke(true);
                _state = target;
                return(true);

            case State.Begin:
                _podium.Clear();

                foreach (var c in _controllers)
                {
                    if (c == null)
                    {
                        continue;
                    }

                    _podium.Add(c, c._characterResource);
                }

                _podium.gameObject.SetActive(false);

                OnLevelSelectHandler.Invoke(false);

                foreach (World.Level level in _levels)
                {
                    if (level == null)
                    {
                        continue;
                    }

                    if (level == _selectedLevel)
                    {
                        continue;
                    }

                    level.gameObject.SetActive(false);
                }


                _selectedLevel.gameObject.SetActive(false);

                _state = target;
                return(TryChangeState(State.Round, _roundTime));


            case State.Transition:

                _transition = (State)args[0];
                _transitionTimer.Start();

                _transitionEffect.Perform();

                _state = target;
                return(true);


            case State.Podium:
                _podium.gameObject.SetActive(true);
                OnPodiumHandler?.Invoke();
                _state = target;
                return(true);

            case State.FinalPodium:
                _podium.gameObject.SetActive(true);
                OnFinalPodiumHandler?.Invoke();
                _state = target;
                return(true);

            case State.LevelSelection:

                _state = target;

                foreach (World.Level lv in _levels)
                {
                    lv.gameObject.SetActive(true);
                    lv.OnLevelSelect();
                }

                OnLevelSelect();
                OnLevelSelected(0);

                return(true);

            case State.Round:

                // TODO enable

                _selectedLevel.TargetPosition     = Vector3.zero;
                _selectedLevel.transform.position = Vector3.zero;

                _selectedLevel.gameObject.SetActive(true);

                _currentLevel =
                    Instantiate(
                        _selectedLevel.gameObject,
                        Vector3.zero, Quaternion.identity,
                        gameObject.transform).GetComponent <World.Level>();

                _selectedLevel.gameObject.SetActive(false);


                _currentLevel.OnScoreValueAddedHandler += OnScoreValueAdded;

                _currentLevel.OnLevelCompletedHandler += OnLevelCompleted;

                List <Placeholder> placeholders = new List <Placeholder>();
                placeholders.AddRange(_currentLevel._characterPlaceholders);

                int i = 0;
                while (!placeholders.IsEmpty())
                {
                    Placeholder placeholder = placeholders.RemoveRandom();

                    _controllers[i]._character = _controllers[i]
                                                 ._characterResource.Create(
                        _currentLevel.GridToWorld(placeholder._gridPosition),
                        _currentLevel.transform);

                    _controllers[i]._character.Number = _controllers[i].Number;

                    _controllers[i]._character.Color = _controllers[i].Color;

                    _controllers[i]._character._level = _currentLevel;

                    _controllers[i]._character.TryChangeState(Character.State.Disabled);

                    _controllers[i].Score = 0;

                    _controllers[i]._assignedNumber = placeholder.Number;

                    i++;

                    Destroy(placeholder.gameObject);
                }

                _round =
                    new Round(
                        _countDown,
                        _roundTime,
                        _countDownTime,
                        _intermissionTime,
                        _roundIndex);

                StartCoroutine(NewRoundCoroutine());

                _state = target;

                return(true);

            case State.Score:

                _state = target;

                return(true);

            case State.WaitingNextRound:
                //Lobby.Characters.Clear();
                //Lobby.Characters.AddRange(_selectedLevel.Characters);

                foreach (Controller ctrl in Lobby.Controllers)
                {
                    if (ctrl == null)
                    {
                        continue;
                    }

                    //ctrl.Character = null;
                }

                _state = target;

                OnWaiting();
                return(true);


            default:
                return(false);
            }
        }