OSDN Git Service

任務カウンターの表の記述力を上げる
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Model / QuestCounter.cs
index b662e9f..e2cd4a4 100644 (file)
@@ -77,7 +77,7 @@ namespace KancolleSniffer.Model
 \r
         public override string ToString()\r
         {\r
-            if (Id == 280 || Id == 426 || Id == 854 || Id == 873 || Id == 888 || Id == 894)\r
+            if (Id == 280 || Id == 284 || Id == 426 || Id == 854 || Id == 872 || Id == 873 || Id == 888 || Id == 894)\r
                 return $"{NowArray.Count(n => n >= 1)}/{Spec.MaxArray.Length}";\r
             return NowArray != null\r
                 ? string.Join(" ", NowArray.Zip(Spec.MaxArray, (n, m) => $"{n}/{m}"))\r
@@ -109,6 +109,10 @@ namespace KancolleSniffer.Model
                     return string.Join(" ",\r
                         new[] {"1-2", "1-3", "1-4", "2-1"}.Zip(NowArray, (map, n) => n >= 1 ? map : "")\r
                             .Where(s => !string.IsNullOrEmpty(s)));\r
+                case 284:\r
+                    return string.Join(" ",\r
+                        new[] {"1-4", "2-1", "2-2", "2-3"}.Zip(NowArray, (map, n) => n >= 1 ? map : "")\r
+                            .Where(s => !string.IsNullOrEmpty(s)));\r
                 case 426:\r
                     return string.Join(" ",\r
                         new[] {"警備任務", "対潜警戒任務", "海上護衛任務", "強硬偵察任務"}\r
@@ -122,6 +126,10 @@ namespace KancolleSniffer.Model
                     return string.Join(" ",\r
                         new[] {"2-4", "6-1", "6-3", "6-4"}.Zip(NowArray, (map, n) => n >= 1 ? map : "")\r
                             .Where(s => !string.IsNullOrEmpty(s)));\r
+                case 872:\r
+                    return string.Join(" ",\r
+                        new[] {"7-2M", "5-5", "6-2", "6-5"}.Zip(NowArray, (map, n) => n >= 1 ? map : "")\r
+                            .Where(s => !string.IsNullOrEmpty(s)));\r
                 case 873:\r
                     return string.Join(" ",\r
                         new[] {"3-1", "3-2", "3-3"}.Zip(NowArray, (map, n) => n >= 1 ? map : "")\r
@@ -157,14 +165,14 @@ 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
         {\r
             public ResultShipSpecs(BattleInfo battleInfo)\r
             {\r
-                Specs = battleInfo.Result?.Friend.Main.Where(s => s.NowHp > 0).Select(ship => ship.Spec).ToArray() ?? new ShipSpec[0];\r
+                Specs = battleInfo.Result?.Friend.Main.Where(s => s.NowHp > 0).Select(ship => ship.Spec).ToArray() ??\r
+                        new ShipSpec[0];\r
                 Ids = Specs.Select(spec => spec.Id).ToArray();\r
                 Types = Specs.Select(spec => spec.ShipType).ToArray();\r
                 Classes = Specs.Select(spec => spec.ShipClass).ToArray();\r
@@ -203,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
@@ -213,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
@@ -248,213 +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
-                            return;\r
-                        if (!(specs.Types.Count(type => type == 1 || type == 2) >= 3 &&\r
-                              specs.Types.Any(type => new[] {3, 4, 7, 21}.Contains(type))))\r
-                            return;\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
-                        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 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
-                            return;\r
-                        var member = 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
-                        };\r
-                        if (specs.Ids.Intersect(member).Count() < 4)\r
-                            return;\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
-                        break;\r
-                    case 893:\r
-                        if (!_boss || !rank.S)\r
-                            return;\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
-                    case 894:\r
-                        if (!_boss || !rank.S ||\r
-                            !specs.Specs.Any(spec => spec.IsAircraftCarrier))\r
-                            return;\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
-                        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
@@ -468,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
@@ -516,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
@@ -566,10 +380,12 @@ namespace KancolleSniffer.Model
 \r
         public void CountCharge() => Increment(504);\r
 \r
-        public void CountCreateItem()\r
+        public void InspectCreateItem(string request)\r
         {\r
-            Increment(605);\r
-            Increment(607);\r
+            var values = HttpUtility.ParseQueryString(request);\r
+            var count = values["api_multiple_flag"] == "1" ? 3 : 1;\r
+            Add(605, count);\r
+            Add(607, count);\r
         }\r
 \r
         public void CountCreateShip()\r