public virtual void Update(TimeSpan dt, List <Direction> limiters, ControllerState controller) { Limiters = limiters; C = controller; bool canMoveDown = !limiters.Contains(Direction.Down); bool canMoveUp = !limiters.Contains(Direction.Up); bool canMoveLeft = !limiters.Contains(Direction.Right); bool canMoveRight = !limiters.Contains(Direction.Left); bool cs1 = false; bool cs2 = false; bool cs3 = false; bool cs4 = false; if (Confused) { cs1 = Extensions.RandomBool(); cs2 = Extensions.RandomBool(); cs3 = Extensions.RandomBool(); cs4 = Extensions.RandomBool(); } _currentMovement = Movement.Idle; HealthBar.Value = Health; #region Vibrating Health if (_vibratingHealth) { if (Extensions.GetMS() - _lastVibrateTime > Health + 200) { _lastVibrateTime = Extensions.GetMS(); _lastVibrateStarted = Extensions.GetMS(); controller.StartVibrate(0.7f, 0.7f); } if (Extensions.GetMS() - _lastVibrateStarted > 100) { controller.StopVibrate(); } } #endregion #region Satus Updates if (Stunned && Extensions.GetMS() - _lastStunTime > _stunDuration) { Stunned = false; } if (Confused && Extensions.GetMS() - _lastConfuseTime > _confuseDuration) { Confused = false; } if (Extensions.GetMS() - _lastManaGain > _manaGainDelay) { if (Mana < 5) { Mana += 1; } } #endregion #region Physics if (canMoveDown && !Flying && !Dead) { Position.Y += (int)_gravityAcceleration; if (Program.Game.InsideWall(this) != null) { Position.Y -= (int)_gravityAcceleration; _gravityAcceleration = Program.Game.Gravity * 5; Jumping = false; } _gravityAcceleration += Program.Game.Gravity; _currentMovement = _gravityAcceleration > JumpStrength ? Movement.Fall : Movement.Jump; } else { _gravityAcceleration = 0; Jumping = false; } #endregion #region Controller Input if (controller.IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.LeftShoulder)) { Health -= 10; if (Health < 0) { Health = 0; } } else { if (Health > MaxHealth) { Health = MaxHealth; } } if (!ActionLocked) { if ((controller.WasButtonPressed(Microsoft.Xna.Framework.Input.Buttons.A)) && !Stunned && !Dead) { if (!Jumping) { Jumping = true; } } if (Jumping && !Flying && !Dead) { if (canMoveUp) { Position.Y -= JumpStrength; if (Program.Game.InsideWall(this) != null) { Position.Y += JumpStrength; Jumping = false; } } else { Jumping = false; } } if (($"{C.LeftThumbstickDirection}".Contains("Right") || cs1) && canMoveRight && !Stunned && !Dead) { Position.X += Speed; FacingDirection = Direction.Right; if (!FlipLocked) { FlipHorizontally = false; } if (!canMoveDown) { _currentMovement = Movement.Walk; } } if (($"{C.LeftThumbstickDirection}".Contains("Left") || cs2) && canMoveLeft && !Stunned && !Dead) { Position.X -= Speed; FacingDirection = Direction.Left; if (!FlipLocked) { FlipHorizontally = true; } if (!canMoveDown) { _currentMovement = Movement.Walk; } } if (Flying) { if ($"{C.LeftThumbstickDirection}".Contains("Up") && canMoveUp && !Stunned && !Dead) { Position.Y -= Speed; } if ($"{C.LeftThumbstickDirection}".Contains("Down") && canMoveDown && !Stunned && !Dead) { Position.Y += Speed; } } if (controller.WasButtonPressed(Microsoft.Xna.Framework.Input.Buttons.B) && !Stunned && !Dead && Mana >= Ability1Cost) { Mana -= Ability1Cost; Ability1(); } if (controller.WasButtonPressed(Microsoft.Xna.Framework.Input.Buttons.X) && !Stunned && !Dead && Mana >= Ability2Cost) { Mana -= Ability2Cost; Ability2(); } if (controller.WasButtonPressed(Microsoft.Xna.Framework.Input.Buttons.Y) && !Stunned && !Dead && Mana >= Ability3Cost) { Mana -= Ability3Cost; Ability3(); } if (controller.IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.LeftShoulder) && controller.IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.RightShoulder) && UltimatePercent == 1.0 && !Stunned && !Dead) { UltimatePercent = 1.0; Ultimate(); } if (controller.RightTriggerPower > 0 && !Stunned && !Dead) { var tms = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; if (tms - _lastShotTime > ShotInterval) { Shoot(); _lastShotTime = tms; } } } #endregion #region Movement Animation if (MovementAnimated) { if (_lastMovement != _currentMovement) { //switch to current movement animation switch (_currentMovement) { case Movement.Idle: HardSetAnimation(IdleAnimation); break; case Movement.Fall: HardSetAnimation(FallAnimation); break; case Movement.Jump: HardSetAnimation(JumpAnimation); break; case Movement.Walk: HardSetAnimation(WalkAnimation); break; } } } #endregion _previousPosition = Position; _lastMovement = _currentMovement; }