OSDN Git Service

出撃時に大破している艦娘がいたら大破警告を出す
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Mon, 28 Dec 2015 13:48:48 +0000 (22:48 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Tue, 29 Dec 2015 03:41:06 +0000 (12:41 +0900)
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer.Test/logs
KancolleSniffer/BattleInfo.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/ShipInfo.cs
KancolleSniffer/Sniffer.cs

index b842b4e..ce6e1c9 100644 (file)
@@ -83,7 +83,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "practice_001");\r
-            PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => !sniffer.BadlyDamagedShips.Any());\r
         }\r
 \r
         /// <summary>\r
@@ -95,7 +95,7 @@ namespace KancolleSniffer.Test
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "battle_002");\r
             AssertEqualBattleResult(sniffer, new[] {28, 1, 13});\r
-            PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => sniffer.BadlyDamagedShips.Any());\r
         }\r
 \r
         private void AssertEqualBattleResult(Sniffer sniffer, IEnumerable<int> expected, string msg = null)\r
@@ -113,11 +113,11 @@ namespace KancolleSniffer.Test
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "combined_surface_001");\r
             AssertEauqlCombinedResult(sniffer, new[] {40, 77, 77, 33, 51, 47}, new[] {39, 35, 11, 39, 37, 40});\r
-            PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => !sniffer.BadlyDamagedShips.Any());\r
 \r
             SniffLogFile(sniffer, "combined_surface_002");\r
             AssertEauqlCombinedResult(sniffer, new[] {40, 77, 77, 33, 15, 6}, new[] {39, 35, 4, 3, 14, 40});\r
-            PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => sniffer.BadlyDamagedShips.Any());\r
         }\r
 \r
         private void AssertEauqlCombinedResult(Sniffer sniffer, IEnumerable<int> expected0, IEnumerable<int> expected1,\r
@@ -137,7 +137,7 @@ namespace KancolleSniffer.Test
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "sp_midnight_001");\r
             AssertEqualBattleResult(sniffer, new[] {1});\r
-            PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => sniffer.BadlyDamagedShips.Any());\r
         }\r
 \r
         /// <summary>\r
@@ -149,7 +149,7 @@ namespace KancolleSniffer.Test
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "combined_air_001");\r
             AssertEauqlCombinedResult(sniffer, new[] {40, 98, 90, 66, 78, 86}, new[] {47, 41, 5, 42, 43, 29});\r
-            PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => sniffer.BadlyDamagedShips.Any());\r
 \r
             SniffLogFile(sniffer, "combined_air_002");\r
             AssertEauqlCombinedResult(sniffer, new[] {13, 87, 90, 59, 69, 86}, new[] {47, 41, 5, 20, 43, 29});\r
@@ -165,20 +165,20 @@ namespace KancolleSniffer.Test
             SniffLogFile(sniffer, "combined_escape_001");\r
             AssertEauqlCombinedResult(sniffer, new[] {37, 105, 106, 90, 66, 10}, new[] {41, 41, 37, 44, 43, 43},\r
                 "連合艦隊で2戦して大破が出るまで");\r
-            PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => sniffer.BadlyDamagedShips.Any());\r
             SniffLogFile(sniffer, "combined_escape_002");\r
             PAssert.That(() => sniffer.GetShipStatuses(0)[5].Escaped && sniffer.GetShipStatuses(1)[1].Escaped,\r
                 "続けて護衛退避を実行");\r
-            PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => !sniffer.BadlyDamagedShips.Any());\r
             SniffLogFile(sniffer, "combined_escape_003");\r
             AssertEauqlCombinedResult(sniffer, new[] {37, 105, 106, 90, 1, 10}, new[] {41, 41, 32, 44, 43, 43},\r
                 "もう一戦して大破が出るまで");\r
-            PAssert.That(() => sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => sniffer.BadlyDamagedShips.Any());\r
             SniffLogFile(sniffer, "combined_escape_004");\r
             PAssert.That(() => sniffer.GetShipStatuses(0)[5].Escaped && sniffer.GetShipStatuses(1)[1].Escaped &&\r
                                sniffer.GetShipStatuses(0)[4].Escaped && sniffer.GetShipStatuses(1)[2].Escaped,\r
                 "続けて護衛退避を実行");\r
-            PAssert.That(() => !sniffer.Battle.HasDamagedShip);\r
+            PAssert.That(() => !sniffer.BadlyDamagedShips.Any());\r
         }\r
 \r
         /// <summary>\r
@@ -203,7 +203,7 @@ namespace KancolleSniffer.Test
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "battle_003");\r
             AssertEqualBattleResult(sniffer, new[] {28, 2, 13});\r
-            PAssert.That(() => !sniffer.Battle.HasDamagedShip, "夜戦の開始時は大破警告を出さない");\r
+            PAssert.That(() => !sniffer.BadlyDamagedShips.Any(), "夜戦の開始時は大破警告を出さない");\r
         }\r
 \r
         /// <summary>\r
@@ -321,6 +321,17 @@ namespace KancolleSniffer.Test
         }\r
 \r
         /// <summary>\r
+        /// 出撃時に大破している艦娘がいたら警告する\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void DamagedShipWarningOnMapStart()\r
+        {\r
+            var sniffer = new Sniffer();\r
+            SniffLogFile(sniffer, "mapstart_001");\r
+            PAssert.That(() => sniffer.BadlyDamagedShips.SequenceEqual(new[] {"大潮"}));\r
+        }\r
+\r
+        /// <summary>\r
         /// 熟練度込みの制空値を正しく計算する\r
         /// </summary>\r
         [TestMethod]\r
index c898308..121682c 160000 (submodule)
@@ -1 +1 @@
-Subproject commit c89830808c15a6ea56ba111c7b3e469acf1fab89
+Subproject commit 121682c945a6145e17f4186f413d8c3dcbe8d6ac
index fca702f..927da28 100644 (file)
@@ -47,8 +47,6 @@ namespace KancolleSniffer
         public bool InBattle { get; set; }\r
         public string Formation { get; private set; }\r
         public int EnemyFighterPower { get; private set; }\r
-        public bool HasDamagedShip { get; set; }\r
-        public string[] DamagedShipNames { get; private set; }\r
         public int AirControlLevel { get; private set; }\r
         public BattleResultRank ResultRank { get; private set; }\r
         public ShipStatus[] EnemyResultStatus { get; private set; }\r
@@ -290,7 +288,7 @@ namespace KancolleSniffer
             foreach (var e in ships.Zip(_friend, (ship, now) => new {ship, now}))\r
                 e.now.UpdateShipStatus(e.ship);\r
             if (warnDamagedShip)\r
-                UpdateDamgedShipNames(ships);\r
+                _shipInfo.SetBadlyDamagedShips();\r
             SetEnemyResultStatus();\r
         }\r
 \r
@@ -303,13 +301,6 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        private void UpdateDamgedShipNames(IEnumerable<ShipStatus> ships)\r
-        {\r
-            DamagedShipNames =\r
-                (from s in ships where s.DamageLevel == ShipStatus.Damage.Badly && !s.Escaped select s.Name).ToArray();\r
-            HasDamagedShip = DamagedShipNames.Any();\r
-        }\r
-\r
         public void InspectCombinedBattle(dynamic json, bool surfaceFleet)\r
         {\r
             InBattle = true;\r
@@ -348,14 +339,14 @@ namespace KancolleSniffer
             foreach (var e in ships.Zip(_friend.Concat(_guard), (ship, now) => new {ship, now}))\r
                 e.now.UpdateShipStatus(e.ship);\r
             if (warnDamagedShip)\r
-                UpdateDamgedShipNames(ships);\r
+                _shipInfo.SetBadlyDamagedShips();\r
             SetEnemyResultStatus();\r
         }\r
 \r
         public void CauseCombinedBattleEscape()\r
         {\r
             _shipInfo.SetEscapedShips(_escapingShips);\r
-            UpdateDamgedShipNames(_shipInfo.GetShipStatuses(0).Concat(_shipInfo.GetShipStatuses(1)));\r
+            _shipInfo.SetBadlyDamagedShips();\r
         }\r
 \r
         private class Record\r
index 5bb8cc5..21eee03 100644 (file)
@@ -578,8 +578,8 @@ namespace KancolleSniffer
 \r
         private void NotifyDamagedShip()\r
         {\r
-            if (_sniffer.Battle.HasDamagedShip)\r
-                _noticeQueue.Enqueue("大破した艦娘がいます", string.Join(" ", _sniffer.Battle.DamagedShipNames),\r
+            if (_sniffer.BadlyDamagedShips.Any())\r
+                _noticeQueue.Enqueue("大破した艦娘がいます", string.Join(" ", _sniffer.BadlyDamagedShips),\r
                     _config.DamagedShipSoundFile);\r
         }\r
 \r
index a4d3dfe..4d61915 100644 (file)
@@ -233,7 +233,8 @@ namespace KancolleSniffer
                 InspectDeck(json.api_deck_port);\r
                 InspectShipData(json.api_ship);\r
                 InspectBasic(json.api_basic);\r
-                _combinedFleetType = json.api_combined_flag() ? (int)json.api_combined_flag : 0;\r
+                if (json.api_combined_flag())\r
+                    _combinedFleetType =  (int)json.api_combined_flag;\r
                 _itemInfo.NowShips = ((object[])json.api_ship).Length;\r
             }\r
             else if (json.api_data()) // ship2\r
@@ -424,7 +425,7 @@ namespace KancolleSniffer
 \r
         public int[][] PresetDeck => _presetDeck;\r
 \r
-        public void StartSortie(string request)\r
+        public void InspectMapStart(string request)\r
         {\r
             var values = HttpUtility.ParseQueryString(request);\r
             var fleet = int.Parse(values["api_deck_id"]) - 1;\r
@@ -436,6 +437,7 @@ namespace KancolleSniffer
             {\r
                 _inSortie[0] = _inSortie[1] = true;\r
             }\r
+            SetBadlyDamagedShips();\r
         }\r
 \r
         public void RepairShip(int id)\r
@@ -526,6 +528,22 @@ namespace KancolleSniffer
             return result > 0 ? result + (_hqLevel + 4) / 5 * 5 * -0.6142467 : 0.0;\r
         }\r
 \r
+        public string[] BadlyDamagedShips { get; private set; } = new string[0];\r
+\r
+        public void SetBadlyDamagedShips()\r
+        {\r
+            BadlyDamagedShips =\r
+                _inSortie.SelectMany((sortie, i) => sortie ? GetShipStatuses(i) : new ShipStatus[0])\r
+                    .Where(s => !s.Escaped && s.DamageLevel == ShipStatus.Damage.Badly)\r
+                    .Select(s => s.Name)\r
+                    .ToArray();\r
+        }\r
+\r
+        public void ClearBadlyDamagedShips()\r
+        {\r
+            BadlyDamagedShips = new string[0];\r
+        }\r
+\r
         public void SetEscapedShips(List<int> ships)\r
         {\r
             _escapedShips.AddRange(ships);\r
index a6fb48e..9151cf2 100644 (file)
@@ -130,6 +130,7 @@ namespace KancolleSniffer
             _logger.InspectBasic(data.api_basic);\r
             _logger.InspectMaterial(data.api_material);\r
             _shipInfo.InspectShip(data);\r
+            _shipInfo.ClearBadlyDamagedShips();\r
             _conditionTimer.CalcRegenTime();\r
             _missionInfo.InspectDeck(data.api_deck_port);\r
             _dockInfo.InspectNDock(data.api_ndock);\r
@@ -139,7 +140,6 @@ namespace KancolleSniffer
                 _questInfo.QuestCount = (int)data.api_parallel_quest_count;\r
             _battleInfo.CleanupResult();\r
             _battleInfo.InBattle = false;\r
-            _battleInfo.HasDamagedShip = false;\r
             _shipInfo.ClearEscapedShips();\r
             _miscTextInfo.ClearIfNeeded();\r
             SaveState();\r
@@ -296,7 +296,7 @@ namespace KancolleSniffer
             {\r
                 if (url.EndsWith("/battle"))\r
                 {\r
-                    _shipInfo.StartSortie(request); // 演習を出撃中とみなす\r
+                    _shipInfo.InspectMapStart(request); // 演習を出撃中とみなす\r
                     _conditionTimer.InvalidateCond();\r
                     _miscTextInfo.ClearFlag = true;\r
                 }\r
@@ -414,12 +414,12 @@ namespace KancolleSniffer
             }\r
             if (url.EndsWith("api_req_map/start"))\r
             {\r
-                _shipInfo.StartSortie(request);\r
+                _shipInfo.InspectMapStart(request); // 出撃中判定が必要なので_conditionTimerより前\r
                 _conditionTimer.InvalidateCond();\r
                 _exMapInfo.InspectMapStart(data);\r
                 _logger.InspectMapStart(data);\r
                 _miscTextInfo.ClearFlag = true;\r
-                return Update.Timer;\r
+                return Update.Timer | Update.Ship;\r
             }\r
             if (url.EndsWith("api_req_map/next"))\r
             {\r
@@ -468,6 +468,8 @@ namespace KancolleSniffer
 \r
         public ShipStatus[] ShipList => _shipInfo.ShipList;\r
 \r
+        public string[] BadlyDamagedShips => _shipInfo.BadlyDamagedShips;\r
+\r
         public ItemStatus[] ItemList => _itemInfo.GetItemListWithOwner(ShipList);\r
 \r
         public AkashiTimer AkashiTimer => _akashiTimer;\r