public void Test() { var factory = new ResSpendingFactory(); var acc = factory.CreateAccount(); var vill = acc.Villages[0]; Assert.False(ResSpendingHelper.CheckUnfinishedTasks(acc, vill), "CheckUnfinishedTasks should return false!"); var celeb = new VillUnfinishedTask() { ResNeeded = new Resources() { Wood = 1, Clay = 1, Iron = 1, Crop = 1 }, Task = new Celebration() }; var improve = new VillUnfinishedTask() { ResNeeded = new Resources() { Wood = 1, Clay = 1, Iron = 1, Crop = 1 }, Task = new ImproveTroop() }; var research = new VillUnfinishedTask() { ResNeeded = new Resources() { Wood = 1, Clay = 2, Iron = 1, Crop = 1 }, Task = new ResearchTroop() }; var upgrade = new VillUnfinishedTask() { ResNeeded = new Resources() { Wood = 1, Clay = 1, Iron = 1, Crop = 1 }, Task = new UpgradeBuilding() }; var settlers = new VillUnfinishedTask() { ResNeeded = new Resources() { Wood = 1, Clay = 1, Iron = 3, Crop = 1 }, Task = new TrainSettlers() }; vill.UnfinishedTasks.Add(improve); vill.UnfinishedTasks.Add(upgrade); vill.UnfinishedTasks.Add(research); vill.UnfinishedTasks.Add(celeb); vill.UnfinishedTasks.Add(settlers); vill.UnfinishedTasks.Add(celeb); Assert.False(ResSpendingHelper.CheckUnfinishedTasks(acc, vill), "CheckUnfinishedTasks should return false! No Res"); vill.Res.Stored.Resources = new Resources() { Wood = 10, Clay = 10, Iron = 10, Crop = 10 }; acc.Settings.ResSpendingPriority = new ResSpendTypeEnum[3] { ResSpendTypeEnum.Celebrations, ResSpendTypeEnum.Building, ResSpendTypeEnum.Troops }; // Unfinished tasks get sorted Assert.True(ResSpendingHelper.CheckUnfinishedTasks(acc, vill), "CheckUnfinishedTasks should return true, enough res"); Assert.Equal(celeb, vill.UnfinishedTasks[0]); Assert.Equal(upgrade, vill.UnfinishedTasks[1]); Assert.Equal(improve, vill.UnfinishedTasks[2]); Assert.Equal(research, vill.UnfinishedTasks[3]); Assert.Equal(settlers, vill.UnfinishedTasks[4]); acc.Settings.ResSpendingPriority = new ResSpendTypeEnum[3] { ResSpendTypeEnum.Celebrations, ResSpendTypeEnum.Troops, ResSpendTypeEnum.Building, }; // Unfinished tasks get sorted Assert.True(ResSpendingHelper.CheckUnfinishedTasks(acc, vill), "CheckUnfinishedTasks should return true, enough res"); Assert.Equal(improve, vill.UnfinishedTasks[0]); Assert.Equal(research, vill.UnfinishedTasks[1]); Assert.Equal(settlers, vill.UnfinishedTasks[2]); Assert.Equal(upgrade, vill.UnfinishedTasks[3]); }
/// <summary> /// If there are enough resources, return TimeSpan(0) /// Otherwise calculate how long it will take to get enough resources and transit res from /// main village, if we have that enabled. Return the one that takes less time. /// DateTime for usage in nextExecution time /// </summary> /// <param name="acc">Account</param> /// <param name="vill">(target) Village</param> /// <param name="requiredRes">Resources required</param> /// <param name="task">Bot task that doesn't have enough resources</param> /// <param name="buildingTask">Potential building task</param> /// <returns>When next village update should occur</returns> private static DateTime?NewUnfinishedTask(Account acc, Village vill, Resources requiredRes, BotTask task, BuildingTask buildingTask = null) { var stillNeededRes = SubtractResources(requiredRes.ToArray(), vill.Res.Stored.Resources.ToArray(), true); // Whether we have enough resources. This should already be checked before calling this method! if (IsZeroResources(stillNeededRes)) { ResSpendingHelper.AddUnfinishedTask(vill, task, requiredRes); return(DateTime.Now); } acc.Wb.Log($"Not enough resources for the task {task.GetName()}! Needed {requiredRes}. Bot will try finish the task later"); if (IsStorageTooLow(acc, vill, requiredRes)) { acc.Wb.Log($"Storage is too low."); ResSpendingHelper.AddUnfinishedTask(vill, task, requiredRes); return(null); } // Try to use hero resources first if (vill.Settings.UseHeroRes && acc.AccInfo.ServerVersion == ServerVersionEnum.T4_5) // Only T4.5 has resources in hero inv { var heroRes = HeroHelper.GetHeroResources(acc); // If we have some hero resources, we should use those first if (!IsZeroResources(heroRes)) { var heroEquipTask = UseHeroResources(acc, vill, ref stillNeededRes, heroRes, buildingTask); // If we have enough hero res for our task, execute the task // right after hero equip finishes if (IsZeroResources(SubtractResources(stillNeededRes, heroRes, true))) { heroEquipTask.NextTask = task; return(null); } } } ResSpendingHelper.AddUnfinishedTask(vill, task, requiredRes); // When will we have enough resources from production DateTime enoughRes = TimeHelper.EnoughResToUpgrade(vill, stillNeededRes); var mainVill = AccountHelper.GetMainVillage(acc); if (mainVill == vill) { return(enoughRes); } DateTime resTransit = MarketHelper.TransitResourcesFromMain(acc, vill); if (resTransit < enoughRes) { enoughRes = resTransit; } if (enoughRes < DateTime.Now) { return(DateTime.Now); } return(enoughRes); }