Beispiel #1
0
    void Update()
    {
        if (_animator.enabled)
        {
            return;
        }

        _timeSinceBeginning += Time.deltaTime;
        float animationDuration = _isAggressiveAttack ? _weaponAnimationData.AggressiveAnimationDuration : _weaponAnimationData.NormalAnimationDuration;
        float progress          = _timeSinceBeginning / animationDuration;

        if (progress > 1f)
        {
            _weaponColorizer.Decolorize(this);
            _timeSinceBeginning = 0f;
            _animator.enabled   = true;
        }
        AnimationCurve movementCurve = _isAggressiveAttack ? _weaponAnimationData.AggressiveMovementCurve : _weaponAnimationData.NormalMovementCurve;

        Vector3 positionWithoutDeviation = Vector3.LerpUnclamped(_initialPosition, _mySwingTarget, movementCurve.Evaluate(progress));

        if (_deviationCurveForX != null)
        {
            var positionAfterDeviation = positionWithoutDeviation
                                         + new Vector3(
                _deviationCurveForX.Evaluate(progress) * _deviationImportanceForX,
                _deviationCurveForY.Evaluate(progress) * _deviationImportanceForY,
                0);

            transform.position = positionAfterDeviation;

            Quaternion rotationWithoutDeviation = Quaternion.Lerp(_initialRotation, _mySwingTargetRotation,
                                                                  _weaponAnimationData.NormalMovementCurve.Evaluate(progress));
            float eulerZDeviation = 360 * _deviationCurveForRotation.Evaluate(progress);
            var   withDeviation   = Quaternion.Euler(rotationWithoutDeviation.eulerAngles.x, rotationWithoutDeviation.eulerAngles.y,
                                                     rotationWithoutDeviation.eulerAngles.z + eulerZDeviation);
            transform.localRotation = withDeviation;
        }
        else
        {
            transform.position      = positionWithoutDeviation;
            transform.localRotation = Quaternion.Lerp(_initialRotation, _mySwingTargetRotation, _weaponAnimationData.NormalMovementCurve.Evaluate(progress));
        }
    }
Beispiel #2
0
        public void Update()
        {
            if (_gameContext.ControlBlocked)
            {
                return;
            }

            if (!Input.anyKey && !Input.anyKeyDown)
            {
                _timeLeftToRepeat = InitialTimeLeftToRepeat;
                return;
            }

            //if(Input.anyKeyDown && !(Input.GetKeyDown(KeyCode.Alpha1) || Input.GetKeyDown(KeyCode.Alpha2) || Input.GetKeyDown(KeyCode.Alpha3)
            //	|| Input.GetKeyDown(KeyCode.Alpha4) || Input.GetKeyDown(KeyCode.E))) // jak zmieniasz E, to w obu miejscach!
            //{
            //	_uiConfig.ItemHolder.DeselectItem();
            //	_uiConfig.TooltipPresenter.Panel.gameObject.SetActive(false);
            //}

            if (Input.GetKeyDown(KeyCode.Escape))
            {
                PlayerInputModifier cancelledInputModifier = _inputHolder.PlayerInputModifier;
                if (cancelledInputModifier == PlayerInputModifier.Move || cancelledInputModifier == PlayerInputModifier.Push)
                {
                    _arrowsVisibilityManager.Hide();
                }
                else if (cancelledInputModifier == PlayerInputModifier.DaringBlow)
                {
                    _weaponColorizer.Decolorize(_gameContext.PlayerActor.WeaponAnimator);
                }
                //_uiConfig.RestartButton.gameObject.SetActive(false); to samo poniżej (choć tak bardzo brzydziej)
                foreach (var sceneRestarter in FindObjectsOfType <SceneRestarter>().ToList())
                {
                    sceneRestarter.gameObject.SetActive(false);
                }

                _inputHolder.PlayerInputModifier = PlayerInputModifier.None;
            }
            else if ((Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter) || Input.GetKeyDown(KeyCode.Y)) &&
                     GameObject.FindGameObjectWithTag("button_quit") != null && GameObject.FindGameObjectWithTag("button_quit").activeInHierarchy)
            {
                Application.Quit();
            }
            else if ((Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter) || Input.GetKeyDown(KeyCode.Y)) &&
                     _uiConfig.RestartButton.gameObject.activeInHierarchy)
            {
                FindObjectOfType <SceneRestarter>().RestartScene();
            }
            if (Input.GetKeyDown(KeyCode.W))
            {
                _inputHolder.PlayerInputModifier = PlayerInputModifier.Move;
                _uiConfig.WalkAbilityButton.onClick.Invoke();
                //_arrowsVisibilityManager.Show(Color.green);
            }
            if (Input.GetKeyDown(KeyCode.F))
            {
                ActorData playerData = _gameContext.PlayerActor.ActorData;

                if (playerData.Traits.Contains(Trait.Push) && playerData.Swords >= 1)
                {
                    _inputHolder.PlayerInputModifier = PlayerInputModifier.Push;
                    _uiConfig.PushAbilityButton.onClick.Invoke();
                    //_arrowsVisibilityManager.Show(Color.yellow);
                }
            }
            if (Input.GetKeyDown(KeyCode.A))
            {
                ActorData playerData = _gameContext.PlayerActor.ActorData;
                if (playerData.Traits.Contains(Trait.DaringBlow) && playerData.Swords >= 2)
                {
                    _inputHolder.PlayerInputModifier = PlayerInputModifier.DaringBlow;
                    _uiConfig.DaringBlowAbilityButton.onClick.Invoke();
                    _weaponColorizer.Colorize(_gameContext.PlayerActor.WeaponAnimator, Color.red);
                }
            }
            if ((Input.GetKey(KeyCode.LeftShift) | Input.GetKey(KeyCode.RightShift)) && Input.GetKeyDown(KeyCode.Comma))
            {
                _inputHolder.PlayerInput = PlayerInput.Ascend;
            }
            if (Input.GetKeyDown(KeyCode.G))
            {
                _inputHolder.PlayerInput = PlayerInput.PickUp;
            }
            else if (Input.GetKeyDown(KeyCode.D))
            {
                _inputHolder.PlayerInput = PlayerInput.DropCurrentItem;
            }
            else if (Input.GetKeyDown(KeyCode.R))
            {
                _inputHolder.PlayerInput = PlayerInput.Release;
            }
            else if (Input.GetKeyDown(KeyCode.E))             // jak zmieniasz E, to w obu miejscach!
            {
                _inputHolder.PlayerInput = PlayerInput.UseCurrentItem;
            }
            else if (Input.GetKeyDown(KeyCode.D))             // jak zmieniasz E, to w obu miejscach!
            {
                _inputHolder.PlayerInput = PlayerInput.DropCurrentItem;
            }
            else if (KeyDownOrRepeating(KeyCode.Alpha0))
            {
                _uiConfig.TooltipCurrentWeaponPresenter.Present(_gameContext.PlayerActor.ActorData.WeaponWeld, true);
                _uiConfig.TooltipCurrentWeaponPresenter.GetComponent <CurrentWeaponTooltip>().LabelWearingUpper.gameObject.SetActive(true);
            }
            else if (KeyDownOrRepeating(KeyCode.Alpha1))
            {
                SelectItem(0);
            }
            else if (KeyDownOrRepeating(KeyCode.Alpha2))
            {
                SelectItem(1);
            }
            else if (KeyDownOrRepeating(KeyCode.Alpha3))
            {
                SelectItem(2);
            }
            else if (KeyDownOrRepeating(KeyCode.Alpha4))
            {
                SelectItem(3);
            }
            else if (KeyDownOrRepeating(KeyCode.UpArrow) || KeyDownOrRepeating(KeyCode.Keypad8) || KeyDownOrRepeating(KeyCode.I))
            {
                _inputHolder.PlayerInput = PlayerInput.MoveUp;
            }
            else if (KeyDownOrRepeating(KeyCode.LeftArrow) || KeyDownOrRepeating(KeyCode.Keypad4) || KeyDownOrRepeating(KeyCode.J))
            {
                _inputHolder.PlayerInput = PlayerInput.MoveLeft;
            }
            else if (KeyDownOrRepeating(KeyCode.DownArrow) || KeyDownOrRepeating(KeyCode.Keypad2) || KeyDownOrRepeating(KeyCode.K))
            {
                _inputHolder.PlayerInput = PlayerInput.MoveDown;
            }
            else if (KeyDownOrRepeating(KeyCode.RightArrow) || KeyDownOrRepeating(KeyCode.Keypad6) || KeyDownOrRepeating(KeyCode.L))
            {
                _inputHolder.PlayerInput = PlayerInput.MoveRight;
            }
            else if (KeyDownOrRepeating(KeyCode.Keypad7) || KeyDownOrRepeating(KeyCode.U))
            {
                _inputHolder.PlayerInput = PlayerInput.MoveUpLeft;
            }
            else if (KeyDownOrRepeating(KeyCode.Keypad9) || KeyDownOrRepeating(KeyCode.O))
            {
                _inputHolder.PlayerInput = PlayerInput.MoveUpRight;
            }
            else if (KeyDownOrRepeating(KeyCode.Keypad1) || KeyDownOrRepeating(KeyCode.M))
            {
                _inputHolder.PlayerInput = PlayerInput.MoveDownLeft;
            }
            else if (KeyDownOrRepeating(KeyCode.Keypad3) ||
                     (KeyDownOrRepeating(KeyCode.Period) && !Input.GetKey(KeyCode.LeftShift) && !Input.GetKey(KeyCode.RightShift))
                     )
            {
                _inputHolder.PlayerInput = PlayerInput.MoveDownRight;
            }
        }
Beispiel #3
0
        public IGameAction GetAction(ActorData actorData)
        {
            if (_inputHolder.PlayerInput == PlayerInput.None)
            {
                return(null);
            }

            if (_inputHolder.PlayerInput != PlayerInput.UseCurrentItem && _inputHolder.PlayerInput != PlayerInput.DropCurrentItem)
            {
                _uiConfig.ItemHolder.DeselectItem();
                _uiConfig.TooltipPresenter.Panel.gameObject.SetActive(false);
                _uiConfig.TooltipCurrentWeaponPresenter.gameObject.SetActive(false);
                _uiConfig.TooltipCurrentWeaponPresenter.GetComponent <CurrentWeaponTooltip>().LabelWearingUpper.gameObject.SetActive(false);
                var quitButton = GameObject.FindGameObjectWithTag("button_quit");
                if (quitButton != null)
                {
                    quitButton.SetActive(false);
                }
            }
            if (_uiConfig.WalkAbilityButton.GetComponentInChildren <Text>() != null)
            {
                _uiConfig.WalkAbilityButton.GetComponentInChildren <Text>().gameObject.SetActive(false);
            }
            if (_uiConfig.DaringBlowAbilityButton.GetComponentInChildren <Text>() != null)
            {
                _uiConfig.DaringBlowAbilityButton.GetComponentInChildren <Text>().gameObject.SetActive(false);
            }
            if (_uiConfig.PushAbilityButton.GetComponentInChildren <Text>() != null)
            {
                _uiConfig.PushAbilityButton.GetComponentInChildren <Text>().gameObject.SetActive(false);
            }

            IGameAction gameActionToReturn;

            if (_inputHolder.PlayerInput == PlayerInput.PickUp)
            {
                IList <ItemData> items            = _entityDetector.DetectItems(actorData.LogicalPosition).ToList();
                bool             allSlotsOccupied = _uiConfig.ItemHolder.Items.All(i => i != null);
                if (!items.Any() || allSlotsOccupied)
                {
                    return(null);
                }
                ItemData itemToPickUp = items.First();
                _inputHolder.PlayerInput = PlayerInput.None;
                return(_actionFactory.CreatePickUpAction(actorData, itemToPickUp));
            }

            if (_inputHolder.PlayerInput == PlayerInput.Drop)
            {
                ItemData firstItem = actorData.Items.FirstOrDefault();
                if (firstItem == null)
                {
                    return(null);
                }
                _inputHolder.PlayerInput = PlayerInput.None;
                return(_actionFactory.CreateDropAction(actorData, firstItem));
            }
            if (_inputHolder.PlayerInput == PlayerInput.Catch)
            {
                ActorData caughtActor = _entityDetector.DetectActors(actorData.LogicalPosition, 1).FirstOrDefault();
                if (caughtActor == null)
                {
                    return(null);
                }
                _inputHolder.PlayerInput = PlayerInput.None;
                return(_actionFactory.CreateCatchAction(actorData, caughtActor));
            }
            if (_inputHolder.PlayerInput == PlayerInput.Release)
            {
                if (actorData.CaughtActor == null)
                {
                    return(null);
                }
                _inputHolder.PlayerInput = PlayerInput.None;
                return(_actionFactory.CreateReleaseAction(actorData));
            }
            if (_inputHolder.PlayerInput == PlayerInput.Pass)
            {
                _inputHolder.PlayerInput = PlayerInput.None;
                return(_actionFactory.CreatePassAction(actorData));
            }
            if (_inputHolder.PlayerInput == PlayerInput.Eat)
            {
                _inputHolder.PlayerInput = PlayerInput.None;
                ItemData foodAtFeet = _entityDetector.DetectItems(actorData.LogicalPosition).FirstOrDefault(i => i.ItemType == ItemType.DeadBody);
                if (foodAtFeet == null)
                {
                    return(null);
                }
                return(_actionFactory.CreateEatAction(actorData, foodAtFeet));
            }
            if (_inputHolder.PlayerInput == PlayerInput.UseCurrentItem)
            {
                _inputHolder.PlayerInput = PlayerInput.None;
                ItemDefinition item;
                item = _uiConfig.ItemHolder.CurrentItem();
                if (item == null)
                {
                    ItemData itemAtFeet = _entityDetector.DetectItems(actorData.LogicalPosition).FirstOrDefault();
                    if (itemAtFeet != null)
                    {
                        item = itemAtFeet.ItemDefinition;
                        return(_actionFactory.CreateUseItemAction(actorData, item, false));
                    }
                    return(null);
                }
                return(_actionFactory.CreateUseItemAction(actorData, item, true));
            }
            if (_inputHolder.PlayerInput == PlayerInput.DropCurrentItem)
            {
                _inputHolder.PlayerInput = PlayerInput.None;
                ItemDefinition item = _uiConfig.ItemHolder.CurrentItem();
                if (item == null)
                {
                    return(null);
                }

                return(_actionFactory.CreateDropItemAction(actorData, item));
            }
            if (_inputHolder.PlayerInput == PlayerInput.Ascend)
            {
                TileBase stairsDown = Resources.Load <TileBase>("Tiles/Environment/Stairs_down");

                _inputHolder.PlayerInput = PlayerInput.None;
                Vector2Int playerPosition     = _gameContext.PlayerActor.ActorData.LogicalPosition;
                TileBase   envTileBelowPlayer = _gameContext.EnvironmentTilemap.GetTile(playerPosition.ToVector3Int());
                if (envTileBelowPlayer != null && envTileBelowPlayer != stairsDown)
                {
                    return(_actionFactory.CreateAscendAction(actorData));
                }
                return(null);
            }
            Vector2Int actionVector   = GetActionVector(_inputHolder.PlayerInput);
            Vector2Int targetPosition = actionVector + actorData.LogicalPosition;

            if (_inputHolder.PlayerInputModifier == PlayerInputModifier.Move)
            {
                _inputHolder.PlayerInputModifier = PlayerInputModifier.None;
                _inputHolder.PlayerInput         = PlayerInput.None;
                _arrowsVisibilityManager.Hide();

                IEnumerable <ActorData> actorsAtTarget = _entityDetector.DetectActors(targetPosition);
                if (actorsAtTarget.Any())
                {
                    return(null);
                }
                gameActionToReturn = _actionFactory.CreateMoveAction(actorData, actionVector);
                return(gameActionToReturn);
            }
            bool isAggressiveAttack = false;

            if (_inputHolder.PlayerInputModifier == PlayerInputModifier.DaringBlow)
            {
                isAggressiveAttack = true;
                _inputHolder.PlayerInputModifier = PlayerInputModifier.None;
                _inputHolder.PlayerInput         = PlayerInput.None;
                _weaponColorizer.Decolorize((actorData.Entity as ActorBehaviour).WeaponAnimator);
            }

            IList <Vector2Int> targetPositionsCone = Vector2IntUtilities.GetCone(actionVector)
                                                     .Select(zeroBasedPosition => actorData.LogicalPosition + zeroBasedPosition)
                                                     .ToList();
            IList <ActorData> actorsCloseToCone = _entityDetector.DetectActors(targetPosition, 2).ToList();

            ActorData targetActor;
            ActorData actorAtTargetPosition = actorsCloseToCone.FirstOrDefault(a => a.LogicalPosition == targetPosition);

            if (actorAtTargetPosition != null && actorAtTargetPosition.Team == actorData.Team)
            {
                _inputHolder.PlayerInput = PlayerInput.None;
                gameActionToReturn       = _actionFactory.CreateDisplaceAction(actorData, actorAtTargetPosition);
                return(gameActionToReturn);
            }

            bool isPushing = _inputHolder.PlayerInputModifier == PlayerInputModifier.Push;

            _arrowsVisibilityManager.Hide();
            _inputHolder.PlayerInputModifier = PlayerInputModifier.None;
            if ((actorAtTargetPosition != null || isPushing) || actorData.WeaponWeld.WeaponDefinition.AllowsFarCombat == false)
            {
                targetActor = actorAtTargetPosition;
            }
            else
            {
                targetActor = actorsCloseToCone
                              .FirstOrDefault(potentialTarget => potentialTarget.Team != actorData.Team &&
                                              targetPositionsCone.Contains(potentialTarget.LogicalPosition) &&
                                              _clearWayBetweenTwoPointsDetector.ClearWayExists(actorData.LogicalPosition, potentialTarget.LogicalPosition));
            }

            if (targetActor != null)            // hit!
            {
                gameActionToReturn = isPushing
                                        ? _actionFactory.CreatePushAction(actorData, targetActor)
                                        : _actionFactory.CreateAttackAction(actorData, targetActor, isAggressiveAttack);
            }
            else
            {
                TileBase wallTileAtTarget = _gameContext.WallsTilemap.GetTile(targetPosition.ToVector3Int());
                if (wallTileAtTarget != null)
                {
                    _heavyDoorsHClosedTile = Resources.Load <Tile>("Tiles/Environment/doors_HEAVY_0");
                    _heavyDoorsVClosedTile = Resources.Load <Tile>("Tiles/Environment/doors_HEAVY_2");
                    if ((wallTileAtTarget == _heavyDoorsHClosedTile || wallTileAtTarget == _heavyDoorsVClosedTile) &&
                        _uiConfig.ItemHolder.Items.Where(i => i != null).All(i => i.Name != "Key") &&
                        _gameContext.PlayerActor.ActorData.WeaponWeld.Name != "Key")
                    {
                        // bump
                        gameActionToReturn = _actionFactory.CreateMoveAction(actorData, actionVector);
                        _textEffectPresenter.ShowTextEffect(actorData.LogicalPosition, "Umph! Locked!", Color.yellow);
                    }
                    else
                    {
                        var doorsHClosedTile = Resources.Load <Tile>("Tiles/Environment/doors_H_closed");
                        var doorsVClosedTile = Resources.Load <Tile>("Tiles/Environment/doors_V_closed");

                        if (wallTileAtTarget == doorsHClosedTile || wallTileAtTarget == doorsVClosedTile)
                        {
                            bool isHorizontal = wallTileAtTarget == doorsHClosedTile;
                            gameActionToReturn = _actionFactory.CreateOpenDoorAction(actorData, targetPosition, isHorizontal);
                        }
                        else if (wallTileAtTarget == _heavyDoorsHClosedTile || wallTileAtTarget == _heavyDoorsVClosedTile)
                        {
                            bool isHorizontal = wallTileAtTarget == _heavyDoorsHClosedTile;
                            gameActionToReturn = _actionFactory.CreateOpenDoorAction(actorData, targetPosition, isHorizontal, true);
                        }
                        else
                        {
                            gameActionToReturn = _actionFactory.CreateMoveAction(actorData, actionVector);
                        }
                    }
                }
                else
                {
                    gameActionToReturn = _actionFactory.CreateMoveAction(actorData, actionVector);
                }
            }
            _inputHolder.PlayerInput = PlayerInput.None;
            return(gameActionToReturn);
        }