Ejemplo n.º 1
0
 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());
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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>();
        }
Ejemplo n.º 4
0
 public AIStateFindMinerals(Map.Minerals mineralType)
     : base(AI.State.FindMinerals)
 {
     this.mineralType = mineralType;
 }