public override TankUpdate Update(IGameState gameState) { // Pick a random goal to defend if (_goalToDefend == null && gameState.Goals.Count > 0) { var shuffledGoals = gameState.Goals.OrderBy(a => Guid.NewGuid()); _goalToDefend = shuffledGoals.First(); } TankUpdate tankUpdate = new TankUpdate(); if (gameState.Foes.Any() && gameState.Goals.Any()) { if (_targetFoe == null || _targetFoe.Health <= 0) { // Pick a random target var shuffledFoes = gameState.Foes.OrderBy(a => Guid.NewGuid()); _targetFoe = shuffledFoes.First(); } if (_targetFoe != null) { // Target the foe's current location tankUpdate.ShotTarget = _targetFoe.Center; } // Move toward tower tankUpdate.MovementTarget = LocationProvider.GetLocation(_goalToDefend.X, _goalToDefend.Y); tankUpdate.Bullet = new Bullet { Damage = 200, Freeze = 0, SplashRange = 0 }; } return tankUpdate; }
private void ChangeBulletPower(IFoe foe) { var range = GetDistanceFromTank(foe) + 1; var damage = (int)(2000 / range); var freeze = 0; if (damage < foe.Health) { //damage /= 2; //freeze = damage; freeze = damage - 1; damage = 1; } Bullet = new Bullet { Damage = damage, Freeze = freeze }; }
private double ModifyDistanceByDanger(IFoe foe) { return foe.AbilityType == AbilityType.Healing || foe.AbilityType == AbilityType.RangedHeat ? -100 : 0; }
private void ChangeBulletPower(IFoe foe) { var range = GetDistanceFromTank(foe) + 1; var damage = (int)(1000 / range); Bullet = new Bullet { Damage = damage, Freeze = 0, SplashRange = 0 }; }
protected double GetTimeToGoal(IFoe foe, List<IGoal> goals) { var minDistance = double.MaxValue; foreach (var goal in goals) { var xDistance = (goal.X + goal.Size.Width) - (foe.X + foe.Size.Width); var yDistance = (goal.Y + goal.Size.Height) - (foe.Y + foe.Size.Height); minDistance = Math.Min(Math.Sqrt(Math.Pow(xDistance, 2) + Math.Pow(yDistance, 2)) / foe.Speed, minDistance); } return minDistance; }