コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: TacticalActions.cs プロジェクト: ivasylyev/AI
        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);
        }