#region Copyright & License Information /* * Copyright 2007-2021 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. For more * information, see COPYING. */ #endregion using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.Common { public enum BuildingType { Building, Defense, Refinery } public enum WaterCheck { NotChecked, EnoughWater, NotEnoughWater, DontCheck } public static class AIUtils { public static bool IsAreaAvailable(World world, Player player, Map map, int radius, HashSet terrainTypes) { var cells = world.ActorsHavingTrait().Where(a => a.Owner == player); // TODO: Properly check building foundation rather than 3x3 area. return cells.Select(a => map.FindTilesInCircle(a.Location, radius) .Count(c => map.Contains(c) && terrainTypes.Contains(map.GetTerrainInfo(c).Type) && Util.AdjacentCells(world, Target.FromCell(world, c)) .All(ac => map.Contains(ac) && terrainTypes.Contains(map.GetTerrainInfo(ac).Type)))) .Any(availableCells => availableCells > 0); } public static IEnumerable FindQueues(Player player, string category) { return player.World.ActorsWithTrait() .Where(a => a.Actor.Owner == player && a.Trait.Info.Type == category && a.Trait.Enabled) .Select(a => a.Trait); } public static IEnumerable GetActorsWithTrait(World world) { return world.ActorsHavingTrait(); } public static int CountActorsWithTrait(string actorName, Player owner) { return GetActorsWithTrait(owner.World).Count(a => a.Owner == owner && a.Info.Name == actorName); } public static int CountActorByCommonName(HashSet commonNames, Player owner) { return owner.World.Actors.Count(a => !a.IsDead && a.Owner == owner && commonNames.Contains(a.Info.Name)); } public static int CountBuildingByCommonName(HashSet buildings, Player owner) { return GetActorsWithTrait(owner.World) .Count(a => a.Owner == owner && buildings.Contains(a.Info.Name)); } public static List FindEnemiesByCommonName(HashSet commonNames, Player player) { return player.World.Actors.Where(a => !a.IsDead && player.RelationshipWith(a.Owner) == PlayerRelationship.Enemy && commonNames.Contains(a.Info.Name)).ToList(); } public static ActorInfo GetInfoByCommonName(HashSet names, Player owner) { return owner.World.Map.Rules.Actors.Where(k => names.Contains(k.Key)).Random(owner.World.LocalRandom).Value; } public static void BotDebug(string s, params object[] args) { if (Game.Settings.Debug.BotDebug) TextNotificationsManager.Debug(s, args); } } }