private static void UpdateEnemyFormations() { // будем пересоздавать вражеские формации не каждый тик, а то посядем по быстродействию. if (Global.World.TickIndex % 10 == 0) { var allEnemyTiles = new HashSet <Tile>(); var formations = new List <List <Tile> >(); foreach (var tile in Global.DetailMap.Tiles) { if (tile.Enemies.Count != 0 && !allEnemyTiles.Contains(tile)) { var formationTiles = new List <Tile>(); AddToEnemyFormations(allEnemyTiles, formationTiles, tile); formations.Add(formationTiles); } } Global.EnemyFormations.Clear(); foreach (var formation in formations) { FormationFactory.CreateEnemyFormation(formation); } } foreach (var formation in Global.EnemyFormations) { formation.Update(Global.World.VehicleUpdates); } }
public static bool Attack(MyFormation formation) { var enemyFightersCount = Global.EnemyFighters.Count(); if (formation == Global.MyHelicopters && enemyFightersCount > 30) { var enemyFighters = FormationFactory.CreateEnemyFormation(Global.EnemyFighters); if ((enemyFighters.Rect.RightBottom - enemyFighters.Rect.LeftTop).Length() < 300) { MyFormation foundAllyGround = null; if (Global.MyIfvs.Alive && Global.MyIfvs.Vehicles.Count > 30) { foundAllyGround = Global.MyIfvs; } else if (Global.MyArrvs.Alive && Global.MyArrvs.Vehicles.Count > 30) { foundAllyGround = Global.MyArrvs; } if (foundAllyGround != null) { var actionMove = formation.MoveCenterTo(Global.MyIfvs.Center); AbortAndAddToExecutingSequence(formation, actionMove); return(true); } } } if (formation == Global.MyFighters) { if (enemyFightersCount > 10) { var enemy = FormationFactory.CreateEnemyFormation(Global.EnemyFighters); var enemyLength = (enemy.Rect.RightBottom - enemy.Rect.LeftTop).Length(); if (enemyLength < 200) { MakeAttackOrder(formation, enemy, true); return(true); } } if (Global.EnemyHelicopters.Count() > 10) { var enemy = FormationFactory.CreateEnemyFormation(Global.EnemyHelicopters); var enemyLength = (enemy.Rect.RightBottom - enemy.Rect.LeftTop).Length(); if (enemyLength < 300) { MakeAttackOrder(formation, enemy, true); return(true); } } // if (Global.MyArrvs.Alive && Global.MyArrvs.Vehicles.Count > 30) // { // var actionMove = formation.MoveCenterTo(Global.MyArrvs.Center); // AbortAndAddToExecutingSequence(formation, actionMove); // return true; // } } var oneShotDanger = new Dictionary <EnemyFormation, double>(); foreach (var enemy in Global.EnemyFormations) { var dangerForEnemy = formation.DangerFor(enemy); var dangerForMe = enemy.DangerFor(formation); oneShotDanger.Add(enemy, dangerForEnemy - dangerForMe); } // todo: давать правильную команду // выбирать также по расстоянию EnemyFormation target = null; var targetPair = oneShotDanger.OrderByDescending(kv => kv.Value).First(); if (targetPair.Value > 0) { target = targetPair.Key; } if (target != null) { var targetFacility = Global.World.Facilities .Where(f => f.SelectedAsTargetForGroup == formation.GroupIndex).ToList(); if (targetFacility.Any()) { foreach (var facility in targetFacility) { facility.SelectedAsTargetForGroup = null; } OccupyFacilities(formation); return(true); } MakeAttackOrder(formation, target, false); return(true); } return(false); }
private static bool AirAttack(MyFormation formation) { if (formation != Global.MyHelicopters && formation != Global.MyFighters) { return(false); } if (Global.MyArrvs.Alive && Global.MyArrvs.Vehicles.Count > 10) { var durabilityPercent = formation.Durability / (formation.MaxDurability + 1); if (durabilityPercent < 0.7 || (durabilityPercent < 0.9 && formation.Center.Distance(Global.MyArrvs.Center) < 100)) { if (MoveToAlly(formation, Global.MyArrvs)) { return(true); } } } var enemyFightersCount = Global.EnemyFighters.Count(); if (formation == Global.MyHelicopters) { if (enemyFightersCount > 30) { var enemyFighters = FormationFactory.CreateEnemyFormation(Global.EnemyFighters); var isMyArrvsCanProtect = Global.MyArrvs.Alive && Global.MyArrvs.Vehicles.Count > 30; var distanceToProtection = isMyArrvsCanProtect ? Global.MyArrvs.Rect.Center.Distance(formation.Center) : 0; if ((enemyFighters.Rect.RightBottom - enemyFighters.Rect.LeftTop).Length() < 300 && enemyFighters.Rect.Center.Distance(formation.Center) < distanceToProtection) { MyFormation foundAllyGround = null; if (Global.MyIfvs.Alive && Global.MyIfvs.Vehicles.Count > 30) { foundAllyGround = Global.MyIfvs; } else if (isMyArrvsCanProtect) { foundAllyGround = Global.MyArrvs; } if (foundAllyGround != null) { var actionMove = formation.MoveCenterTo(foundAllyGround.Center); AbortAndAddToExecutingSequence(formation, actionMove); return(true); } } } if (Global.EnemyVehicles.Count == 0) { var actionMove = formation.MoveCenterTo(Global.World.Width / 3 - 100, Global.World.Height / 3); AbortAndAddToExecutingSequence(formation, actionMove); return(true); } } if (formation == Global.MyFighters) { if (enemyFightersCount > 10) { var rect = new Rect(Global.EnemyFighters.Min(f => f.X), Global.EnemyFighters.Min(f => f.Y), Global.EnemyFighters.Max(f => f.X), Global.EnemyFighters.Max(f => f.Y)); var allEnemiesNearFighters = Global.EnemyVehicles.Values.Where(v => v.IsInside(rect)); var enemy = FormationFactory.CreateEnemyFormation(allEnemiesNearFighters); var enemyLength = (enemy.Rect.RightBottom - enemy.Rect.LeftTop).Length(); if (enemyLength < 200) { if (AttackOrRunAway(formation, enemy)) { return(true); } } } if (Global.EnemyHelicopters.Count() > 10) { var rect = new Rect(Global.EnemyHelicopters.Min(f => f.X), Global.EnemyHelicopters.Min(f => f.Y), Global.EnemyHelicopters.Max(f => f.X), Global.EnemyHelicopters.Max(f => f.Y)); var allEnemiesNearHeli = Global.EnemyVehicles.Values.Where(v => v.IsInside(rect)); var enemy = FormationFactory.CreateEnemyFormation(allEnemiesNearHeli); var enemyLength = (enemy.Rect.RightBottom - enemy.Rect.LeftTop).Length(); if (enemyLength < 300) { if (AttackOrRunAway(formation, enemy)) { return(true); } } } if (Global.EnemyVehicles.Count == 0) { var actionMove = formation.MoveCenterTo(Global.World.Width / 2 + 100, Global.World.Height / 2); AbortAndAddToExecutingSequence(formation, actionMove); return(true); } } return(false); }