OSDN Git Service

精鋭「十九駆」、躍り出る!のカウンターを実装する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Tue, 3 Mar 2020 12:14:04 +0000 (21:14 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Tue, 3 Mar 2020 12:14:04 +0000 (21:14 +0900)
KancolleSniffer.Test/QuestCounterTest.cs
KancolleSniffer.Test/QuestInfoTest.cs
KancolleSniffer/Model/QuestCountList.cs
KancolleSniffer/Model/QuestCounter.cs
KancolleSniffer/Model/QuestInfo.cs

index db794f5..667c8c1 100644 (file)
@@ -1046,6 +1046,45 @@ namespace KancolleSniffer.Test
         }\r
 \r
         /// <summary>\r
+        /// 904: 精鋭「十九駆」、躍り出る!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_904()\r
+        {\r
+            var count = InjectQuest(904);\r
+            _battleInfo.InjectResultStatus(\r
+                new []{ShipStatus("綾波改二"), ShipStatus("敷波")},\r
+                new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+\r
+            InjectMapNext(25, 5);\r
+            InjectBattleResult("S");\r
+            PAssert.That(() => count.NowArray.SequenceEqual(new[] {0, 0, 0, 0}), "敷波はカウントしない");\r
+\r
+            _battleInfo.Result.Friend.Main[1] = ShipStatus("敷波改二");\r
+            InjectBattleResult("A");\r
+            PAssert.That(() => count.NowArray.SequenceEqual(new[] {0, 0, 0, 0}), "A勝利はカウントしない");\r
+\r
+            InjectBattleResult("S");\r
+            PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 0, 0, 0}), "2-5");\r
+\r
+            InjectMapNext(34, 4);\r
+            InjectBattleResult("S");\r
+            PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 0, 0, 0}), "ボス以外はカウントしない");\r
+\r
+            InjectMapNext(34, 5);\r
+            InjectBattleResult("S");\r
+            PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 0, 0}), "3-4");\r
+\r
+            InjectMapNext(45, 5);\r
+            InjectBattleResult("S");\r
+            PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 1, 0}), "4-5");\r
+\r
+            InjectMapNext(53, 5);\r
+            InjectBattleResult("S");\r
+            PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 1, 1}), "5-3");\r
+        }\r
+\r
+        /// <summary>\r
         /// 280と854以降を同時に遂行していると854以降がカウントされないことがある\r
         /// </summary>\r
         [TestMethod]\r
index 2633b16..9a5539c 100644 (file)
@@ -31,7 +31,7 @@ namespace KancolleSniffer.Test
             var queue = new Queue<DateTime>(new[]\r
             {\r
                 new DateTime(2017, 11, 1, 5, 0, 0), new DateTime(2017, 11, 6, 5, 0, 0),\r
-                new DateTime(2017, 12, 1, 5, 0, 0)\r
+                new DateTime(2017, 12, 1, 5, 0, 0), new DateTime(2018, 2, 1, 5, 0, 0)\r
             });\r
             var questInfo = new QuestInfo(() => queue.Dequeue());\r
             var status = new Status\r
@@ -39,7 +39,8 @@ namespace KancolleSniffer.Test
                 QuestCountList = new[]\r
                 {\r
                     new QuestCount {Id = 201, Now = 1}, new QuestCount {Id = 213, Now = 1},\r
-                    new QuestCount {Id = 265, Now = 1}, new QuestCount {Id = 822, Now = 1}\r
+                    new QuestCount {Id = 265, Now = 1}, new QuestCount {Id = 822, Now = 1},\r
+                    new QuestCount {Id = 904, NowArray = new[] {1, 1, 1, 1}}\r
                 },\r
                 QuestLastReset = new DateTime(2017, 10, 31, 5, 0, 0)\r
             };\r
@@ -47,16 +48,16 @@ namespace KancolleSniffer.Test
             questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
             questInfo.SaveState(status);\r
             PAssert.That(() =>\r
-                status.QuestCountList.Select(qc => new {qc.Id, qc.Now}).SequenceEqual(new[]\r
-                    {new {Id = 213, Now = 1}, new {Id = 822, Now = 1}})); // デイリーとマンスリーが消える\r
+                status.QuestCountList.Select(qc => qc.Id).SequenceEqual(new[] {213, 822, 904})); // デイリーとマンスリーが消える\r
             questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
             questInfo.SaveState(status);\r
-            PAssert.That(() =>\r
-                status.QuestCountList.Select(qc => new {qc.Id, qc.Now}).SequenceEqual(new[]\r
-                    {new {Id = 822, Now = 1}})); // ウィークリーが消える\r
+            PAssert.That(() => status.QuestCountList.Select(qc => qc.Id).SequenceEqual(new[] {822, 904})); // ウィークリーが消える\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
+            questInfo.SaveState(status);\r
+            PAssert.That(() => status.QuestCountList.Select(qc => qc.Id).SequenceEqual(new[] {904})); // クォータリーが消える\r
             questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
             questInfo.SaveState(status);\r
-            PAssert.That(() => status.QuestCountList.Length == 0); // ã\82¯ã\82©ã\83¼ã\82¿リーが消える\r
+            PAssert.That(() => status.QuestCountList.Length == 0); // ã\82¤ã\83¤ã\83¼リーが消える\r
         }\r
 \r
         [TestMethod]\r
index 42043d5..1051a41 100644 (file)
@@ -23,6 +23,7 @@ namespace KancolleSniffer.Model
         private const QuestInterval Weekly = QuestInterval.Weekly;\r
         private const QuestInterval Monthly = QuestInterval.Monthly;\r
         private const QuestInterval Quarterly = QuestInterval.Quarterly;\r
+        private const QuestInterval Yearly = QuestInterval.Yearly;\r
 \r
         /// <summary>\r
         /// このテーブルは七四式電子観測儀を参考に作成した。\r
@@ -71,6 +72,7 @@ namespace KancolleSniffer.Model
             {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
+            {904, new QuestSortie {Interval = Yearly, MaxArray = new[] {1, 1, 1, 1}, Rank = "S", Maps = new[] {25, 34, 45, 53}, Material = new[] {0, 8, 10, 4}}}, // 904: 精鋭「十九駆」、躍り出る!\r
 \r
             {303, new QuestPractice {Interval = Daily, Max = 3, Rank = "E", Material = new[] {1, 0, 0, 0}}}, // 303: 「演習」で練度向上!\r
             {304, new QuestPractice {Interval = Daily, Max = 5, Rank = "B", Material = new[] {0, 0, 1, 0}}}, // 304: 「演習」で他提督を圧倒せよ!\r
index 1f4bdc5..5440563 100644 (file)
@@ -313,6 +313,8 @@ namespace KancolleSniffer.Model
                     return specs.Names.Count("陽炎", "不知火", "霰", "霞") == 4;\r
                 case 339:\r
                     return specs.Names.Count("磯波", "浦波", "綾波", "敷波") == 4;\r
+                case 904:\r
+                    return specs.Names.Count("綾波改二", "敷波改二") == 2;\r
                 default:\r
                     return true;\r
             }\r
index a79aacb..e7dbbce 100644 (file)
@@ -62,7 +62,8 @@ namespace KancolleSniffer.Model
         Daily,\r
         Weekly,\r
         Monthly,\r
-        Quarterly\r
+        Quarterly,\r
+        Yearly\r
     }\r
 \r
     public class QuestInfo : IHaveState\r
@@ -117,7 +118,7 @@ namespace KancolleSniffer.Model
         private readonly QuestInterval[] _intervals =\r
         {\r
             QuestInterval.Daily, QuestInterval.Weekly, QuestInterval.Monthly,\r
-            QuestInterval.Other, QuestInterval.Quarterly\r
+            QuestInterval.Other, QuestInterval.Quarterly, QuestInterval.Yearly\r
         };\r
 \r
         private readonly int[] _progress = {0, 50, 80};\r
@@ -194,45 +195,37 @@ namespace KancolleSniffer.Model
         private void ResetQuests()\r
         {\r
             _now = _nowFunc();\r
-            if (!CrossBoundary(LastMorning))\r
+            if (!CrossBoundary(QuestInterval.Daily))\r
                 return;\r
-            RemoveQuest(QuestInterval.Daily);\r
-            _countList.Remove(QuestInterval.Daily);\r
-            ResetWeekly();\r
-            ResetMonthly();\r
-            ResetQuarterly();\r
+            foreach (var interval in (QuestInterval[])typeof(QuestInterval).GetEnumValues())\r
+            {\r
+                if (!CrossBoundary(interval))\r
+                    continue;\r
+                RemoveQuest(interval);\r
+                _countList.Remove(interval);\r
+            }\r
             _lastReset = _now;\r
             NeedSave = true;\r
         }\r
 \r
         private DateTime LastMorning => _now.Date.AddDays(_now.Hour < 5 ? -1 : 0).AddHours(5);\r
 \r
-        private void ResetWeekly()\r
+        private bool CrossBoundary(QuestInterval interval)\r
         {\r
-            if (!CrossBoundary(LastMonday.AddHours(5)))\r
-                return;\r
-            RemoveQuest(QuestInterval.Weekly);\r
-            _countList.Remove(QuestInterval.Weekly);\r
+            return interval switch\r
+            {\r
+                QuestInterval.Other => false,\r
+                QuestInterval.Daily => CrossBoundary(LastMorning),\r
+                QuestInterval.Weekly => CrossBoundary(LastMonday.AddHours(5)),\r
+                QuestInterval.Monthly => CrossBoundary(new DateTime(_now.Year, _now.Month, 1, 5, 0, 0)),\r
+                QuestInterval.Quarterly => CrossBoundary(QuarterlyBoundary.AddHours(5)),\r
+                QuestInterval.Yearly => CrossBoundary(new DateTime(_now.Year, 2, 1, 5, 0, 0)),\r
+                _ => false\r
+            };\r
         }\r
 \r
         private DateTime LastMonday => _now.Date.AddDays(-((6 + (int)_now.DayOfWeek) % 7));\r
 \r
-        private void ResetMonthly()\r
-        {\r
-            if (!CrossBoundary(new DateTime(_now.Year, _now.Month, 1, 5, 0, 0)))\r
-                return;\r
-            RemoveQuest(QuestInterval.Monthly);\r
-            _countList.Remove(QuestInterval.Monthly);\r
-        }\r
-\r
-        private void ResetQuarterly()\r
-        {\r
-            if (!CrossBoundary(QuarterlyBoundary.AddHours(5)))\r
-                return;\r
-            RemoveQuest(QuestInterval.Quarterly);\r
-            _countList.Remove(QuestInterval.Quarterly);\r
-        }\r
-\r
         private DateTime QuarterlyBoundary =>\r
             _now.Month / 3 == 0\r
                 ? new DateTime(_now.Year - 1, 12, 1)\r
@@ -247,12 +240,19 @@ namespace KancolleSniffer.Model
         {\r
             foreach (var id in\r
                 (from kv in _quests\r
-                    where kv.Value.Count.Spec.Interval == interval || // 輸送5と空母3はカウンタを見ないとデイリーにならない\r
-                          kv.Value.Interval == interval\r
+                    where MatchInterval(kv.Value, interval)\r
                     select kv.Key).ToArray())\r
                 _quests.Remove(id);\r
         }\r
 \r
+        private bool MatchInterval(QuestStatus quest, QuestInterval interval)\r
+        {\r
+            var i = quest.Count.Spec.Interval;\r
+            return i == QuestInterval.Other // 定期任務の定義がない\r
+                ? quest.Interval == interval\r
+                : i == interval;\r
+        }\r
+\r
         public void InspectStop(string request)\r
         {\r
             var values = HttpUtility.ParseQueryString(request);\r
@@ -294,5 +294,4 @@ namespace KancolleSniffer.Model
             }\r
         }\r
     }\r
-\r
 }
\ No newline at end of file