int MineralsInArea(Map map, uint basePosition, int range, Map.Minerals mineral, Func <Map, uint, Map.FindData> searchFunc, int minDistance = 0) { return(map.FindInArea(basePosition, range, searchFunc, minDistance) .Where(finding => ((KeyValuePair <Map.Minerals, uint>)finding).Key == mineral) .Select(finding => (int)((KeyValuePair <Map.Minerals, uint>)finding).Value).Sum()); }
uint FindSpotWithMinerals(Game game, Player player, int intelligence, Map.Minerals mineral, int maxInArea = int.MaxValue) { // search for minerals near castle, mines and military buildings var buildings = game.GetPlayerBuildings(player).Where(building => building.BuildingType == Building.Type.Castle || building.BuildingType == Building.Type.StoneMine || building.BuildingType == Building.Type.CoalMine || building.BuildingType == Building.Type.IronMine || building.BuildingType == Building.Type.GoldMine || building.BuildingType == Building.Type.Hut || building.BuildingType == Building.Type.Tower || building.BuildingType == Building.Type.Fortress ).ToList(); while (buildings.Count > 0) { var randomBuilding = buildings[game.RandomInt() % buildings.Count]; if (CheckMaxInAreaOk(game.Map, randomBuilding.Position, 9, AIStateFindMinerals.MineTypes[(int)mineral - 1], maxInArea)) { if (MineralsInArea(game.Map, randomBuilding.Position, 9, mineral, FindMineral, 1) > 0) { // 5 tries per spot for (int i = 0; i < 5; ++i) { var spot = FindSpotNear(game, player, randomBuilding.Position, 9); if (game.Map.GetResourceType(spot) == mineral) { return(spot); } } } } buildings.Remove(randomBuilding); } return(Global.INVALID_MAPPOS); }
protected override void ReadFrom(Game game, AI ai, string name, SaveReaderText reader) { base.ReadFrom(game, ai, name, reader); mineralType = reader.Value($"{name}.mineral_type").ReadEnum <Map.Minerals>(); }
public AIStateFindMinerals(Map.Minerals mineralType) : base(AI.State.FindMinerals) { this.mineralType = mineralType; }