Ejemplo n.º 1
0
        /// <summary>
        /// Buildings that are always build in the same spot
        /// </summary>
        //public static Classificator.BuildingEnum[] StaticBuildings = new Classificator.BuildingEnum[] {
        //    Classificator.BuildingEnum.Wall,
        //    Classificator.BuildingEnum.MakeshiftWall,
        //    Classificator.BuildingEnum.Palisade,
        //    Classificator.BuildingEnum.StoneWall,
        //    Classificator.BuildingEnum.EarthWall,
        //    Classificator.BuildingEnum.CityWall,
        //    Classificator.BuildingEnum.RallyPoint,
        //    Classificator.BuildingEnum.WW
        //};
        public static BuildingCategoryEnum GetBuildingsCategory(Classificator.BuildingEnum building)
        {
            switch (building)
            {
            case Classificator.BuildingEnum.GrainMill:
            case Classificator.BuildingEnum.Sawmill:
            case Classificator.BuildingEnum.Brickyard:
            case Classificator.BuildingEnum.IronFoundry:
            case Classificator.BuildingEnum.Bakery:
                return(BuildingCategoryEnum.Resources);

            case Classificator.BuildingEnum.RallyPoint:
            case Classificator.BuildingEnum.EarthWall:
            case Classificator.BuildingEnum.CityWall:
            case Classificator.BuildingEnum.MakeshiftWall:
            case Classificator.BuildingEnum.StoneWall:
            case Classificator.BuildingEnum.Palisade:
            case Classificator.BuildingEnum.Barracks:
            case Classificator.BuildingEnum.HerosMansion:
            case Classificator.BuildingEnum.Academy:
            case Classificator.BuildingEnum.Smithy:
            case Classificator.BuildingEnum.Stable:
            case Classificator.BuildingEnum.GreatBarracks:
            case Classificator.BuildingEnum.GreatStable:
            case Classificator.BuildingEnum.Workshop:
            case Classificator.BuildingEnum.TournamentSquare:
                return(BuildingCategoryEnum.Military);

            default:
                return(BuildingCategoryEnum.Infrastructure);
            }
        }
Ejemplo n.º 2
0
        private static Models.ResourceModels.Building GetLowestRes(List <Models.ResourceModels.Building> buildings, Village vill)
        {
            //get distinct field types
            var  distinct  = buildings.Select(x => x.Type).Distinct().ToList();
            long lowestRes = long.MaxValue;

            Classificator.BuildingEnum toUpgrade = Classificator.BuildingEnum.Cropland;

            foreach (var distinctType in distinct)
            {
                if (distinctType == Classificator.BuildingEnum.Woodcutter && vill.Res.Stored.Resources.Wood < lowestRes)
                {
                    lowestRes = vill.Res.Stored.Resources.Wood; toUpgrade = Classificator.BuildingEnum.Woodcutter;
                }
                if (distinctType == Classificator.BuildingEnum.ClayPit && vill.Res.Stored.Resources.Clay < lowestRes)
                {
                    lowestRes = vill.Res.Stored.Resources.Clay; toUpgrade = Classificator.BuildingEnum.ClayPit;
                }
                if (distinctType == Classificator.BuildingEnum.IronMine && vill.Res.Stored.Resources.Iron < lowestRes)
                {
                    lowestRes = vill.Res.Stored.Resources.Iron; toUpgrade = Classificator.BuildingEnum.IronMine;
                }
                if (distinctType == Classificator.BuildingEnum.Cropland && vill.Res.Stored.Resources.Crop < lowestRes)
                {
                    lowestRes = vill.Res.Stored.Resources.Crop; toUpgrade = Classificator.BuildingEnum.Cropland;
                }
            }
            return(FindLowestLevelBuilding(buildings.Where(x => x.Type == toUpgrade).ToList()));
        }
Ejemplo n.º 3
0
        public static bool IsResourceField(Classificator.BuildingEnum building)
        {
            int buildingInt = (int)building;

            //if id between 1 and 4, it's resource field.
            return(buildingInt < 5 && buildingInt > 0);
        }
Ejemplo n.º 4
0
        public override async Task <TaskRes> Execute(HtmlDocument htmlDoc, ChromeDriver wb, Files.Models.AccModels.Account acc)
        {
            if (vill == null)
            {
                vill = AccountHelper.GetMainVillage(acc);
            }

            Classificator.BuildingEnum building = (Great == false) ? TroopsHelper.GetTroopBuilding(troop, false) : TroopsHelper.GetTroopBuilding(troop, true);

            var buildId = vill.Build.Buildings.FirstOrDefault(x => x.Type == building);

            if (buildId == null)
            {
                //update dorf, no buildingId found?
                TaskExecutor.AddTask(acc, new UpdateDorf2()
                {
                    ExecuteAt = DateTime.Now
                });
                Console.WriteLine($"There is no {building} in this village!");
                return(TaskRes.Executed);
            }
            await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/build.php?id={buildId.Id}");

            var troopNode = htmlDoc.DocumentNode.Descendants("img").FirstOrDefault(x => x.HasClass("u" + (int)troop));

            while (!troopNode.HasClass("details"))
            {
                troopNode = troopNode.ParentNode;
            }

            //finding the correct "Exchange resources" button
            var exchangeResButton = troopNode.Descendants("button").FirstOrDefault(x => x.HasClass("gold"));

            wb.ExecuteScript($"document.getElementById('{exchangeResButton.GetAttributeValue("id", "")}').click()"); //Exchange resources button

            await Task.Delay(AccountHelper.Delay());

            htmlDoc.LoadHtml(wb.PageSource);
            await Task.Delay(AccountHelper.Delay());

            var distribute = htmlDoc.DocumentNode.SelectNodes("//*[text()[contains(., 'Distribute remaining resources.')]]")[0];

            while (distribute.Name != "button")
            {
                distribute = distribute.ParentNode;
            }
            string distributeid = distribute.GetAttributeValue("id", "");

            wb.ExecuteScript($"document.getElementById('{distributeid}').click()"); //Distribute resources button

            await Task.Delay(AccountHelper.Delay());

            wb.ExecuteScript($"document.getElementById('npc_market_button').click()"); //Exchange resources button

            return(TaskRes.Executed);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Get the building cost for specific level
        /// </summary>
        /// <param name="building"></param>
        /// <param name="level"></param>
        public static long[] GetBuildingCost(Classificator.BuildingEnum building, int level)
        {
            long[] ret      = new long[4];
            var    baseCost = BuildingCost.GetRow((int)building);

            for (int i = 0; i < 4; i++)
            {
                var cost = baseCost[i] * Math.Pow(baseCost[4], level - 1);
                ret[i] = (long)Math.Round(cost / 5.0) * 5;
            }
            return(ret);
        }
Ejemplo n.º 6
0
 private string[] GetPossibleTroops(Classificator.BuildingEnum building)
 {
     List<string> ret = new List<string>();
     ret.Add("None");
     var acc = getSelectedAcc();
     if (acc.Villages.Count == 0) return ret.ToArray(); //Acc has now been initialised
     int troopsEnum = ((int)acc.AccInfo.Tribe - 1) * 10;
     for (var i = troopsEnum + 1; i < troopsEnum + 11; i++)
     {
         Classificator.TroopsEnum troop = (Classificator.TroopsEnum)i;
         if (TroopsHelper.GetTroopBuilding(troop, false) == building)
         {
             ret.Add(VillageHelper.EnumStrToString(troop.ToString()));
         }
     }
     return ret.ToArray();
 }
Ejemplo n.º 7
0
        public static bool BuildingRequirementsAreMet(Classificator.BuildingEnum building, Village vill, Classificator.TribeEnum tribe) //check if user can construct this building
        {
            bool exists = (vill.Build.Buildings.FirstOrDefault(x => x.Type == building) != null);                                       //there is already a building of this type in the vill

            if (exists)
            {
                //check cranny/warehouse/grannary/trapper/GG/GW
                switch (building)
                {
                case Classificator.BuildingEnum.Warehouse: return(BuildingIsOnLevel(Classificator.BuildingEnum.Warehouse, 20, vill));

                case Classificator.BuildingEnum.Granary: return(BuildingIsOnLevel(Classificator.BuildingEnum.Granary, 20, vill));

                case Classificator.BuildingEnum.GreatWarehouse: return(BuildingIsOnLevel(Classificator.BuildingEnum.GreatWarehouse, 20, vill));

                case Classificator.BuildingEnum.GreatGranary: return(BuildingIsOnLevel(Classificator.BuildingEnum.GreatGranary, 20, vill));

                case Classificator.BuildingEnum.Trapper: return(BuildingIsOnLevel(Classificator.BuildingEnum.Trapper, 20, vill));

                case Classificator.BuildingEnum.Cranny: return(BuildingIsOnLevel(Classificator.BuildingEnum.Cranny, 10, vill));

                default: return(false);
                }
            }

            //check for prerequisites for this building
            (var ReqTribe, var Prerequisites) = GetBuildingPrerequisites(building);
            if (ReqTribe != Classificator.TribeEnum.Any && ReqTribe != tribe)
            {
                return(false);
            }
            //if we either already have this building OR is on our build task list, requirements are met.
            foreach (var prerequisite in Prerequisites)
            {
                if (!vill.Build.Buildings.Any(x => x.Level >= prerequisite.Level && x.Type == prerequisite.Building) &&
                    !vill.Build.Tasks.Any(x => x.Level >= prerequisite.Level && x.Building == prerequisite.Building))
                {
                    return(false);
                }
            }
            return(true);
        }
Ejemplo n.º 8
0
        private string[] GetPossibleTroops(Classificator.BuildingEnum building)
        {
            List <string> ret = new List <string>();

            ret.Add("None");
            var acc = GetSelectedAcc();

            if (acc.Villages.Count == 0)
            {
                return(ret.ToArray());                         //Acc has now been initialised
            }
            var tribes = new List <Classificator.TribeEnum>(5);

            if (NYS.Checked)
            {
                tribes.Add(Classificator.TribeEnum.Egyptians);
                tribes.Add(Classificator.TribeEnum.Gauls);
                tribes.Add(Classificator.TribeEnum.Huns);
                tribes.Add(Classificator.TribeEnum.Romans);
                tribes.Add(Classificator.TribeEnum.Teutons);
            }
            else
            {
                tribes.Add(acc.AccInfo.Tribe ?? Classificator.TribeEnum.Any);
            }

            foreach (var tribe in tribes)
            {
                int troopsEnum = ((int)tribe - 1) * 10;
                for (var i = troopsEnum + 1; i < troopsEnum + 11; i++)
                {
                    Classificator.TroopsEnum troop = (Classificator.TroopsEnum)i;
                    if (TroopsHelper.GetTroopBuilding(troop, false) == building)
                    {
                        ret.Add(VillageHelper.EnumStrToString(troop.ToString()));
                    }
                }
            }
            return(ret.ToArray());
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Adds all building prerequisites for this building if they do not exist yet. After this you should call RemoveDuplicates().
        /// </summary>
        /// <param name="acc"></param>
        /// <param name="vill"></param>
        /// <param name="building"></param>
        /// <returns>True if we have all prerequisite buildings, false otherwise</returns>
        public static bool AddBuildingPrerequisites(Account acc, Village vill, Classificator.BuildingEnum building)
        {
            (var tribe, var prereqs) = GetBuildingPrerequisites(building);
            if (acc.AccInfo.Tribe != tribe)
            {
                return(false);
            }
            if (prereqs.Count == 0)
            {
                return(true);
            }
            var ret = true;

            foreach (var prereq in prereqs)
            {
                var prereqBuilding = vill.Build.Buildings.FirstOrDefault(x =>
                                                                         x.Type == prereq.Building &&
                                                                         x.Level >= prereq.Level
                                                                         );
                //prereqired building already exists
                if (prereqBuilding != null)
                {
                    continue;
                }
                //check if we have its prerequisites
                AddBuildingPrerequisites(acc, vill, prereq.Building);
                AddBuildingTask(acc, vill, new BuildingTask()
                {
                    Building = prereq.Building,
                    Level    = prereq.Level,
                    TaskType = BuildingType.General
                });
                ret = false;
            }
            return(ret);
        }
Ejemplo n.º 10
0
 public static string BuildingTypeToString(Classificator.BuildingEnum building) => EnumStrToString(building.ToString());
Ejemplo n.º 11
0
        public static (Classificator.TribeEnum, List <Prerequisite>) GetBuildingPrerequisites(Classificator.BuildingEnum building)
        {
            Classificator.TribeEnum tribe = Classificator.TribeEnum.Any;
            var ret = new List <Prerequisite>();

            switch (building)
            {
            case Classificator.BuildingEnum.Woodcutter:
            case Classificator.BuildingEnum.ClayPit:
            case Classificator.BuildingEnum.IronMine:
            case Classificator.BuildingEnum.Cropland:
                break;

            case Classificator.BuildingEnum.Sawmill:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Woodcutter, Level = 10
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });
                break;

            case Classificator.BuildingEnum.Brickyard:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.ClayPit, Level = 10
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });
                break;

            case Classificator.BuildingEnum.IronFoundry:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.IronMine, Level = 10
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });
                break;

            case Classificator.BuildingEnum.GrainMill:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Cropland, Level = 5
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });
                break;

            case Classificator.BuildingEnum.Bakery:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Cropland, Level = 10
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.GrainMill, Level = 5
                });
                break;

            case Classificator.BuildingEnum.Warehouse:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 1
                });
                break;

            case Classificator.BuildingEnum.Granary:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 1
                });
                break;

            case Classificator.BuildingEnum.Blacksmith:
                //DOESN'T EXIST ANYMORE
                tribe = Classificator.TribeEnum.Nature;     //Just a dirty hack, since user can't be Nature, he can't build Blacksmith
                break;

            case Classificator.BuildingEnum.Smithy:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 3
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Academy, Level = 1
                });
                break;

            case Classificator.BuildingEnum.TournamentSquare:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.RallyPoint, Level = 15
                });
                break;

            case Classificator.BuildingEnum.MainBuilding:
                break;

            case Classificator.BuildingEnum.RallyPoint:
                break;

            case Classificator.BuildingEnum.Marketplace:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Warehouse, Level = 1
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Granary, Level = 1
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 3
                });
                break;

            case Classificator.BuildingEnum.Embassy:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 1
                });
                break;

            case Classificator.BuildingEnum.Barracks:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 3
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.RallyPoint, Level = 1
                });
                break;

            case Classificator.BuildingEnum.Stable:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Smithy, Level = 3
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Academy, Level = 5
                });
                break;

            case Classificator.BuildingEnum.Workshop:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Academy, Level = 10
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });
                break;

            case Classificator.BuildingEnum.Academy:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 3
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Barracks, Level = 3
                });
                break;

            case Classificator.BuildingEnum.Cranny:
                break;

            case Classificator.BuildingEnum.TownHall:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Academy, Level = 10
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 10
                });
                break;

            case Classificator.BuildingEnum.Residence:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });                                                                                                //no palace!
                break;

            case Classificator.BuildingEnum.Palace:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });                                                                                                //no residence!
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Embassy, Level = 1
                });
                break;

            case Classificator.BuildingEnum.Treasury:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 10
                });
                break;

            case Classificator.BuildingEnum.TradeOffice:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Stable, Level = 10
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Marketplace, Level = 20
                });
                break;

            case Classificator.BuildingEnum.GreatBarracks:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Barracks, Level = 20
                });                                                                                             //not capital!
                break;

            case Classificator.BuildingEnum.GreatStable:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Stable, Level = 20
                });                                                                                           //not capital
                break;

            case Classificator.BuildingEnum.CityWall:
                tribe = Classificator.TribeEnum.Romans;
                break;

            case Classificator.BuildingEnum.EarthWall:
                tribe = Classificator.TribeEnum.Teutons;
                break;

            case Classificator.BuildingEnum.Palisade:
                tribe = Classificator.TribeEnum.Gauls;
                break;

            case Classificator.BuildingEnum.StonemasonsLodge:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });                                                                                                //capital
                break;

            case Classificator.BuildingEnum.Brewery:
                tribe = Classificator.TribeEnum.Teutons;
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Granary, Level = 20
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.RallyPoint, Level = 10
                });
                break;

            case Classificator.BuildingEnum.Trapper:
                tribe = Classificator.TribeEnum.Gauls;
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.RallyPoint, Level = 1
                });
                break;

            case Classificator.BuildingEnum.HerosMansion:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 3
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.RallyPoint, Level = 1
                });
                break;

            case Classificator.BuildingEnum.GreatWarehouse:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 10
                });                                                                                                 //art/ww vill
                break;

            case Classificator.BuildingEnum.GreatGranary:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 10
                });                                                                                                 //art/ww vill
                break;

            case Classificator.BuildingEnum.WW:         //ww vill
                tribe = Classificator.TribeEnum.Nature; //Just a dirty hack, since user can't be Nature, he can't constuct WW.
                break;

            case Classificator.BuildingEnum.HorseDrinkingTrough:
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.RallyPoint, Level = 10
                });
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.Stable, Level = 20
                });
                tribe = Classificator.TribeEnum.Romans;
                break;

            case Classificator.BuildingEnum.StoneWall:
                tribe = Classificator.TribeEnum.Egyptians;
                break;

            case Classificator.BuildingEnum.MakeshiftWall:
                tribe = Classificator.TribeEnum.Huns;
                break;

            case Classificator.BuildingEnum.CommandCenter:     //no res/palace
                tribe = Classificator.TribeEnum.Huns;
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.MainBuilding, Level = 5
                });
                break;

            case Classificator.BuildingEnum.Waterworks:
                tribe = Classificator.TribeEnum.Egyptians;
                ret.Add(new Prerequisite()
                {
                    Building = Classificator.BuildingEnum.HerosMansion, Level = 10
                });
                break;

            default: break;
            }
            return(tribe, ret);
        }
Ejemplo n.º 12
0
 private static bool BuildingIsOnLevel(Classificator.BuildingEnum building, int lvl, Village vill)
 {
     //if there already is a building on specific level or there is a task for this building
     return(vill.Build.Buildings.FirstOrDefault(x => x.Level == lvl && x.Type == building) != null || vill.Build.Tasks.FirstOrDefault(x => x.Level == lvl && x.Building == building) != null);
 }