protected virtual void Update()
    {
        try
        {
            if (_currentBaseControlHandler != null)
            {
                while (!_currentBaseControlHandler.Update())
                {
                    BaseControlHandler poppedHandler = _controlHandlers.Pop();
                    poppedHandler.Dispose();

                    Logger.Info("Popped handler: " + poppedHandler.ToString());
                    TryActivateCurrentControlHandler(poppedHandler);
                }

                // after we updated the control handler, we now want to notify all stack members (excluding the current handler/peek) that an update
                // has occurred. This is necessary in case stacked handlers need to react to actions, for example: melee attack is interrupted by wall jump handler
                for (int i = _controlHandlers.Count - 2; i >= 0; i--)
                {
                    _controlHandlers[i].OnAfterStackPeekUpdate();
                }
            }
        }
        catch (Exception err)
        {
            Logger.Error("Game object " + this.name + " misses default control handler.", err);
            throw;
        }
    }
    /// <summary>
    /// Pushes the control handler.
    /// </summary>
    /// <param name="controlHandler">The control handler.</param>
    public void PushControlHandler(BaseControlHandler controlHandler)
    {
        Logger.Info("Pushing handler: " + controlHandler.ToString());

        _controlHandlers.Push(controlHandler);
        TryActivateCurrentControlHandler(_currentBaseControlHandler);
    }
예제 #3
0
    public DamageResult AddDamage()
    {
        if (_currentPowerUpItem.HasValue)
        {
            _orderedPowerUpInventory.Remove(_currentPowerUpItem.Value);

            _currentPowerUpControlHandler.Dispose();
            _gameManager.player.RemoveControlHandler(_currentPowerUpControlHandler);

            _currentPowerUpControlHandler = null;
            _currentPowerUpItem           = null;
            Logger.Info("Added damage, removed power up item. " + this.ToString());
            return(DamageResult.LostItem);
        }
        else
        {
            if (_powerMeter == 1)
            {
                _powerMeter = 0; // TODO (Roman): notify player for rendering...
                _gameManager.player.ExchangeControlHandler(0, new BadHealthPlayerControlHandler(_gameManager.player));
                Logger.Info("Added damage, reduced power meter. " + this.ToString());
                return(DamageResult.LostPower);
            }
            else
            {
                // player died
                Logger.Info("Added damage, respawn. " + this.ToString());
                // TODO (Roman): this should be somewhere else - this is just test code
                GameObject deathParticles = ObjectPoolingManager.Instance.GetObject(GameManager.instance.gameSettings.pooledObjects.defaultPlayerDeathParticlePrefab.prefab.name);
                deathParticles.transform.position = _gameManager.player.gameObject.transform.position;
                _gameManager.player.Respawn();
                return(DamageResult.IsDead);
            }
        }
    }
예제 #4
0
    public void InsertControlHandlerBeforeCurrent(BaseControlHandler controlHandler)
    {
        var index = Mathf.Max(0, _controlHandlers.Count - 1);

        Logger.Info("Inserting handler: " + controlHandler.ToString() + " at index " + index);

        _controlHandlers.Insert(index, controlHandler);
    }
예제 #5
0
    public override bool TryActivate(BaseControlHandler previousControlHandler)
    {
        PlayerController.PlayerState |= PlayerState.Invincible;

        _blinkTimer.Reset();

        return(true);
    }
    /// <summary>
    /// Resets the control handlers.
    /// </summary>
    /// <param name="controlHandler">The control handler.</param>
    public void ResetControlHandlers(BaseControlHandler controlHandler)
    {
        Logger.Info("Resetting character control handlers.");
        for (int i = _controlHandlers.Count - 1; i >= 0; i--)
        {
            Logger.Info("Removing handler: " + _controlHandlers[i].ToString());
            _controlHandlers[i].Dispose();
            _controlHandlers.RemoveAt(i);
        }

        _currentBaseControlHandler = null;
        PushControlHandler(controlHandler);
    }
예제 #7
0
    public void InsertControlHandler(int index, BaseControlHandler controlHandler)
    {
        Logger.Info("Inserting handler: " + controlHandler.ToString() + " at index " + index);

        if (index >= _controlHandlers.Count)
        {
            PushControlHandler(controlHandler);
        }
        else
        {
            _controlHandlers.Insert(index, controlHandler);
        }
    }
    private void TryActivateCurrentControlHandler(BaseControlHandler previousControlHandler)
    {
        _currentBaseControlHandler = _controlHandlers.Peek();

        while (_currentBaseControlHandler != null &&
               !_currentBaseControlHandler.TryActivate(previousControlHandler))
        {
            previousControlHandler = _controlHandlers.Pop();
            Logger.Info("Popped handler: " + previousControlHandler.ToString());
            previousControlHandler.Dispose();

            _currentBaseControlHandler = _controlHandlers.Peek();
        }
    }
    /// <summary>
    /// Exchanges the control handler.
    /// </summary>
    /// <param name="index">The index.</param>
    /// <param name="controlHandler">The control handler.</param>
    public void ExchangeControlHandler(int index, BaseControlHandler controlHandler)
    {
        Logger.Info("Exchanging handler " + _controlHandlers[index].ToString() + " (index: " + index + ") with " + controlHandler.ToString());

        if (_controlHandlers[index] == _currentBaseControlHandler)
        {
            BaseControlHandler poppedHandler = _controlHandlers.Exchange(index, controlHandler);
            poppedHandler.Dispose();

            TryActivateCurrentControlHandler(poppedHandler);
        }
        else
        {
            _controlHandlers.Exchange(index, controlHandler);
        }
    }
예제 #10
0
    public override bool TryActivate(BaseControlHandler previousControlHandler)
    {
        var targetPosition = _enemyController.gameObject.transform.position
                             + new Vector3(
            _ballisticTrajectorySettings.EndPosition.x * _moveDirectionFactor,
            _ballisticTrajectorySettings.EndPosition.y,
            _enemyController.gameObject.transform.position.z);

        _velocity = DynamicsUtility.GetBallisticVelocity(
            targetPosition,
            _enemyController.gameObject.transform.position,
            _ballisticTrajectorySettings.Angle,
            _ballisticTrajectorySettings.ProjectileGravity);

        return(true);
    }
    /// <summary>
    /// Removes the control handler.
    /// </summary>
    /// <param name="controlHandler">The control handler.</param>
    public void RemoveControlHandler(BaseControlHandler controlHandler)
    {
        Logger.Info("Removing handler: " + controlHandler.ToString());

        if (controlHandler == _currentBaseControlHandler)
        {
            BaseControlHandler poppedHandler = _controlHandlers.Pop();
            poppedHandler.Dispose();

            TryActivateCurrentControlHandler(poppedHandler);
        }
        else
        {
            _controlHandlers.Remove(controlHandler);
            controlHandler.Dispose();
        }
    }
    public override bool TryActivate(BaseControlHandler previousControlHandler)
    {
        PlayerController.PlayerState |= PlayerState.Invincible;
        PlayerController.PlayerState |= PlayerState.EnemyContactKnockback;

        _blinkTimer.Reset();

        _distancePerSecond = (1f / PlayerController.DamageSettings.KnockbackDuration)
                             * PlayerController.DamageSettings.KnockbackDistance;

        if (PlayerController.IsFacingRight())
        {
            _distancePerSecond *= -1f;
        }

        return(true);
    }
예제 #13
0
    public override bool TryActivate(BaseControlHandler previousControlHandler)
    {
        PlayerController.PlayerState |= PlayerState.Invincible;
        PlayerController.PlayerState |= PlayerState.Locked;

        if (_playerTranslationVector.HasValue)
        {
            _translateTransformAction = TranslateTransformAction.Start(
                PlayerController.transform.position,
                PlayerController.transform.position + _playerTranslationVector.Value,
                Duration,
                _playerTranslationEasingType,
                GameManager.Instance.Easing);
        }

        ResetOverrideEndTime();

        return(true);
    }
    public override bool TryActivate(BaseControlHandler previousControlHandler)
    {
        WallJumpEvaluationControlHandler wallJumpEvaluationControlHandler = previousControlHandler as WallJumpEvaluationControlHandler;

        if (wallJumpEvaluationControlHandler == null)
        {
            Logger.Info("Wall Jump Control Handler can not be activated because previous control handler is null.");
            return(false);
        }
        else if (wallJumpEvaluationControlHandler.HasDetached)
        {
            Logger.Info("Wall Jump Control Handler can not be activated because wall jump evaluation control handler has detached.");
            return(false);
        }

        _playerController.isAttachedToWall = true;

        return(base.TryActivate(previousControlHandler));
    }
    public override bool TryActivate(BaseControlHandler previousControlHandler)
    {
        PlayerController.PlayerState |= PlayerState.Sliding;

        _startTime = Time.time;

        _distancePerSecond = (1f / PlayerController.SlideSettings.Duration)
                             * PlayerController.SlideSettings.Distance;

        HorizontalAxisOverride = new AxisState(1f);

        if (!PlayerController.IsFacingRight())
        {
            HorizontalAxisOverride.Value = -1f;

            _distancePerSecond *= -1f;
        }

        return(true);
    }
예제 #16
0
    public void KillPlayer()
    {
        if (_currentPowerUpItem.HasValue)
        {
            _orderedPowerUpInventory.Remove(_currentPowerUpItem.Value);

            _currentPowerUpControlHandler.Dispose();
            _gameManager.player.RemoveControlHandler(_currentPowerUpControlHandler);

            _currentPowerUpControlHandler = null;
            _currentPowerUpItem           = null;
            Logger.Info("Added damage, removed power up item. " + this.ToString());
        }

        // player died
        Logger.Info("Added damage, respawn. " + this.ToString());

        // TODO (Roman): this should be somewhere else - this is just test code
        GameObject deathParticles = ObjectPoolingManager.Instance.GetObject(GameManager.instance.gameSettings.pooledObjects.defaultPlayerDeathParticlePrefab.prefab.name);

        deathParticles.transform.position = _gameManager.player.gameObject.transform.position;

        _gameManager.player.Respawn();
    }
예제 #17
0
    public void ApplyPowerUpItem(PowerUpType powerUpType)
    {
        if (powerUpType == PowerUpType.Basic)
        {
            _powerMeter = 1;
            _gameManager.player.ExchangeControlHandler(0, new GoodHealthPlayerControlHandler(_gameManager.player));
            Logger.Info("Added basic power up. " + this.ToString());
        }
        else
        {
            if (_powerMeter != 1)
            {
                // when getting a non basic power up, we want to set the power meter to 1 so we automatically go back to that state in case we lose the
                // power up.
                _powerMeter = 1;
                _gameManager.player.ExchangeControlHandler(0, new GoodHealthPlayerControlHandler(_gameManager.player));
                Logger.Info("Added basic power up. " + this.ToString());
            }

            if (!_currentPowerUpItem.HasValue || _currentPowerUpItem.Value != powerUpType)
            {
                if (_currentPowerUpItem.HasValue)
                {
                    _gameManager.player.RemoveControlHandler(_currentPowerUpControlHandler);
                }

                switch (powerUpType)
                {
                case PowerUpType.Floater:
                    _currentPowerUpControlHandler = new PowerUpFloaterControlHandler(_gameManager.player, _gameManager.gameSettings.powerUpSettings);
                    break;

                case PowerUpType.DoubleJump:
                    _currentPowerUpControlHandler = new PowerUpDoubleJumpControlHandler(_gameManager.player);
                    break;

                case PowerUpType.SpinMeleeAttack:
                    _currentPowerUpControlHandler = new PowerUpSpinMeleeAttackControlHandler(_gameManager.player);
                    break;

                case PowerUpType.JetPack:
                    _currentPowerUpControlHandler = new PowerUpJetPackControlHandler(_gameManager.player, 30f, _gameManager.gameSettings.powerUpSettings);
                    break;

                case PowerUpType.Gun:
                    _currentPowerUpControlHandler = new PowerUpGunControlHandler(_gameManager.player, -1f, _gameManager.gameSettings.powerUpSettings);
                    break;
                }

                _gameManager.player.PushControlHandler(_currentPowerUpControlHandler);
                _currentPowerUpItem = powerUpType;

                if (!_orderedPowerUpInventory.Contains(powerUpType))
                {
                    _orderedPowerUpInventory.Add(powerUpType);
                    _orderedPowerUpInventory.Sort();
                }

                Logger.Info("Added " + powerUpType.ToString() + " power up. " + this.ToString());
            }
        }
    }
    public override bool TryActivate(BaseControlHandler previousControlHandler)
    {
        PlayerController.PlayerState |= PlayerState.ClimbingLadderTop;

        return(true);
    }
예제 #19
0
 public void ExchangeActiveControlHandler(BaseControlHandler controlHandler)
 {
     ExchangeControlHandler(_controlHandlers.Count - 1, controlHandler);
 }
예제 #20
0
    /// <summary>
    /// This method is called from the BaseCharacterController control handler stack in order to evaluate whether the
    /// top stack element can be activated or not. By default this method always returns true but can be overridden
    /// for special purposes or chained control handlers.
    /// </summary>
    /// <param name="previousControlHandler">The last active control handler.</param>
    /// <returns>true if activation was successful; false if not.</returns>
    public virtual bool TryActivate(BaseControlHandler previousControlHandler)
    {
        Logger.Trace("Activated control handler: " + ToString());

        return(true);
    }