/// <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); } }
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())); }
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); }
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); }
/// <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); }
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(); }
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); }
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()); }
/// <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); }
public static string BuildingTypeToString(Classificator.BuildingEnum building) => EnumStrToString(building.ToString());
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); }
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); }