예제 #1
0
        void TryToRushAttack(IBot bot)
        {
            // Note that Rush Squad is almost the same as Assuslt Squad at present.
            // The meaning of this squad now is not rushing everything to a basebuilder with bugs,
            // instead, it keeps two squads at bay which is isolated to each other for a bot player,
            // and performance friendly, while Rush Squad tend to aimming at basebuilder.
            var randomizedSquadSize = Info.SquadSize + World.LocalRandom.Next(Info.SquadSizeRandomBonus);

            if (unitsHangingAroundTheBase.Count >= randomizedSquadSize)
            {
                var attackForce = RegisterNewSquad(bot, SquadTypeCA.Rush);

                foreach (var a in unitsHangingAroundTheBase)
                {
                    if (!a.Info.HasTraitInfo <AircraftInfo>() && !Info.NavalUnitsTypes.Contains(a.Info.Name))
                    {
                        attackForce.Units.Add(a);
                    }
                }
                var enemybase = AIUtils.FindEnemiesByCommonName(Info.ConstructionYardTypes, Player).Random(World.LocalRandom);
                attackForce.TargetActor = enemybase;

                unitsHangingAroundTheBase.Clear();
                foreach (var n in notifyIdleBaseUnits)
                {
                    n.UpdatedIdleBaseUnits(unitsHangingAroundTheBase);
                }
            }
        }
예제 #2
0
        void TryToRushAttack(IBot bot)
        {
            var allEnemyBaseBuilder = AIUtils.FindEnemiesByCommonName(Info.ConstructionYardTypes, Player);

            // TODO: This should use common names & ExcludeFromSquads instead of hardcoding TraitInfo checks
            var ownUnits = activeUnits
                           .Where(unit => unit.IsIdle && unit.Info.HasTraitInfo <AttackBaseInfo>() &&
                                  !unit.Info.HasTraitInfo <AircraftInfo>() && !Info.NavalUnitsTypes.Contains(unit.Info.Name) && !unit.Info.HasTraitInfo <HarvesterInfo>()).ToList();

            if (!allEnemyBaseBuilder.Any() || ownUnits.Count < Info.SquadSize)
            {
                return;
            }

            foreach (var b in allEnemyBaseBuilder)
            {
                // Don't rush enemy aircraft!
                var enemies = World.FindActorsInCircle(b.CenterPosition, WDist.FromCells(Info.RushAttackScanRadius))
                              .Where(unit => IsEnemyUnit(unit) && unit.Info.HasTraitInfo <AttackBaseInfo>() && !unit.Info.HasTraitInfo <AircraftInfo>() && !Info.NavalUnitsTypes.Contains(unit.Info.Name)).ToList();

                if (AttackOrFleeFuzzyCA.Rush.CanAttack(ownUnits, enemies))
                {
                    var target = enemies.Any() ? enemies.Random(World.LocalRandom) : b;
                    var rush   = GetSquadOfType(SquadTypeCA.Rush);
                    if (rush == null)
                    {
                        rush = RegisterNewSquad(bot, SquadTypeCA.Rush, target);
                    }

                    foreach (var a3 in ownUnits)
                    {
                        var protectSq = GetSquadOfType(SquadTypeCA.Protection);
                        if (protectSq != null)
                        {
                            protectSq.Units.Remove(a3);
                        }

                        rush.Units.Add(a3);
                    }

                    return;
                }
            }
        }
예제 #3
0
        void TryToRushAttack(IBot bot)
        {
            var allEnemyBaseBuilder = AIUtils.FindEnemiesByCommonName(Info.ConstructionYardTypes, Player);

            var ownUnits = activeUnits
                           .Where(unit => unit.IsIdle && unit.Info.HasTraitInfo <AttackBaseInfo>() &&
                                  !Info.AirUnitsTypes.Contains(unit.Info.Name) && !Info.NavalUnitsTypes.Contains(unit.Info.Name) && !Info.ExcludeFromSquadsTypes.Contains(unit.Info.Name)).ToList();

            if (!allEnemyBaseBuilder.Any() || ownUnits.Count < Info.SquadSize)
            {
                return;
            }

            foreach (var b in allEnemyBaseBuilder)
            {
                // Don't rush enemy aircraft!
                var enemies = World.FindActorsInCircle(b.CenterPosition, WDist.FromCells(Info.RushAttackScanRadius))
                              .Where(unit => IsPreferredEnemyUnit(unit) && unit.Info.HasTraitInfo <AttackBaseInfo>() && !Info.AirUnitsTypes.Contains(unit.Info.Name) && !Info.NavalUnitsTypes.Contains(unit.Info.Name)).ToList();

                if (AttackOrFleeFuzzy.Rush.CanAttack(ownUnits, enemies))
                {
                    var target = enemies.Any() ? enemies.Random(World.LocalRandom) : b;
                    var rush   = GetSquadOfType(SquadType.Rush);
                    if (rush == null)
                    {
                        rush = RegisterNewSquad(bot, SquadType.Rush, target);
                    }

                    foreach (var a3 in ownUnits)
                    {
                        rush.Units.Add(a3);
                    }

                    return;
                }
            }
        }