OSDN Git Service

任務カウンターの編成判定を艦娘名で行う
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 25 Jan 2020 11:43:52 +0000 (20:43 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 25 Jan 2020 11:43:52 +0000 (20:43 +0900)
KancolleSniffer.Test/QuestCounterTest.cs
KancolleSniffer/Model/QuestCounter.cs

index 876b749..015c85e 100644 (file)
@@ -251,6 +251,18 @@ namespace KancolleSniffer.Test
             return new ShipStatus {NowHp = 1, Spec = new ShipSpec {Id = specId, ShipType = shipType}};\r
         }\r
 \r
+        private ShipStatus ShipStatus(int shipType, int shipClass, int specId)\r
+        {\r
+            return new ShipStatus\r
+                {NowHp = 1, Spec = new ShipSpec {Id = specId, ShipType = shipType, ShipClass = shipClass}};\r
+        }\r
+\r
+        private ShipStatus ShipStatus(string name)\r
+        {\r
+            return new ShipStatus {NowHp = 1, Spec = new ShipSpec {Name = name}};\r
+        }\r
+\r
+\r
         private BattleInfo _battleInfo;\r
         private ItemInfo _itemInfo;\r
         private QuestInfo _questInfo;\r
@@ -411,8 +423,8 @@ namespace KancolleSniffer.Test
 \r
             _battleInfo.InjectResultStatus(new[]\r
             {\r
-                ShipStatus(5, 319), ShipStatus(5, 192), ShipStatus(5, 194),\r
-                ShipStatus(5, 193), ShipStatus(6, 189), ShipStatus(6, 188)\r
+                ShipStatus("妙高改二"), ShipStatus("那智改二"), ShipStatus("羽黒改二"),\r
+                ShipStatus("足柄改二"), ShipStatus("筑摩改二"), ShipStatus("利根改二")\r
             }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
 \r
             InjectMapNext(25, 4);\r
@@ -424,11 +436,14 @@ namespace KancolleSniffer.Test
             Assert.AreEqual(0, count.Now);\r
             InjectBattleResult("S");\r
             Assert.AreEqual(1, count.Now);\r
-            _questInfo.Quests[0].Count.Now = 0;\r
+\r
+            _battleInfo.Result.Friend.Main[3].NowHp = 0;\r
+            InjectBattleResult("S");\r
+            Assert.AreEqual(2, count.Now, "足柄改二轟沈");\r
 \r
             _battleInfo.Result.Friend.Main[1].NowHp = 0;\r
             InjectBattleResult("S");\r
-            Assert.AreEqual(0, count.Now, "那智改二轟沈");\r
+            Assert.AreEqual(2, count.Now, "那智改二轟沈");\r
         }\r
 \r
         /// <summary>\r
@@ -476,9 +491,6 @@ namespace KancolleSniffer.Test
             Assert.AreEqual(0, count.Now, "駆逐軽巡以外");\r
         }\r
 \r
-        private ShipStatus ShipStatus(int shipType, int shipClass, int specId) =>\r
-            new ShipStatus {NowHp = 1, Spec = new ShipSpec {Id = specId, ShipType = shipType, ShipClass = shipClass}};\r
-\r
         /// <summary>\r
         /// 257: 「水上打撃部隊」南方へ!\r
         /// </summary>\r
@@ -870,8 +882,8 @@ namespace KancolleSniffer.Test
 \r
             _battleInfo.InjectResultStatus(new[]\r
             {\r
-                ShipStatus(2, 543), ShipStatus(8, 360), ShipStatus(11, 545),\r
-                ShipStatus(18, 467), ShipStatus(11, 261), ShipStatus(2, 344)\r
+                ShipStatus("長波改二"), ShipStatus("Iowa改"), ShipStatus("Saratoga Mk.II"),\r
+                ShipStatus("瑞鶴改二甲"), ShipStatus("望月改"), ShipStatus("朝霜改")\r
             }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
 \r
             InjectMapNext(54, 4);\r
@@ -889,18 +901,18 @@ namespace KancolleSniffer.Test
             Assert.AreEqual(1, count.Now, "朝霜改轟沈");\r
             _battleInfo.Result.Friend.Main[5].NowHp = 1;\r
 \r
-            _battleInfo.Result.Friend.Main[0].Spec.Id = 345;\r
+            _battleInfo.Result.Friend.Main[0] = ShipStatus("高波改");\r
             InjectBattleResult("S");\r
             Assert.AreEqual(1, count.Now, "長波改二なし");\r
-            _battleInfo.Result.Friend.Main[0].Spec.Id = 543;\r
+            _battleInfo.Result.Friend.Main[0] = ShipStatus("長波改二");\r
 \r
-            _battleInfo.Result.Friend.Main[5].Spec.Id = 345;\r
+            _battleInfo.Result.Friend.Main[5] = ShipStatus("高波改");\r
             InjectBattleResult("S");\r
             Assert.AreEqual(2, count.Now, "高波改");\r
-            _battleInfo.Result.Friend.Main[5].Spec.Id = 359;\r
+            _battleInfo.Result.Friend.Main[5] = ShipStatus("沖波改");\r
             InjectBattleResult("S");\r
             Assert.AreEqual(3, count.Now, "沖波改");\r
-            _battleInfo.Result.Friend.Main[5].Spec.Id = 578;\r
+            _battleInfo.Result.Friend.Main[5] = ShipStatus("朝霜改二");\r
             InjectBattleResult("S");\r
             Assert.AreEqual(4, count.Now, "朝霜改二");\r
         }\r
@@ -915,8 +927,8 @@ namespace KancolleSniffer.Test
 \r
             _battleInfo.InjectResultStatus(new[]\r
             {\r
-                ShipStatus(5, 427), ShipStatus(5, 264), ShipStatus(5, 142),\r
-                ShipStatus(5, 417), ShipStatus(2, 144), ShipStatus(2, 195)\r
+                ShipStatus("鳥海改二"), ShipStatus("青葉改"), ShipStatus("衣笠改二"),\r
+                ShipStatus("加古改二"), ShipStatus("夕立改二"), ShipStatus("綾波改二")\r
             }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
 \r
             InjectMapNext(51, 4);\r
@@ -933,11 +945,11 @@ namespace KancolleSniffer.Test
             PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 0, 0}), "轟沈あり");\r
             _battleInfo.Result.Friend.Main[0].NowHp = 1;\r
 \r
-            _battleInfo.Result.Friend.Main[0].Spec.Id = 319;\r
+            _battleInfo.Result.Friend.Main[0] = ShipStatus("妙高改二");\r
             InjectBattleResult("S");\r
             PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 0, 0}), "三川艦隊3隻");\r
-            _battleInfo.Result.Friend.Main[0].Spec.Id = 427;\r
 \r
+            _battleInfo.Result.Friend.Main[0] = ShipStatus("夕張改二特");\r
             InjectMapNext(53, 5);\r
             InjectBattleResult("S");\r
             PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 0}));\r
@@ -1169,18 +1181,18 @@ namespace KancolleSniffer.Test
 \r
             _battleInfo.InjectResultStatus(new []\r
             {\r
-                ShipStatus(2, 48), ShipStatus(2, 49),\r
-                ShipStatus(2, 17), ShipStatus(2, 18),\r
-                ShipStatus(2, 19)\r
+                ShipStatus("霰"), ShipStatus("霰"),\r
+                ShipStatus("陽炎"), ShipStatus("不知火"),\r
+                ShipStatus("黒潮")\r
             }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
             InjectPracticeResult("A");\r
             Assert.AreEqual(0, count.Now, "A");\r
             InjectPracticeResult("S");\r
             Assert.AreEqual(1, count.Now);\r
-            _battleInfo.Result.Friend.Main[0] = ShipStatus(2, 47);\r
+            _battleInfo.Result.Friend.Main[0] = ShipStatus("涼風");\r
             InjectPracticeResult("S");\r
             Assert.AreEqual(1, count.Now, "霰→涼風");\r
-            _battleInfo.Result.Friend.Main[4] = ShipStatus(2, 464);\r
+            _battleInfo.Result.Friend.Main[4] = ShipStatus("霞改二");\r
             InjectPracticeResult("S");\r
             Assert.AreEqual(2, count.Now, "黒潮→霞改二");\r
         }\r
index 2f7b0f5..cb4583b 100644 (file)
@@ -143,23 +143,43 @@ namespace KancolleSniffer.Model
 \r
         private class ResultShipSpecs\r
         {\r
+            public ShipSpec[] Specs { get; }\r
+            public NameChecker Names { get; }\r
+            public int[] Types { get; }\r
+            public int[] Classes { get; }\r
+            public ShipSpec Flagship { get; }\r
+            public int FlagshipType { get; }\r
+\r
+            public class NameChecker\r
+            {\r
+                private readonly string[] _names;\r
+\r
+                public NameChecker(ShipSpec[] specs)\r
+                {\r
+                    _names = specs.Select(spec => spec.Name).ToArray();\r
+                }\r
+\r
+                public bool Contains(string demand)\r
+                {\r
+                    return _names.Any(name => name.StartsWith(demand));\r
+                }\r
+\r
+                public int Count(params string[] demands)\r
+                {\r
+                    return demands.Sum(demand => _names.Count(name => name.StartsWith(demand)));\r
+                }\r
+            }\r
+\r
             public ResultShipSpecs(BattleInfo battleInfo)\r
             {\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
+                Names = new NameChecker(Specs);\r
                 Types = Specs.Select(spec => spec.ShipType).ToArray();\r
                 Classes = Specs.Select(spec => spec.ShipClass).ToArray();\r
                 Flagship = Specs.FirstOrDefault();\r
                 FlagshipType = Types.FirstOrDefault();\r
             }\r
-\r
-            public ShipSpec[] Specs { get; }\r
-            public int[] Ids { get; }\r
-            public int[] Types { get; }\r
-            public int[] Classes { get; }\r
-            public ShipSpec Flagship { get; }\r
-            public int FlagshipType { get; }\r
         }\r
 \r
         public QuestCounter(QuestInfo questInfo, ItemInfo itemInfo, BattleInfo battleInfo)\r
@@ -250,7 +270,7 @@ namespace KancolleSniffer.Model
             switch (id)\r
             {\r
                 case 249:\r
-                    return specs.Ids.Intersect(new[] {62, 63, 64, 265, 266, 268, 319, 192, 194}).Count() == 3;\r
+                    return specs.Names.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
@@ -277,25 +297,10 @@ namespace KancolleSniffer.Model
                 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[]\r
-                           {\r
-                               344, // 朝霜改\r
-                               345, // 高波改\r
-                               359, // 沖波改\r
-                               578 // 朝霜改二\r
-                           }).Any();\r
+                    return specs.Names.Contains("長波改二") &&\r
+                           specs.Names.Count("朝霜改", "高波改", "沖波改") > 0;\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
+                    return specs.Names.Count("鳥海", "青葉", "衣笠", "加古", "天竜", "夕張") >= 4;\r
                 case 894:\r
                     return specs.Specs.Any(spec => spec.IsAircraftCarrier);\r
                 case 318:\r
@@ -305,13 +310,7 @@ namespace KancolleSniffer.Model
                            specs.Specs.Count(spec => spec.IsAircraftCarrier) >= 2 &&\r
                            specs.Types.Count(type => type == 2) >= 2;\r
                 case 337:\r
-                    return specs.Ids.Intersect(new[]\r
-                    {\r
-                        17, 225, 566, // 陽炎\r
-                        18, 226, 567, // 不知火\r
-                        48, 198, 252, // 霰\r
-                        49, 253, 464 // 霞\r
-                    }).Count() == 4;\r
+                    return specs.Names.Count("陽炎", "不知火", "霰", "霞") == 4;\r
                 default:\r
                     return true;\r
             }\r