OSDN Git Service

任務カウンターの表の記述力を上げる
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Mon, 18 Nov 2019 11:19:50 +0000 (20:19 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Mon, 18 Nov 2019 11:36:28 +0000 (20:36 +0900)
KancolleSniffer.Test/QuestCounterTest.cs
KancolleSniffer/Model/QuestCountList.cs
KancolleSniffer/Model/QuestCounter.cs
KancolleSniffer/Model/QuestSpec.cs

index c00318c..a5f79ab 100644 (file)
@@ -285,33 +285,33 @@ namespace KancolleSniffer.Test
             InjectMapStart(11, 4);\r
             var quests = _questInfo.Quests;\r
             // 出撃カウント\r
-            Assert.IsTrue(quests[2].Id == 214 && quests[2].Count.NowArray[0] == 1);\r
+            PAssert.That(() => quests[2].Id == 214 && quests[2].Count.NowArray[0] == 1);\r
             InjectBattleResult("S");\r
             // 道中S勝利\r
-            Assert.IsTrue(quests.Select(q => new {q.Id, q.Count.Now}).SequenceEqual(new[]\r
+            PAssert.That(() => quests.Select(q => new {q.Id, q.Count.Now}).SequenceEqual(new[]\r
             {\r
                 new {Id = 201, Now = 1}, new {Id = 210, Now = 1},\r
                 new {Id = 214, Now = 0}, new {Id = 216, Now = 1}\r
             }));\r
-            Assert.IsTrue(quests[2].Id == 214 && CheckCount(quests[2], new[] {1, 1, 0, 0}));\r
+            PAssert.That(() => quests[2].Id == 214 && CheckCount(quests[2], new[] {1, 1, 0, 0}));\r
 \r
             InjectMapNext(11, 5);\r
             // ボスB勝利\r
             InjectBattleResult("B");\r
-            Assert.IsTrue(quests.Select(q => new {q.Id, q.Count.Now}).SequenceEqual(new[]\r
+            PAssert.That(() => quests.Select(q => new {q.Id, q.Count.Now}).SequenceEqual(new[]\r
             {\r
                 new {Id = 201, Now = 2}, new {Id = 210, Now = 2},\r
                 new {Id = 214, Now = 0}, new {Id = 216, Now = 2}\r
             }));\r
             // ボス敗北\r
-            Assert.IsTrue(quests[2].Id == 214 && CheckCount(quests[2], new[] {1, 1, 1, 1}));\r
+            PAssert.That(() => quests[2].Id == 214 && CheckCount(quests[2], new[] {1, 1, 1, 1}));\r
             InjectBattleResult("C");\r
-            Assert.IsTrue(quests.Select(q => new {q.Id, q.Count.Now}).SequenceEqual(new[]\r
+            PAssert.That(() => quests.Select(q => new {q.Id, q.Count.Now}).SequenceEqual(new[]\r
             {\r
                 new {Id = 201, Now = 2}, new {Id = 210, Now = 3},\r
                 new {Id = 214, Now = 0}, new {Id = 216, Now = 2}\r
             }));\r
-            Assert.IsTrue(quests[2].Id == 214 && CheckCount(quests[2], new[] {1, 1, 2, 1}));\r
+            PAssert.That(() => quests[2].Id == 214 && CheckCount(quests[2], new[] {1, 1, 2, 1}));\r
         }\r
 \r
         /// <summary>\r
index 89782c3..5e59c8d 100644 (file)
@@ -49,35 +49,35 @@ namespace KancolleSniffer.Model
             {241, new QuestSortie {Interval = Weekly, Max = 5, Rank = "B", Maps = new[] {33, 34, 35}, Material = new[] {0, 0, 3, 3}}}, // 241: 敵北方艦隊主力を撃滅せよ!\r
             {242, new QuestSortie {Interval = Weekly, Max = 1, Rank = "B", Maps = new[] {44}, Material = new[] {0, 1, 1, 0}}}, // 242: 敵東方中枢艦隊を撃破せよ!\r
             {243, new QuestSortie {Interval = Weekly, Max = 2, Rank = "S", Maps = new[] {52}, Material = new[] {0, 0, 2, 2}}}, // 243: 南方海域珊瑚諸島沖の制空権を握れ!\r
-            {249, new QuestSpec {Interval = Monthly, Max = 1, Material = new[] {0, 0, 5, 0}}}, // 249: 「第五戦隊」出撃せよ!\r
+            {249, new QuestSortie {Interval = Monthly, Max = 1, Rank = "S", Maps = new[] {25}, Material = new[] {0, 0, 5, 0}}}, // 249: 「第五戦隊」出撃せよ!\r
             {256, new QuestSortie {Interval = Monthly, Max = 3, Rank = "S", Maps = new[] {61}, Material = new[] {0, 0, 0, 0}}}, // 256: 「潜水艦隊」出撃せよ!\r
-            {257, new QuestSpec {Interval = Monthly, Max = 1, Material = new[] {0, 0, 0, 3}}}, // 257: 「水雷戦隊」南西へ!\r
-            {259, new QuestSpec {Interval = Monthly, Max = 1, Material = new[] {0, 3, 0, 4}}}, // 259: 「水上打撃部隊」南方へ!\r
+            {257, new QuestSortie {Interval = Monthly, Max = 1, Rank = "S", Maps = new[] {14}, Material = new[] {0, 0, 0, 3}}}, // 257: 「水雷戦隊」南西へ!\r
+            {259, new QuestSortie {Interval = Monthly, Max = 1, Rank = "S", Maps = new[] {51}, Material = new[] {0, 3, 0, 4}}}, // 259: 「水上打撃部隊」南方へ!\r
             {261, new QuestSortie {Interval = Weekly, Max = 3, Rank = "A", Maps = new[] {15}, Material = new[] {0, 0, 0, 3}}}, // 261: 海上輸送路の安全確保に努めよ!\r
-            {264, new QuestSpec {Interval = Monthly, Max = 1, Material = new[] {0, 0, 0, 2}}}, // 264: 「空母機動部隊」西へ!\r
+            {264, new QuestSortie {Interval = Monthly, Max = 1, Rank = "S", Maps = new[] {42}, Material = new[] {0, 0, 0, 2}}}, // 264: 「空母機動部隊」西へ!\r
             {265, new QuestSortie {Interval = Monthly, Max = 10, Rank = "A", Maps = new[] {15}, Material = new[] {0, 0, 5, 3}}}, // 265: 海上護衛強化月間\r
-            {266, new QuestSpec {Interval = Monthly, Max = 1, Material = new[] {4, 4, 0, 2}}}, // 266: 「水上反撃部隊」突入せよ!\r
-            {280, new QuestSpec {Interval = Monthly, MaxArray = new[] {1, 1, 1, 1}, Material = new[] {0, 4, 4, 2}}}, // 280: 兵站線確保!海上警備を強化実施せよ!\r
-            {284, new QuestSpec {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1}, Material = new[] {0, 0, 0, 4}}}, // 284: 南西諸島方面「海上警備行動」発令!\r
+            {266, new QuestSortie {Interval = Monthly, Max = 1, Rank = "S", Maps = new[] {25}, Material = new[] {4, 4, 0, 2}}}, // 266: 「水上反撃部隊」突入せよ!\r
+            {280, new QuestSortie {Interval = Monthly, MaxArray = new[] {1, 1, 1, 1}, Rank = "S", Maps = new[] {12, 13, 14, 21}, Material = new[] {0, 4, 4, 2}}}, // 280: 兵站線確保!海上警備を強化実施せよ!\r
+            {284, new QuestSortie {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1}, Rank = "S", Maps = new[] {14, 21, 22, 23}, Material = new[] {0, 0, 0, 4}}}, // 284: 南西諸島方面「海上警備行動」発令!\r
 \r
             {822, new QuestSortie {Interval = Quarterly, Max = 2, Rank = "S", Maps = new[] {24}, Material = new[] {0, 0, 0, 5}}}, // 822: 沖ノ島海域迎撃戦\r
-            {854, new QuestSpec {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1}, Material = new[] {0, 0, 0, 4}}}, // 854: 戦果拡張任務!「Z作戦」前段作戦\r
+            {854, new QuestSortie {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1}, Ranks = new[] {"A", "A", "A", "S"}, Maps = new[] {24, 61, 63, 64}, Material = new[] {0, 0, 0, 4}}}, // 854: 戦果拡張任務!「Z作戦」前段作戦\r
             {861, new QuestSpec {Interval = Quarterly, Max = 2, Material = new[] {0, 4, 0, 0}}}, // 861: 強行輸送艦隊、抜錨!\r
-            {862, new QuestSpec {Interval = Quarterly, Max = 2, Material = new[] {0, 0, 8, 4}}}, // 862: 前線の航空偵察を実施せよ!\r
-            {872, new QuestSpec {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1}, Material = new[] {0, 0, 0, 4}}}, // 872: 戦果拡張任務!「Z作戦」後段作戦\r
-            {873, new QuestSpec {Interval = Quarterly, MaxArray = new[] {1, 1, 1}, Material = new[] {0, 0, 0, 0}}}, // 873: 北方海域警備を実施せよ!\r
-            {875, new QuestSpec {Interval = Quarterly, Max = 2, Material = new[] {0, 0, 0, 0}}}, // 875: 精鋭「三一駆」、鉄底海域に突入せよ!\r
-            {888, new QuestSpec {Interval = Quarterly, MaxArray = new[] {1, 1, 1}, Material = new[] {0, 0, 0, 0}}}, // 888: 新編成「三川艦隊」、鉄底海峡に突入せよ!\r
-            {893, new QuestSpec {Interval = Quarterly, MaxArray = new[] {3, 3, 3, 3}, Material = new[] {0, 0, 0, 0}}}, // 893: 泊地周辺海域の安全確保を徹底せよ!\r
-            {894, new QuestSpec {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1, 1}, Material = new[] {0, 0, 0, 0}}}, // 894: 空母戦力の投入による兵站線戦闘哨戒\r
+            {862, new QuestSortie {Interval = Quarterly, Max = 2, Rank = "A", Maps = new[] {63}, Material = new[] {0, 0, 8, 4}}}, // 862: 前線の航空偵察を実施せよ!\r
+            {872, new QuestSortie {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1}, Rank = "S", Maps = new[] {722, 55, 62, 65}, Material = new[] {0, 0, 0, 4}}}, // 872: 戦果拡張任務!「Z作戦」後段作戦\r
+            {873, new QuestSortie {Interval = Quarterly, MaxArray = new[] {1, 1, 1}, Rank = "A", Maps = new[] {31, 32, 33}, Material = new[] {0, 0, 0, 0}}}, // 873: 北方海域警備を実施せよ!\r
+            {875, new QuestSortie {Interval = Quarterly, Max = 2, Rank = "S", Maps = new[] {54}, Material = new[] {0, 0, 0, 0}}}, // 875: 精鋭「三一駆」、鉄底海域に突入せよ!\r
+            {888, new QuestSortie {Interval = Quarterly, MaxArray = new[] {1, 1, 1}, Rank = "S", Maps = new[] {51, 53, 54}, Material = new[] {0, 0, 0, 0}}}, // 888: 新編成「三川艦隊」、鉄底海峡に突入せよ!\r
+            {893, new QuestSortie {Interval = Quarterly, MaxArray = new[] {3, 3, 3, 3}, Rank = "S", Maps = new[] {15, 71, 721, 722}, Material = new[] {0, 0, 0, 0}}}, // 893: 泊地周辺海域の安全確保を徹底せよ!\r
+            {894, new QuestSortie {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1, 1}, Rank = "S", Maps = new[] {13, 14, 21, 22, 23}, Material = new[] {0, 0, 0, 0}}}, // 894: 空母戦力の投入による兵站線戦闘哨戒\r
 \r
             {303, new QuestPractice {Interval = Daily, Max = 3, Win = false, Material = new[] {1, 0, 0, 0}}}, // 303: 「演習」で練度向上!\r
             {304, new QuestPractice {Interval = Daily, Max = 5, Win = true, Material = new[] {0, 0, 1, 0}}}, // 304: 「演習」で他提督を圧倒せよ!\r
             {302, new QuestPractice {Interval = Weekly, Max = 20, Win = true, Material = new[] {0, 0, 2, 1}}}, // 302: 大規模演習\r
             {311, new QuestPractice {Interval = Daily, Max = 7, Win = true, Material = new[] {0, 2, 0, 0}}}, // 311: 精鋭艦隊演習\r
             {315, new QuestPractice {Interval = Daily, Max = 8, Win = true, Material = new[] {0, 0, 0, 0}}}, // 315: 春季大演習\r
-            {318, new QuestSpec {Interval = Daily, Max = 3, Material = new[] {0, 2, 2, 0}, AdjustCount = false}}, // 318: 給糧艦「伊良湖」の支援\r
-            {330, new QuestSpec {Interval = Daily, Max = 4, Material = new[] {0, 0, 3, 0}}}, // 330: 空母機動部隊、演習始め!\r
+            {318, new QuestPractice {Interval = Daily, Max = 3, Win = true, Material = new[] {0, 2, 2, 0}, AdjustCount = false}}, // 318: 給糧艦「伊良湖」の支援\r
+            {330, new QuestPractice {Interval = Daily, Max = 4, Win = true, Material = new[] {0, 0, 3, 0}}}, // 330: 空母機動部隊、演習始め!\r
 \r
             {402, new QuestMission {Interval = Daily, Max = 3, Material = new[] {0, 0, 1, 0}}}, // 402: 「遠征」を3回成功させよう!\r
             {403, new QuestMission {Interval = Daily, Max = 10, Material = new[] {0, 0, 0, 0}}}, // 403: 「遠征」を10回成功させよう!\r
@@ -85,8 +85,8 @@ namespace KancolleSniffer.Model
             {410, new QuestMission {Interval = Weekly, Max = 1, Ids = new[] {37, 38}, Material = new[] {0, 0, 0, 0}}}, // 410: 南方への輸送作戦を成功させよ!\r
             {411, new QuestMission {Interval = Weekly, Max = 6, Shift = 1, Ids = new[] {37, 38}, Material = new[] {0, 0, 2, 1}}}, // 411: 南方への鼠輸送を継続実施せよ!\r
             {424, new QuestMission {Interval = Monthly, Max = 4, Shift = 1, Ids = new[] {5}, Material = new[] {0, 0, 0, 0}}}, // 424: 輸送船団護衛を強化せよ!\r
-            {426, new QuestSpec {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1}, Material = new[] {0, 0, 4, 0}}}, // 426: 海上通商航路の警戒を厳とせよ!\r
-            {428, new QuestSpec {Interval = Quarterly, MaxArray = new[] {2, 2, 2}, Material = new[] {0, 0, 0, 3}}}, // 428: 近海に侵入する敵潜を制圧せよ!\r
+            {426, new QuestMission {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1}, Ids = new[] {3, 4, 5, 10}, Material = new[] {0, 0, 4, 0}}}, // 426: 海上通商航路の警戒を厳とせよ!\r
+            {428, new QuestMission {Interval = Quarterly, MaxArray = new[] {2, 2, 2}, Ids = new[] {4, 101, 102}, Material = new[] {0, 0, 0, 3}}}, // 428: 近海に侵入する敵潜を制圧せよ!\r
 \r
             {503, new QuestSpec {Interval = Daily, Max = 5, Material = new[] {0, 2, 0, 0}}}, // 503: 艦隊大整備!\r
             {504, new QuestSpec {Interval = Daily, Max = 15, Material = new[] {1, 0, 1, 0}}}, // 504: 艦隊酒保祭り!\r
index cda13f4..e2cd4a4 100644 (file)
@@ -165,7 +165,6 @@ namespace KancolleSniffer.Model
         private readonly BattleInfo _battleInfo;\r
         private readonly SortedDictionary<int, QuestStatus> _quests;\r
         private int _map;\r
-        private int _cell;\r
         private bool _boss;\r
 \r
         private class ResultShipSpecs\r
@@ -212,7 +211,15 @@ namespace KancolleSniffer.Model
         public void InspectMapNext(dynamic json)\r
         {\r
             _map = (int)json.api_maparea_id * 10 + (int)json.api_mapinfo_no;\r
-            _cell = json.api_no() ? (int)json.api_no : 0;\r
+            if (_map == 72)\r
+            {\r
+                var cell = json.api_no() ? (int)json.api_no : 0;\r
+                _map *= 10;\r
+                if (cell == 7)\r
+                    _map++;\r
+                if (cell == 15)\r
+                    _map += 2;\r
+            }\r
             _boss = (int)json.api_event_id == 5;\r
 \r
             if (_quests.TryGetValue(861, out var q861) && _map == 16 && (int)json.api_event_id == 8)\r
@@ -222,33 +229,23 @@ namespace KancolleSniffer.Model
             }\r
         }\r
 \r
-        private class Rank\r
-        {\r
-            private readonly string _rank;\r
-\r
-            public Rank(string rank)\r
-            {\r
-                _rank = rank;\r
-            }\r
-\r
-            public bool S => QuestSortie.CompareRank(_rank, "S") == 0;\r
-            public bool A => QuestSortie.CompareRank(_rank, "A") <= 0;\r
-            public bool B => QuestSortie.CompareRank(_rank, "B") <= 0;\r
-        }\r
-\r
         public void InspectBattleResult(dynamic json)\r
         {\r
-            var rawRak = json.api_win_rank;\r
-            var rank = new Rank(rawRak);\r
-            var specs = new ResultShipSpecs(_battleInfo);\r
-            foreach (var quest in _quests.Values)\r
+            var rank = json.api_win_rank;\r
+            foreach (var count in _quests.Values.Select(q => q.Count))\r
             {\r
-                var count = quest.Count;\r
                 switch (count.Spec)\r
                 {\r
                     case QuestSortie sortie:\r
-                        if (count.Id == 216 && !_boss || sortie.Check(rawRak, _map, _boss))\r
+                        if (!FleetCheck(count.Id))\r
+                            continue;\r
+                        if (!_boss && count.Id == 216)\r
+                        {\r
                             Increment(count);\r
+                            continue;\r
+                        }\r
+                        if (sortie.Count(count, rank, _map, _boss))\r
+                            NeedSave = true;\r
                         continue;\r
                     case QuestEnemyType enemyType:\r
                         var num = enemyType.CountResult(\r
@@ -257,258 +254,78 @@ namespace KancolleSniffer.Model
                             Add(count, num);\r
                         continue;\r
                 }\r
-                switch (quest.Id)\r
-                {\r
-                    case 214:\r
-                        if (rank.S)\r
-                            IncrementNth(count, 1);\r
-                        if (_boss)\r
-                        {\r
-                            IncrementNth(count, 2);\r
-                            if (rank.B)\r
-                                IncrementNth(count, 3);\r
-                        }\r
-                        break;\r
-                    case 249:\r
-                        if (_map == 25 && _boss && rank.S &&\r
-                            specs.Ids.Intersect(new[] {62, 63, 64, 265, 266, 268, 319, 192, 194}).Count() == 3)\r
-                        {\r
-                            Increment(count);\r
-                        }\r
-                        break;\r
-                    case 257:\r
-                        if (_map == 14 && _boss && rank.S &&\r
-                            specs.FlagshipType == 3 &&\r
-                            specs.Types.Count(s => s == 3) <= 3 &&\r
-                            specs.Types.All(s => s == 2 || s == 3))\r
-                        {\r
-                            Increment(count);\r
-                        }\r
-                        break;\r
-                    case 259:\r
-                        if (_map == 51 && _boss && rank.S &&\r
-                            specs.Types.Count(type => type == 3) > 0 &&\r
-                            specs.Classes.Count(c => new[]\r
-                            {\r
-                                2, // 伊勢型\r
-                                19, // 長門型\r
-                                26, // 扶桑型\r
-                                37 // 大和型\r
-                            }.Contains(c)) == 3)\r
-                        {\r
-                            Increment(count);\r
-                        }\r
-                        break;\r
-                    case 264:\r
-                        if (_map == 42 && _boss && rank.S &&\r
-                            specs.Types.Count(type => type == 2) >= 2 &&\r
-                            specs.Specs.Count(spec => spec.IsAircraftCarrier) >= 2)\r
-                        {\r
-                            Increment(count);\r
-                        }\r
-                        break;\r
-                    case 266:\r
-                        if (_map == 25 && _boss && rank.S &&\r
-                            specs.FlagshipType == 2 &&\r
-                            specs.Types.OrderBy(x => x).SequenceEqual(new[] {2, 2, 2, 2, 3, 5}))\r
-                        {\r
-                            Increment(count);\r
-                        }\r
-                        break;\r
-                    case 280:\r
-                        if (_boss && rank.S &&\r
-                            specs.Types.Count(type => type == 1 || type == 2) >= 3 &&\r
-                            specs.Types.Intersect(new[] {3, 4, 7, 21}).Any())\r
-                        {\r
-                            switch (_map)\r
-                            {\r
-                                case 12:\r
-                                    IncrementNth(count, 0);\r
-                                    break;\r
-                                case 13:\r
-                                    IncrementNth(count, 1);\r
-                                    break;\r
-                                case 14:\r
-                                    IncrementNth(count, 2);\r
-                                    break;\r
-                                case 21:\r
-                                    IncrementNth(count, 3);\r
-                                    break;\r
-                            }\r
-                        }\r
-                        break;\r
-                    case 284:\r
-                        if (_boss && rank.S &&\r
-                            specs.Types.Count(type => type == 1 || type == 2) >= 3 &&\r
-                            specs.Types.Intersect(new[] {3, 4, 7, 21}).Any())\r
-                        {\r
-                            switch (_map)\r
-                            {\r
-                                case 14:\r
-                                    IncrementNth(count, 0);\r
-                                    break;\r
-                                case 21:\r
-                                    IncrementNth(count, 1);\r
-                                    break;\r
-                                case 22:\r
-                                    IncrementNth(count, 2);\r
-                                    break;\r
-                                case 23:\r
-                                    IncrementNth(count, 3);\r
-                                    break;\r
-                            }\r
-                        }\r
-                        break;\r
-                    case 854:\r
-                        if (_boss)\r
-                        {\r
-                            switch (_map)\r
-                            {\r
-                                case 24 when rank.A:\r
-                                    IncrementNth(count, 0);\r
-                                    break;\r
-                                case 61 when rank.A:\r
-                                    IncrementNth(count, 1);\r
-                                    break;\r
-                                case 63 when rank.A:\r
-                                    IncrementNth(count, 2);\r
-                                    break;\r
-                                case 64 when rank.S:\r
-                                    IncrementNth(count, 3);\r
-                                    break;\r
-                            }\r
-                        }\r
-                        break;\r
-                    case 862:\r
-                        if (_map == 63 && _boss && rank.A &&\r
-                            specs.Types.Count(s => s == 3) >= 2 &&\r
-                            specs.Types.Count(s => s == 16) >= 1)\r
-                        {\r
-                            Increment(count);\r
-                        }\r
-                        break;\r
-                    case 872:\r
-                        if (_boss && rank.S)\r
-                        {\r
-                            switch (_map)\r
-                            {\r
-                                case 72:\r
-                                    if (_cell != 7)\r
-                                        IncrementNth(count, 0);\r
-                                    break;\r
-                                case 55:\r
-                                    IncrementNth(count, 1);\r
-                                    break;\r
-                                case 62:\r
-                                    IncrementNth(count, 2);\r
-                                    break;\r
-                                case 65:\r
-                                    IncrementNth(count, 3);\r
-                                    break;\r
-                            }\r
-                        }\r
-                        break;\r
-                    case 873:\r
-                        if (_boss && rank.A &&\r
-                            specs.Types.Count(type => type == 3) >= 1)\r
-                        {\r
-                            switch (_map)\r
-                            {\r
-                                case 31:\r
-                                    IncrementNth(count, 0);\r
-                                    break;\r
-                                case 32:\r
-                                    IncrementNth(count, 1);\r
-                                    break;\r
-                                case 33:\r
-                                    IncrementNth(count, 2);\r
-                                    break;\r
-                            }\r
-                        }\r
-                        break;\r
-                    case 875:\r
-                        if (_map == 54 && _boss && rank.S &&\r
-                            specs.Ids.Contains(543) &&\r
-                            specs.Ids.Intersect(new[] {344, 345, 359}).Any())\r
-                        {\r
-                            Increment(count);\r
-                        }\r
-                        break;\r
-                    case 888:\r
-                        if (_boss && rank.S &&\r
-                            specs.Ids.Intersect(new[]\r
-                            {\r
-                                69, 272, 427, // 鳥海\r
-                                61, 264, // 青葉\r
-                                123, 295, 142, // 衣笠\r
-                                59, 262, 416, // 古鷹\r
-                                60, 263, 417, // 加古\r
-                                51, 213, 477, // 天龍\r
-                                115, 293 // 夕張\r
-                            }).Count() >= 4)\r
-                        {\r
-                            switch (_map)\r
-                            {\r
-                                case 51:\r
-                                    IncrementNth(count, 0);\r
-                                    break;\r
-                                case 53:\r
-                                    IncrementNth(count, 1);\r
-                                    break;\r
-                                case 54:\r
-                                    IncrementNth(count, 2);\r
-                                    break;\r
-                            }\r
-                        }\r
-                        break;\r
-                    case 893:\r
-                        if (_boss && rank.S)\r
-                        {\r
-                            switch (_map)\r
-                            {\r
-                                case 15:\r
-                                    IncrementNth(count, 0);\r
-                                    break;\r
-                                case 71:\r
-                                    IncrementNth(count, 1);\r
-                                    break;\r
-                                case 72:\r
-                                    if (_cell == 7)\r
-                                    {\r
-                                        IncrementNth(count, 2);\r
-                                        break;\r
-                                    }\r
-                                    IncrementNth(count, 3);\r
-                                    break;\r
-                            }\r
-                            break;\r
-                        }\r
-                        return;\r
-                    case 894:\r
-                        if (_boss && rank.S &&\r
-                            specs.Specs.Any(spec => spec.IsAircraftCarrier))\r
-                        {\r
-                            switch (_map)\r
-                            {\r
-                                case 13:\r
-                                    IncrementNth(count, 0);\r
-                                    break;\r
-                                case 14:\r
-                                    IncrementNth(count, 1);\r
-                                    break;\r
-                                case 21:\r
-                                    IncrementNth(count, 2);\r
-                                    break;\r
-                                case 22:\r
-                                    IncrementNth(count, 3);\r
-                                    break;\r
-                                case 23:\r
-                                    IncrementNth(count, 4);\r
-                                    break;\r
-                            }\r
-                        }\r
-                        break;\r
-                }\r
+                if (count.Id == 214)\r
+                    CountAgo(count, rank);\r
+            }\r
+        }\r
+\r
+        private void CountAgo(QuestCount count, string rank)\r
+        {\r
+            if (QuestSortie.CompareRank(rank, "S") == 0)\r
+                IncrementNth(count, 1);\r
+            if (!_boss)\r
+                return;\r
+            IncrementNth(count, 2);\r
+            if (QuestSortie.CompareRank(rank, "B") <= 0)\r
+                IncrementNth(count, 3);\r
+        }\r
+\r
+        private bool FleetCheck(int id)\r
+        {\r
+            var specs = new ResultShipSpecs(_battleInfo);\r
+            switch (id)\r
+            {\r
+                case 249:\r
+                    return specs.Ids.Intersect(new[] {62, 63, 64, 265, 266, 268, 319, 192, 194}).Count() == 3;\r
+                case 257:\r
+                    return specs.FlagshipType == 3 && specs.Types.Count(s => s == 3) <= 3 &&\r
+                           specs.Types.All(s => s == 2 || s == 3);\r
+                case 259:\r
+                    return specs.Types.Count(type => type == 3) > 0 && specs.Classes.Count(c => new[]\r
+                    {\r
+                        2, // 伊勢型\r
+                        19, // 長門型\r
+                        26, // 扶桑型\r
+                        37 // 大和型\r
+                    }.Contains(c)) == 3;\r
+                case 264:\r
+                    return specs.Types.Count(type => type == 2) >= 2 &&\r
+                           specs.Specs.Count(spec => spec.IsAircraftCarrier) >= 2;\r
+                case 266:\r
+                    return specs.FlagshipType == 2 &&\r
+                           specs.Types.OrderBy(x => x).SequenceEqual(new[] {2, 2, 2, 2, 3, 5});\r
+                case 280:\r
+                case 284:\r
+                    return specs.Types.Count(type => type == 1 || type == 2) >= 3 &&\r
+                           specs.Types.Intersect(new[] {3, 4, 7, 21}).Any();\r
+                case 862:\r
+                    return specs.Types.Count(s => s == 3) >= 2 && specs.Types.Count(s => s == 16) >= 1;\r
+                case 873:\r
+                    return specs.Types.Count(type => type == 3) >= 1;\r
+                case 875:\r
+                    return specs.Ids.Contains(543) &&\r
+                           specs.Ids.Intersect(new[] {344, 345, 359}).Any();\r
+                case 888:\r
+                    return specs.Ids.Intersect(new[]\r
+                    {\r
+                        69, 272, 427, // 鳥海\r
+                        61, 264, // 青葉\r
+                        123, 295, 142, // 衣笠\r
+                        59, 262, 416, // 古鷹\r
+                        60, 263, 417, // 加古\r
+                        51, 213, 477, // 天龍\r
+                        115, 293 // 夕張\r
+                    }).Count() >= 4;\r
+                case 894:\r
+                    return specs.Specs.Any(spec => spec.IsAircraftCarrier);\r
+                case 318:\r
+                    return specs.Types.Count(type => type == 3) >= 2;\r
+                case 330:\r
+                    return specs.Flagship.IsAircraftCarrier &&\r
+                           specs.Specs.Count(spec => spec.IsAircraftCarrier) >= 2 &&\r
+                           specs.Types.Count(type => type == 2) >= 2;\r
+                default:\r
+                    return true;\r
             }\r
         }\r
 \r
@@ -522,36 +339,16 @@ namespace KancolleSniffer.Model
 \r
         public void InspectPracticeResult(dynamic json)\r
         {\r
-            var rank = new Rank(json.api_win_rank);\r
-            var specs = new ResultShipSpecs(_battleInfo);\r
-            foreach (var quest in _quests.Values)\r
+            foreach (var count in _quests.Values.Select(q => q.Count))\r
             {\r
-                var count = quest.Count;\r
-                if (count.Spec is QuestPractice practice)\r
-                {\r
-                    if (practice.Check(json.api_win_rank))\r
-                        Increment(count);\r
+                if (!FleetCheck(count.Id))\r
                     continue;\r
-                }\r
-                switch (quest.Id)\r
-                {\r
-                    case 318:\r
-                        if (_questFleet == 0 && rank.B &&\r
-                            specs.Types.Count(type => type == 3) >= 2)\r
-                        {\r
-                            Increment(count);\r
-                        }\r
-                        break;\r
-                    case 330:\r
-                        if (rank.B &&\r
-                            specs.Flagship.IsAircraftCarrier &&\r
-                            specs.Specs.Count(spec => spec.IsAircraftCarrier) >= 2 &&\r
-                            specs.Types.Count(type => type == 2) >= 2)\r
-                        {\r
-                            Increment(count);\r
-                        }\r
-                        break;\r
-                }\r
+                if (count.Id == 318 && _questFleet != 0)\r
+                    continue;\r
+                if (!(count.Spec is QuestPractice practice))\r
+                    continue;\r
+                if (practice.Check(json.api_win_rank))\r
+                    Increment(count);\r
             }\r
         }\r
 \r
@@ -570,49 +367,12 @@ namespace KancolleSniffer.Model
             if ((int)json.api_clear_result == 0)\r
                 return;\r
             var mid = _missionId[deck - 1];\r
-            foreach (var quest in _quests.Values)\r
+            foreach (var count in _quests.Values.Select(q => q.Count))\r
             {\r
-                var count = quest.Count;\r
-                if (count.Spec is QuestMission mission)\r
-                {\r
-                    if (mission.Check(mid))\r
-                        Increment(count);\r
+                if (!(count.Spec is QuestMission mission))\r
                     continue;\r
-                }\r
-                switch (quest.Id)\r
-                {\r
-                    case 426:\r
-                        switch (mid)\r
-                        {\r
-                            case 3:\r
-                                IncrementNth(count, 0);\r
-                                break;\r
-                            case 4:\r
-                                IncrementNth(count, 1);\r
-                                break;\r
-                            case 5:\r
-                                IncrementNth(count, 2);\r
-                                break;\r
-                            case 10:\r
-                                IncrementNth(count, 3);\r
-                                break;\r
-                        }\r
-                        break;\r
-                    case 428:\r
-                        switch (mid)\r
-                        {\r
-                            case 4:\r
-                                IncrementNth(count, 0);\r
-                                break;\r
-                            case 101:\r
-                                IncrementNth(count, 1);\r
-                                break;\r
-                            case 102:\r
-                                IncrementNth(count, 2);\r
-                                break;\r
-                        }\r
-                        break;\r
-                }\r
+                if (mission.Count(count, mid))\r
+                    NeedSave = true;\r
             }\r
         }\r
 \r
index 9aac102..31494b1 100644 (file)
@@ -31,6 +31,7 @@ namespace KancolleSniffer.Model
     public class QuestSortie : QuestSpec\r
     {\r
         public string Rank { get; set; }\r
+        public string[] Ranks { get; set; }\r
         public int[] Maps { get; set; }\r
 \r
         public static int CompareRank(string a, string b)\r
@@ -40,10 +41,38 @@ namespace KancolleSniffer.Model
                    ranks.IndexOf(b, StringComparison.Ordinal);\r
         }\r
 \r
-        public bool Check(string rank, int map, bool boss)\r
+        public bool Count(QuestCount count, string rank, int map, bool boss)\r
         {\r
-            return (Rank == null || CompareRank(rank, Rank) <= 0) &&\r
-                   (Maps == null || Maps.Contains(map) && boss);\r
+            if (Maps != null)\r
+            {\r
+                return boss && CheckMaps(count, rank, map);\r
+            }\r
+            return CountNow(count, rank);\r
+        }\r
+\r
+        private bool CheckMaps(QuestCount count, string rank, int map)\r
+        {\r
+            var idx = Array.FindIndex(Maps, m => m == map);\r
+            if (idx < 0)\r
+                return false;\r
+            return count.NowArray != null ? CountNowArray(count, rank, idx) : CountNow(count, rank);\r
+        }\r
+\r
+        private bool CountNowArray(QuestCount count, string rank, int idx)\r
+        {\r
+            var specRank = Ranks == null ? Rank : Ranks[idx];\r
+            if (CompareRank(rank, specRank) > 0)\r
+                return false;\r
+            count.NowArray[idx]++;\r
+            return true;\r
+        }\r
+\r
+        private bool CountNow(QuestCount count, string rank)\r
+        {\r
+            if (Rank != null && CompareRank(rank, Rank) > 0)\r
+                return false;\r
+            count.Now++;\r
+            return true;\r
         }\r
     }\r
 \r
@@ -64,7 +93,27 @@ namespace KancolleSniffer.Model
     public class QuestMission : QuestSpec\r
     {\r
         public int[] Ids { get; set; }\r
-        public bool Check(int id) => Ids == null || Ids.Contains(id);\r
+\r
+        public bool Count(QuestCount count, int id)\r
+        {\r
+            if (Ids == null)\r
+            {\r
+                count.Now++;\r
+                return true;\r
+            }\r
+            var idx = Array.FindIndex(Ids, n => n == id);\r
+            if (idx < 0)\r
+                return false;\r
+            if (count.NowArray == null)\r
+            {\r
+                count.Now++;\r
+            }\r
+            else\r
+            {\r
+                count.NowArray[idx]++;\r
+            }\r
+            return true;\r
+        }\r
     }\r
 \r
     public class QuestDestroyItem : QuestSpec\r