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."); }
public void MissileLaunchAndMovement() { Player player1 = new Player(); player1.Name = "Player1"; Player player2 = new Player(); player2.Name = "Player2"; Group group1 = new Group(); Group group2 = new Group(); GameManager.Instance.GameData.InitAllData(); Game game = GameManager.Instance.CreateGame(player1, "test game"); GameManager.Instance.Game.UpperLeftCorner = new Coordinate(70, -10); GameManager.Instance.Game.LowerRightCorner = new Coordinate(40, 10); game.AddPlayer(player2); Position pos1 = new Position(60, 3, 0, 70 + 180); Position pos2 = pos1.Offset(new PositionOffset(1800, 1780)); BaseUnit unitNansen = GameManager.Instance.GameData.CreateUnit(player1, group1, "fridtjofnansen", "Nansen", pos1, true); AircraftUnit helo = unitNansen.AircraftHangar.Aircraft.First <AircraftUnit>(); unitNansen.LaunchAircraft(new List <AircraftUnit> { helo }, string.Empty, "", null, ""); helo.SetSensorsActivePassive(GameConstants.SensorType.Radar, true); BaseUnit unitEnemyBurke = GameManager.Instance.GameData.CreateUnit(player2, group2, "arleighburke", "Enemy Burke", pos2, true); unitNansen.SensorSweep(); helo.SensorSweep(); Assert.IsTrue(player1.DetectedUnits.Count == 1, "Player1 should have detected one unit."); DetectedUnit enemyUnit = player1.DetectedUnits[0]; enemyUnit.FriendOrFoeClassification = GameConstants.FriendOrFoe.Foe; var engagementOrder = new EngagementOrder(enemyUnit, GameConstants.EngagementOrderType.EngageNotClose); engagementOrder.WeaponClassId = "nsm"; unitNansen.Orders.Enqueue(engagementOrder); unitNansen.ExecuteOrders(); MissileUnit missile = (MissileUnit)player1.Units.First <BaseUnit>(u => u.UnitClass.IsMissileOrTorpedo); double OldDistance = MapHelper.CalculateDistanceM( unitEnemyBurke.Position.Coordinate, missile.Position.Coordinate); double distanceM = 0; int iterations = 0; do { iterations++; missile.MoveToNewCoordinate(100); var heightM = missile.Position.HeightOverSeaLevelM; distanceM = MapHelper.CalculateDistanceM( unitEnemyBurke.Position.Coordinate, missile.Position.Coordinate); if (distanceM < 5000) { GameManager.Instance.Log.LogDebug(string.Format( "MissileLaunchAndMovement test: {0} at pos {1} ** distanceM={2} FuelM={3}", missile, missile.Position, Math.Round(distanceM, 0), Math.Round(missile.FuelDistanceRemainingM, 0))); } } while (distanceM > GameConstants.DISTANCE_TO_TARGET_IS_HIT_M * 2 && !missile.IsMarkedForDeletion); double newDistance = MapHelper.CalculateDistanceM( unitEnemyBurke.Position.Coordinate, missile.Position.Coordinate); Assert.IsTrue(newDistance < OldDistance, "Missile should have moved closer to target."); Assert.IsTrue(newDistance < 200, "Missile should be closer to target than 200m"); }