/// <summary> /// Sort Unfinished Tasks based on resource spending priority /// </summary> /// <param name="acc">Account</param> /// <param name="task1">task1</param> /// <param name="task2">task2</param> /// <returns>Greater / Equal / Less than</returns> private static int SortUnfinishedTasks(Account acc, VillUnfinishedTask task1, VillUnfinishedTask task2) { // If returned -1, task1 is less than task2 // If returned 1, task1 is greater than task2 if (!taskType.TryGetValue(task1.Task.GetType(), out var type1)) { return(1); } if (!taskType.TryGetValue(task2.Task.GetType(), out var type2)) { return(-1); } foreach (var spendType in acc.Settings.ResSpendingPriority) { if (spendType == type1 && spendType == type2) { // If both have same priority, do the cheaper one first return(task1.ResNeeded.Sum() < task2.ResNeeded.Sum() ? -1 : 1); } if (spendType == type1) { return(-1); } if (spendType == type2) { return(1); } } return(0); }
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]); }