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)); } }
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; } }
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); }