OSDN Git Service

装備を破棄する任務のカウンターの追加を容易にする
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 31 Mar 2018 05:37:50 +0000 (14:37 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Tue, 3 Apr 2018 13:21:37 +0000 (22:21 +0900)
KancolleSniffer.Test/QuestInfoTest.cs
KancolleSniffer/QuestInfo.cs

index 2038db8..c1c6b14 100644 (file)
@@ -998,26 +998,33 @@ namespace KancolleSniffer.Test
                 new ItemSpec {Id = 28, Name = "22号水上電探", Type = 12},\r
                 new ItemSpec {Id = 31, Name = "32号水上電探", Type = 13}\r
             });\r
-            itemInfo.InjectItems(new[] {1, 37, 19, 4, 11, 75, 7, 25, 13, 20, 28, 31});\r
-            questInfo.InspectQuestList(CreateQuestList(new[] {613, 638, 663, 673, 674, 675, 676, 677, 678, 680}));\r
+            var items = new[] {1, 37, 19, 4, 11, 75, 7, 25, 13, 20, 28, 31};\r
+            itemInfo.InjectItems(items);\r
+            questInfo.InspectQuestList(CreateQuestList(new[]\r
+                {613, 638, 663, 673, 674, 675, 676, 677, 678, 680}));\r
             questInfo.InspectDestroyItem(\r
-                "api%5Fslotitem%5Fids=1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12&api%5Fverno=1", null);\r
-            PAssert.That(() =>\r
-                questInfo.Quests.Select(q => new {q.Id, q.Count.Now}).Take(5).SequenceEqual(new[]\r
-                {\r
-                    new {Id = 613, Now = 1}, new {Id = 638, Now = 1}, new {Id = 663, Now = 1},\r
-                    new {Id = 673, Now = 1}, new {Id = 674, Now = 1}\r
-                }));\r
-            var q675 = questInfo.Quests[5];\r
-            PAssert.That(() => q675.Id == 675 && q675.Count.NowArray.SequenceEqual(new[] {2, 1}));\r
-            var q676 = questInfo.Quests[6];\r
-            PAssert.That(() => q676.Id == 676 && q676.Count.NowArray.SequenceEqual(new[] {1, 1, 1}));\r
-            var q677 = questInfo.Quests[7];\r
-            PAssert.That(() => q677.Id == 677 && q677.Count.NowArray.SequenceEqual(new[] {1, 1, 1}));\r
-            var q678 = questInfo.Quests[8];\r
-            PAssert.That(() => q678.Id == 678 && q678.Count.NowArray.SequenceEqual(new[] {1, 1}));\r
-            var q680 = questInfo.Quests[9];\r
-            PAssert.That(() => q680.Id == 680 && q680.Count.NowArray.SequenceEqual(new[] {1, 2}));\r
+                $"api%5Fslotitem%5Fids={string.Join("%2C", Enumerable.Range(1, items.Length))}&api%5Fverno=1", null);\r
+            var scalar = new[]\r
+            {\r
+                new {Id = 613, Now = 1}, new {Id = 638, Now = 1},\r
+                new {Id = 663, Now = 1}, new {Id = 673, Now = 1}, new {Id = 674, Now = 1}\r
+            };\r
+            foreach (var e in scalar)\r
+            {\r
+                var c = Array.Find(questInfo.Quests, q => q.Id == e.Id).Count;\r
+                PAssert.That(() => c.Id == e.Id && c.Now == e.Now, $"{c.Id}");\r
+            }\r
+            var array = new[]\r
+            {\r
+                new {Id = 675, NowArray = new[] {2, 1}}, new {Id = 676, NowArray = new[] {1, 1, 1}},\r
+                new {Id = 677, NowArray = new[] {1, 1, 1}}, new {Id = 678, NowArray = new[] {1, 1}},\r
+                new {Id = 680, NowArray = new[] {1, 2}}\r
+            };\r
+            foreach (var e in array)\r
+            {\r
+                var c = Array.Find(questInfo.Quests, q => q.Id == e.Id).Count;\r
+                PAssert.That(() => c.Id == e.Id && c.NowArray.SequenceEqual(e.NowArray), $"{c.Id}");\r
+            }\r
         }\r
 \r
         /// <summary>\r
index b8ae14e..9e3fdb8 100644 (file)
@@ -108,8 +108,29 @@ namespace KancolleSniffer
 \r
     public class QuestDestroyItem : QuestSpec\r
     {\r
-        public int[] Items { get; set; }\r
-        public bool Check(int id) => Items == null || Items.Contains(id);\r
+        public int[] Types { get; set; }\r
+        public int[] Ids { get; set; }\r
+\r
+        public bool Count(QuestCount count, ItemSpec[] specs)\r
+        {\r
+            if (count.NowArray == null)\r
+            {\r
+                var num = specs.Count(spec => Types?.Contains(spec.Type) ?? (Ids?.Contains(spec.Id) ?? true));\r
+                count.Now += num;\r
+                return num > 0;\r
+            }\r
+            if (Types == null && Ids == null)\r
+                return false;\r
+            var result = false;\r
+            for (var i = 0; i < count.NowArray.Length; i++)\r
+            {\r
+                var num = specs.Count(spec => Types != null ? Types[i] == spec.Type : Ids[i] == spec.Id);\r
+                count.NowArray[i] += num;\r
+                if (num > 0)\r
+                    result = true;\r
+            }\r
+            return result;\r
+        }\r
     }\r
 \r
     public class QuestPowerup : QuestSpec\r
@@ -281,14 +302,14 @@ namespace KancolleSniffer
             {619, new QuestSpec {Interval = Daily, Max = 1, Material = new[] {0, 0, 0, 1}}}, // 619: 装備の改修強化\r
 \r
             {613, new QuestSpec {Interval = Weekly, Max = 24, Material = new[] {0, 0, 0, 0}}}, // 613: 資源の再利用\r
-            {638, new QuestDestroyItem {Interval = Weekly, Max = 6, Items = new[] {21}, Material = new[] {0, 0, 2, 1}}}, // 638: 対空機銃量産\r
-            {663, new QuestDestroyItem {Interval = Quarterly, Max = 10, Items = new[] {3}, Material = new[] {0, 0, 3, 0}}}, // 663: 新型艤装の継続研究\r
-            {673, new QuestDestroyItem {Interval = Daily, Max = 4, Items = new[] {1}, Shift = 1, Material = new[] {0, 0, 1, 0}}}, // 673: 装備開発力の整備\r
-            {674, new QuestDestroyItem {Interval = Daily, Max = 3, Items = new[] {21}, Shift = 2, Material = new[] {0, 1, 1, 0}}}, // 674: 工廠環境の整備\r
-            {675, new QuestSpec {Interval = Quarterly, MaxArray = new[] {6, 4}, Material = new[] {0, 0, 0, 0}}}, // 675: 運用装備の統合整備\r
-            {676, new QuestSpec {Interval = Weekly, MaxArray = new[] {3, 3, 1}, Material = new[] {0, 1, 7, 0}}}, // 676: 装備開発力の集中整備\r
-            {677, new QuestSpec {Interval = Weekly, MaxArray = new[] {4, 2, 3}, Material = new[] {0, 5, 0, 0}}}, // 677: 継戦支援能力の整備\r
-            {678, new QuestSpec {Interval = Quarterly, MaxArray = new[] {3, 5}, Material = new[] {0, 0, 8, 0}}}, // 678: 主力艦上戦闘機の更新\r
+            {638, new QuestDestroyItem {Interval = Weekly, Max = 6, Types = new[] {21}, Material = new[] {0, 0, 2, 1}}}, // 638: 対空機銃量産\r
+            {663, new QuestDestroyItem {Interval = Quarterly, Max = 10, Types = new[] {3}, Material = new[] {0, 0, 3, 0}}}, // 663: 新型艤装の継続研究\r
+            {673, new QuestDestroyItem {Interval = Daily, Max = 4, Types = new[] {1}, Shift = 1, Material = new[] {0, 0, 1, 0}}}, // 673: 装備開発力の整備\r
+            {674, new QuestDestroyItem {Interval = Daily, Max = 3, Types = new[] {21}, Shift = 2, Material = new[] {0, 1, 1, 0}}}, // 674: 工廠環境の整備\r
+            {675, new QuestDestroyItem {Interval = Quarterly, MaxArray = new[] {6, 4}, Types = new[] {6, 21}, Material = new[] {0, 0, 0, 0}}}, // 675: 運用装備の統合整備\r
+            {676, new QuestDestroyItem {Interval = Weekly, MaxArray = new[] {3, 3, 1}, Types = new[] {2, 4, 30}, Material = new[] {0, 1, 7, 0}}}, // 676: 装備開発力の集中整備\r
+            {677, new QuestDestroyItem {Interval = Weekly, MaxArray = new[] {4, 2, 3}, Types = new[] {3, 10, 5}, Material = new[] {0, 5, 0, 0}}}, // 677: 継戦支援能力の整備\r
+            {678, new QuestDestroyItem {Interval = Quarterly, MaxArray = new[] {3, 5}, Ids = new[] {19, 20}, Material = new[] {0, 0, 8, 0}}}, // 678: 主力艦上戦闘機の更新\r
             {680, new QuestSpec {Interval = Quarterly, MaxArray = new[] {4, 4}, Material = new[] {0, 0, 6, 0}}}, // 680: 対空兵装の整備拡充\r
 \r
             {702, new QuestPowerup {Interval = Daily, Max = 2, Material = new[] {0, 1, 0, 0}}}, // 702: 艦の「近代化改修」を実施せよ!\r
@@ -801,33 +822,8 @@ namespace KancolleSniffer
                 var count = quest.Count;\r
                 if (!(count.Spec is QuestDestroyItem destroy))\r
                     continue;\r
-                AddCount(count, items.Count(spec => destroy.Check(spec.Type)));\r
-            }\r
-            if (_quests.TryGetValue(675, out var q675))\r
-            {\r
-                q675.Count.NowArray[0] += items.Count(spec => spec.Type == 6);\r
-                q675.Count.NowArray[1] += items.Count(spec => spec.Type == 21);\r
-                NeedSave = true;\r
-            }\r
-            if (_quests.TryGetValue(676, out var q676))\r
-            {\r
-                q676.Count.NowArray[0] += items.Count(spec => spec.Type == 2);\r
-                q676.Count.NowArray[1] += items.Count(spec => spec.Type == 4);\r
-                q676.Count.NowArray[2] += items.Count(spec => spec.Type == 30);\r
-                NeedSave = true;\r
-            }\r
-            if (_quests.TryGetValue(677, out var q677))\r
-            {\r
-                q677.Count.NowArray[0] += items.Count(spec => spec.Type == 3);\r
-                q677.Count.NowArray[1] += items.Count(spec => spec.Type == 10);\r
-                q677.Count.NowArray[2] += items.Count(spec => spec.Type == 5);\r
-                NeedSave = true;\r
-            }\r
-            if (_quests.TryGetValue(678, out var q678))\r
-            {\r
-                q678.Count.NowArray[0] += items.Count(spec => spec.Id == 19);\r
-                q678.Count.NowArray[1] += items.Count(spec => spec.Id == 20);\r
-                NeedSave = true;\r
+                if (destroy.Count(count, items))\r
+                    NeedSave = true;\r
             }\r
             if (_quests.TryGetValue(680, out var q680))\r
             {\r