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); } } }
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; } } }
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; } } }