OSDN Git Service

歴戦「第十方面艦隊」、全力出撃!のカウンターに編成チェックがないのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Model / QuestCounter.cs
index cb4583b..cc3e3e6 100644 (file)
@@ -115,17 +115,19 @@ namespace KancolleSniffer.Model
         {\r
             if (NowArray == null)\r
                 return "";\r
-            if (Spec is QuestSortie spec && spec.Maps != null && spec.MaxArray != null)\r
+            switch (Spec)\r
             {\r
-                return string.Join(" ", spec.Maps.Zip(NowArray, (map, n) => $"{MapString(map)}:{n}"));\r
+                case QuestSortie sortie when sortie.Maps != null && sortie.MaxArray != null:\r
+                    return string.Join(" ", sortie.Maps.Zip(NowArray, (map, n) => $"{MapString(map)}:{n}"));\r
+                case QuestMission mission when mission.Ids != null:\r
+                    return string.Join(" ", mission.Names.Zip(NowArray, (name, n) => $"{name}{n}"));\r
+                default:\r
+                    return string.Join(" ", (Id switch\r
+                    {\r
+                        688 => new[] {"艦戦", "艦爆", "艦攻", "水偵"},\r
+                        _ => new string[0]\r
+                    }).Zip(NowArray, (entry, n) => $"{entry}{n}"));\r
             }\r
-            return string.Join(" ", (Id switch\r
-            {\r
-                426 => new[] {"警備任務", "対潜警戒任務", "海上護衛任務", "強硬偵察任務"},\r
-                428 => new[] {"対潜警戒任務", "海峡警備行動", "長時間対潜警戒"},\r
-                688 => new[] {"艦戦", "艦爆", "艦攻", "水偵"},\r
-                _ => new string[0]\r
-            }).Zip(NowArray, (entry, n) => $"{entry}{n}"));\r
         }\r
 \r
         public bool Cleared => NowArray?.Zip(Spec.MaxArray, (n, m) => n >= m).All(x => x) ??\r
@@ -135,7 +137,8 @@ namespace KancolleSniffer.Model
     public class QuestCounter\r
     {\r
         private readonly QuestInfo _questInfo;\r
-        private readonly ItemInfo _itemInfo;\r
+        private readonly ItemInventory _itemInventory;\r
+        private readonly ShipInventory _shipInventory;\r
         private readonly BattleInfo _battleInfo;\r
         private readonly SortedDictionary<int, QuestStatus> _quests;\r
         private int _map;\r
@@ -182,11 +185,12 @@ namespace KancolleSniffer.Model
             }\r
         }\r
 \r
-        public QuestCounter(QuestInfo questInfo, ItemInfo itemInfo, BattleInfo battleInfo)\r
+        public QuestCounter(QuestInfo questInfo, ItemInventory itemInventory, ShipInventory shipInventory, BattleInfo battleInfo)\r
         {\r
             _questInfo = questInfo;\r
             _quests = questInfo.QuestDictionary;\r
-            _itemInfo = itemInfo;\r
+            _itemInventory = itemInventory;\r
+            _shipInventory = shipInventory;\r
             _battleInfo = battleInfo;\r
         }\r
 \r
@@ -205,21 +209,33 @@ namespace KancolleSniffer.Model
         public void InspectMapNext(dynamic json)\r
         {\r
             _map = (int)json.api_maparea_id * 10 + (int)json.api_mapinfo_no;\r
+            var 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
+                    _map = 721;\r
+                else if (cell == 15)\r
+                    _map = 722;\r
+            }\r
+            if (_map == 73)\r
+            {\r
+                if (cell == 5)\r
+                    _map = 731;\r
+                else if (cell == 18)\r
+                    _map = 732;\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
+            if (_map != 16 || (int)json.api_event_id != 8)\r
+                return;\r
+            foreach (var count in _quests.Values.Select(q => q.Count))\r
             {\r
-                if (new ResultShipSpecs(_battleInfo).Types.Count(s => s == 10 || s == 22) == 2)\r
-                    Increment(q861.Count);\r
+                if (!(count.Spec is QuestSortie sortie) || sortie.Maps == null)\r
+                    continue;\r
+                if (!FleetCheck(count.Id))\r
+                    continue;\r
+                if (sortie.Count(count, "S", _map, true))\r
+                    NeedSave = true;\r
             }\r
         }\r
 \r
@@ -292,6 +308,11 @@ namespace KancolleSniffer.Model
                 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 840:\r
+                    return new[] {3, 4, 7, 21}.Contains(specs.FlagshipType) &&\r
+                           specs.Types.Count(type => type == 2 || type == 1) >= 3;\r
+                case 861:\r
+                    return specs.Types.Count(s => s == 10 || s == 22) == 2;\r
                 case 862:\r
                     return specs.Types.Count(s => s == 3) >= 2 && specs.Types.Count(s => s == 16) >= 1;\r
                 case 873:\r
@@ -300,17 +321,41 @@ namespace KancolleSniffer.Model
                     return specs.Names.Contains("長波改二") &&\r
                            specs.Names.Count("朝霜改", "高波改", "沖波改") > 0;\r
                 case 888:\r
-                    return specs.Names.Count("鳥海", "é\9d\92è\91\89", "衣笠", "å\8a å\8f¤", "天ç«\9c", "夕張") >= 4;\r
+                    return specs.Names.Count("鳥海", "é\9d\92è\91\89", "衣笠", "å\8a å\8f¤", "å\8f¤é·¹", "天é¾\8d", "夕張") >= 4;\r
                 case 894:\r
                     return specs.Specs.Any(spec => spec.IsAircraftCarrier);\r
+                case 903:\r
+                    return specs.Flagship.Name.StartsWith("夕張改二") &&\r
+                           (specs.Names.Count("睦月", "如月", "弥生", "卯月", "菊月", "望月") >= 2 || specs.Names.Contains("由良改二"));\r
+                case 904:\r
+                    return specs.Names.Count("綾波改二", "敷波改二") == 2;\r
+                case 905:\r
+                    return specs.Types.Count(type => type == 1) >= 3 && specs.Types.Length <= 5;\r
+                case 912:\r
+                    return specs.Flagship.Name.StartsWith("明石") && specs.Types.Count(type => type == 2) >= 3;\r
+                case 914:\r
+                    return specs.Types.Count(type => type == 5) >= 3 && specs.Types.Count(type => type == 2) >= 1;\r
+                case 928:\r
+                    return specs.Names.Count("羽黒", "足柄", "妙高", "高雄", "神風") >= 2;\r
                 case 318:\r
                     return specs.Types.Count(type => type == 3) >= 2;\r
+                case 329:\r
+                    return specs.Types.Count(type => type == 2 || type == 1) >= 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
                 case 337:\r
                     return specs.Names.Count("陽炎", "不知火", "霰", "霞") == 4;\r
+                case 339:\r
+                    return specs.Names.Count("磯波", "浦波", "綾波", "敷波") == 4;\r
+                case 342:\r
+                    var t12 = specs.Types.Count(type => type == 1 || type == 2);\r
+                    return t12 >= 4 || t12 >= 3 && specs.Types.Intersect(new[] {3, 4, 7, 21}).Any();\r
+                case 345:\r
+                    return specs.Names.Count("Warspite", "金剛", "Ark Royal", "Nelson", "Jervis", "Janus") >= 4;\r
+                case 346:\r
+                    return specs.Names.Count("夕雲改二", "巻雲改二", "風雲改二", "秋雲改二") == 4;\r
                 default:\r
                     return true;\r
             }\r
@@ -388,11 +433,11 @@ namespace KancolleSniffer.Model
 \r
         public void CountRemodelSlot() => Increment(619);\r
 \r
-        public void InspectDestroyItem(string request, dynamic json)\r
+        public void InspectDestroyItem(string request)\r
         {\r
             var values = HttpUtility.ParseQueryString(request);\r
             var items = values["api_slotitem_ids"].Split(',')\r
-                .Select(id => _itemInfo.GetStatus(int.Parse(id)).Spec).ToArray();\r
+                .Select(id => _itemInventory[int.Parse(id)].Spec).ToArray();\r
             Increment(613); // 613: 資源の再利用\r
             foreach (var quest in _quests.Values)\r
             {\r
@@ -412,7 +457,7 @@ namespace KancolleSniffer.Model
             }\r
         }\r
 \r
-        public void InspectPowerUp(dynamic json)\r
+        public void InspectPowerUp(string request, dynamic json)\r
         {\r
             if ((int)json.api_powerup_flag == 0)\r
                 return;\r
@@ -421,27 +466,37 @@ namespace KancolleSniffer.Model
                 var count = quest.Count;\r
                 if (!(count.Spec is QuestPowerUp))\r
                     continue;\r
+                if (quest.Id == 714 || quest.Id == 715)\r
+                {\r
+                    var values = HttpUtility.ParseQueryString(request);\r
+                    if (_shipInventory[int.Parse(values["api_id"])].Spec.ShipType != 2)\r
+                        return;\r
+                    var ships = values["api_id_items"].Split(',').Select(id => _shipInventory[int.Parse(id)]).ToArray();\r
+                    var type = quest.Id == 714 ? 2 : quest.Id == 715 ? 3 : -1;\r
+                    if (ships.Count(s => s.Spec.ShipType == type) < 3)\r
+                        return;\r
+                }\r
                 Increment(count);\r
             }\r
         }\r
 \r
-        public void Increment(QuestCount count)\r
+        private void Increment(QuestCount count)\r
         {\r
             Add(count, 1);\r
         }\r
 \r
-        public void Add(QuestCount count, int value)\r
+        private void Add(QuestCount count, int value)\r
         {\r
             count.Now += value;\r
             NeedSave = true;\r
         }\r
 \r
-        public void Increment(int id)\r
+        private void Increment(int id)\r
         {\r
             Add(id, 1);\r
         }\r
 \r
-        public void Add(int id, int value)\r
+        private void Add(int id, int value)\r
         {\r
             if (!_quests.TryGetValue(id, out var quest))\r
                 return;\r
@@ -449,7 +504,7 @@ namespace KancolleSniffer.Model
             NeedSave = true;\r
         }\r
 \r
-        public void IncrementNth(QuestCount count, int n)\r
+        private void IncrementNth(QuestCount count, int n)\r
         {\r
             count.NowArray[n]++;\r
             NeedSave = true;\r