public void CloseAndEngageTest() { Player player = new Player(); player.Name = "GoodGuy"; player.IsComputerPlayer = true; Player playerEnemy = new Player(); playerEnemy.Name = "BadGuy"; playerEnemy.IsComputerPlayer = true; Group group1 = new Group(); Group group2 = new Group(); GameManager.Instance.GameData.InitAllData(); Game game = GameManager.Instance.CreateGame(player, "test game"); game.Players.Add(player); game.Players.Add(playerEnemy); GameManager.Instance.Game.SetAllPlayersEnemies(); Position pos1 = new Position(60, 3, 0, 120); BaseUnit unitBurke = GameManager.Instance.GameData.CreateUnit(player, group1, "arleighburke", "DDG Valiant", pos1, true); unitBurke.SetSensorsActivePassive(GameConstants.SensorType.Sonar, true); unitBurke.UserDefinedSpeed = GameConstants.UnitSpeedType.Crawl; Coordinate NextDoor = MapHelper.CalculateNewPosition2(unitBurke.Position.Coordinate, 45, 1000); Position NextDoorPos = new Position(NextDoor); NextDoorPos.HeightOverSeaLevelM = 0; NextDoorPos.SetNewBearing(130); Group grpEnemy = new Group(); BaseUnit unitEnemyBurke = GameManager.Instance.GameData.CreateUnit( playerEnemy, grpEnemy, "arleighburke", "DDG Vicious", NextDoorPos, true); var subPos = pos1.Offset(4, 1100); subPos.HeightOverSeaLevelM = -40; var unitEnemySub = GameManager.Instance.GameData.CreateUnit( playerEnemy, null, "lada", "Lada sub", subPos, true); Position pos2 = NextDoorPos.Offset(90, 120000); pos2.BearingDeg = 90; BaseUnit unitF22 = GameManager.Instance.GameData.CreateUnit(player, group2, "f22", "F22-AA", pos2, true); unitF22.SetWeaponLoad("Naval strike"); unitF22.UserDefinedSpeed = TTG.NavalWar.NWComms.GameConstants.UnitSpeedType.Slow; var weaponHarpoons = unitF22.Weapons.Where <BaseWeapon>(w => w.WeaponClass.Id == "jassmer"); var weaponHarpoon = weaponHarpoons.First <BaseWeapon>(); Assert.IsNotNull(weaponHarpoon, "JASSM-ER weapon should be found on F22"); foreach (var wpn in unitBurke.Weapons) { wpn.AmmunitionRemaining = 0; } foreach (var wpn in unitEnemyBurke.Weapons) { wpn.AmmunitionRemaining = 0; } pos2 = NextDoorPos.Offset(90, weaponHarpoon.WeaponClass.MaxWeaponRangeM + 5000); pos2.BearingDeg = 90; unitF22.Position = pos2.Clone(); game.IsNetworkEnabled = false; var gameTimeStartUp = GameManager.Instance.Game.GameCurrentTime; GameManager.Instance.Game.RunGameInSec = 1; GameManager.Instance.Game.StartGamePlay(); var gameTimeAfter = GameManager.Instance.Game.GameCurrentTime; var gameTimeElapsed = gameTimeAfter.Subtract(gameTimeStartUp); //Assert.IsTrue(Math.Abs(gameTimeElapsed.TotalSeconds - 20.0) < 0.01, "10 seconds of gametime should have elapsed."); //different on 32 and 64-bit! Assert.IsTrue(unitF22.CurrentWeaponLoadName.ToLower() == "naval strike", "F22 should be set for naval strike"); var detectedEnemyShip = player.DetectedUnits.FirstOrDefault <DetectedUnit>(u => u.DomainType == GameConstants.DomainType.Surface); var detectedEnemySub = player.DetectedUnits.FirstOrDefault <DetectedUnit>(u => u.DomainType == GameConstants.DomainType.Subsea); var detectedMyUnit = playerEnemy.DetectedUnits[0]; Assert.IsNotNull(detectedEnemyShip, "Enemy should have been detected."); Assert.IsNotNull(detectedMyUnit, "Enemy should have detected my unit."); Assert.IsNotNull(detectedEnemySub, "Enemy sub should have been detected."); detectedEnemyShip.FriendOrFoeClassification = GameConstants.FriendOrFoe.Foe; detectedEnemySub.FriendOrFoeClassification = GameConstants.FriendOrFoe.Foe; foreach (var wpn in unitBurke.Weapons) //rearm again { wpn.AmmunitionRemaining = wpn.MaxAmmunition; } var allWeaponStatuses = unitBurke.GetAllWeaponEngagementStatuses("", detectedEnemySub); var bestWeaponSub = unitBurke.GetBestAvailableWeapon("", detectedEnemySub, false); Assert.IsNotNull(bestWeaponSub, "A best weapon to target sub should be found."); Assert.IsTrue(bestWeaponSub.EngagementStatusResult == GameConstants.EngagementStatusResultType.ReadyToEngage, "ASW weapon should be ready to engage."); double distanceBefore = MapHelper.CalculateDistance3DM(unitF22.Position, detectedEnemyShip.Position); bool hasAnyEngagementOrders = unitF22.HasAnyEngagementOrders(); Assert.IsTrue(!hasAnyEngagementOrders, "Should NOT have engagement orders"); unitF22.UserDefinedSpeed = TTG.NavalWar.NWComms.GameConstants.UnitSpeedType.Cruise; EngagementOrder order = new EngagementOrder( detectedEnemyShip, TTG.NavalWar.NWComms.GameConstants.EngagementOrderType.CloseAndEngage); unitF22.Orders.Enqueue(order); unitF22.ExecuteOrders(); hasAnyEngagementOrders = unitF22.HasAnyEngagementOrders(); //bool hasSpecificEngOrder = unitF22.HasAnyEngagementOrders(detectedEnemyShip); Assert.IsTrue(hasAnyEngagementOrders, "Should have engagement orders"); //Assert.IsTrue(hasSpecificEngOrder, "Should have engagement orders"); unitF22.EngageDetectedUnit( detectedEnemyShip, TTG.NavalWar.NWComms.GameConstants.EngagementOrderType.CloseAndEngage, true); GameManager.Instance.Game.RunGameInSec = 1; GameManager.Instance.Game.IsGameLoopStarted = false; GameManager.Instance.Game.StartGamePlay(); double distanceAfter = MapHelper.CalculateDistance3DM(unitF22.Position, detectedEnemyShip.Position); Assert.IsTrue(distanceBefore > distanceAfter, "F22 should have closed the distance."); GameManager.Instance.Game.RealTimeCompressionFactor = 1; //var engageOrder = unitF22.MovementOrder.GetActiveWaypoint().Orders[0]; //Assert.IsNotNull(engageOrder, "F22 should have an order in waypoint"); //var engageOrderAsEngage = engageOrder as EngagementOrder; //Assert.IsNotNull(engageOrderAsEngage, "F22 order should be engagementorder"); //Assert.IsTrue(engageOrderAsEngage.TargetDetectedUnit.Id == detectedEnemy.Id, // "Enemy target should be in wp order."); var bestWpnF22 = unitF22.GetUnitEngagementStatus("", detectedEnemyShip, true); foreach (var wpn in unitBurke.Weapons) { wpn.AmmunitionRemaining = wpn.WeaponClass.MaxAmmunition; } foreach (var wpn in unitEnemyBurke.Weapons) { wpn.AmmunitionRemaining = wpn.WeaponClass.MaxAmmunition; } var bestWpnBurke = unitBurke.GetUnitEngagementStatus("", detectedEnemyShip, false); var allWpnStatusesBurke = unitBurke.GetAllWeaponEngagementStatuses("", detectedEnemyShip); var allWpnStatusesF22 = unitF22.GetAllWeaponEngagementStatuses("", detectedEnemyShip); var allWpnStatusesEnemyBurke = unitEnemyBurke.GetAllWeaponEngagementStatuses("", detectedMyUnit); Assert.IsTrue(bestWpnF22.Weapon.CanTargetDetectedUnit(detectedEnemyShip, true), "Selected weapon should be able to target enemy"); Assert.IsTrue(bestWpnBurke.Weapon.CanTargetDetectedUnit(detectedEnemyShip, true), "Selected weapon should be able to target enemy"); // Assert.IsTrue(bestWpnF22.WeaponCanBeUsedAgainstTarget, "Can be used against target"); Assert.IsTrue(bestWpnBurke.WeaponCanBeUsedAgainstTarget, "Can be used against target"); //GameManager.Instance.Game.RealTimeCompressionFactor = 100; //GameManager.Instance.Game.RunGameInSec = 8; //GameManager.Instance.Game.IsGameLoopStarted = false; //GameManager.Instance.Game.StartGamePlay(); //double distanceAfterLast = MapHelper.CalculateDistance3DM(unitF22.Position, detectedEnemy.Position); ////Assert.IsTrue(distanceAfterLast < distanceAfter, "F22 should have closed the distance even further."); //Assert.IsTrue(detectedEnemy.IsFiredUpon, "Enemy should have been fired upon!"); //var missiles = player.Units.Where<BaseUnit>(u => u.UnitClass.IsMissileOrTorpedo); //Assert.IsTrue(missiles.Count<BaseUnit>() > 0, "At least one missile should exist."); }