OSDN Git Service

海戦・ドロップ報告書に連合艦隊の護衛艦隊を出力する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 19 Mar 2017 11:31:50 +0000 (20:31 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 2 Apr 2017 14:18:09 +0000 (23:18 +0900)
KancolleSniffer.Test/LoggerTest.cs
KancolleSniffer/BattleInfo.cs
KancolleSniffer/Logger.cs

index b2fc423..ef2d9b1 100644 (file)
@@ -162,15 +162,32 @@ namespace KancolleSniffer.Test
             sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2015, 1, 1));\r
             sniffer.EnableLog(LogType.Battle);\r
             SnifferTest.SniffLogFile(sniffer, "combined_surface_001");\r
-            PAssert.That(() => "2015-01-01 00:00:00,南西方面海域,3,出撃,S,同航戦,第四警戒航行序列,単縦陣,ピケット水雷戦隊 A群,,," +\r
-                               "あきつ丸改(Lv68),40/40,山城改二(Lv85),77/77,扶桑改二(Lv85),77/77,利根改二(Lv117),59/66,筑摩改二(Lv117),51/65,神通改二(Lv97),47/50," +\r
-                               "軽巡ツ級(elite),0/66,軽巡ト級(elite),0/55,駆逐イ級後期型,0/35,駆逐イ級後期型,0/35,駆逐イ級後期型,0/35,駆逐イ級後期型,0/35," +\r
-                               "144~149,0,制空権確保|" +\r
-                               "2015-01-01 00:00:00,南西方面海域,7,,S,同航戦,第四警戒航行序列,複縦陣,任務部隊 D群,駆逐艦,満潮," +\r
-                               "あきつ丸改(Lv68),40/40,山城改二(Lv85),77/77,扶桑改二(Lv85),77/77,利根改二(Lv117),33/66,筑摩改二(Lv117),51/65,神通改二(Lv97),47/50," +\r
-                               "戦艦タ級(flagship),0/90,軽母ヌ級(flagship),0/84,軽巡ト級(elite),0/55,軽巡ト級(elite),0/55,駆逐ロ級後期型,0/37,駆逐ロ級後期型,0/37," +\r
-                               "123~131,23,制空権確保|"\r
-                               == result);\r
+            PAssert.That(() =>\r
+                "2015-01-01 00:00:00,南西方面海域,3,出撃,S,同航戦,第四警戒航行序列,単縦陣,ピケット水雷戦隊 A群,,," +\r
+                "あきつ丸改(Lv68)・大淀改(Lv95),40/40・47/47,山城改二(Lv85)・Z1 zwei(Lv84),77/77・35/35,扶桑改二(Lv85)・Z3 zwei(Lv84),77/77・11/35,利根改二(Lv117)・島風改(Lv130),59/66・39/41,筑摩改二(Lv117)・雪風改(Lv130),51/65・37/37,神通改二(Lv97)・北上改二(Lv99),47/50・40/43," +\r
+                "軽巡ツ級(elite),0/66,軽巡ト級(elite),0/55,駆逐イ級後期型,0/35,駆逐イ級後期型,0/35,駆逐イ級後期型,0/35,駆逐イ級後期型,0/35," +\r
+                "144~149,0,制空権確保|" +\r
+                "2015-01-01 00:00:00,南西方面海域,7,,S,同航戦,第四警戒航行序列,複縦陣,任務部隊 D群,駆逐艦,満潮," +\r
+                "あきつ丸改(Lv68)・大淀改(Lv95),40/40・39/47,山城改二(Lv85)・Z1 zwei(Lv84),77/77・35/35,扶桑改二(Lv85)・Z3 zwei(Lv84),77/77・11/35,利根改二(Lv117)・島風改(Lv130),33/66・39/41,筑摩改二(Lv117)・雪風改(Lv130),51/65・37/37,神通改二(Lv97)・北上改二(Lv99),47/50・40/43," +\r
+                "戦艦タ級(flagship),0/90,軽母ヌ級(flagship),0/84,軽巡ト級(elite),0/55,軽巡ト級(elite),0/55,駆逐ロ級後期型,0/37,駆逐ロ級後期型,0/37," +\r
+                "123~131,23,制空権確保|"\r
+                == result);\r
+        }\r
+\r
+        [TestMethod]\r
+        public void InspectBothCombinedBattleResult()\r
+        {\r
+            var sniffer = new Sniffer();\r
+            var result = "";\r
+            sniffer.SetLogWriter((path, s, h) => { result += s + "|"; }, () => new DateTime(2017, 1, 1));\r
+            sniffer.EnableLog(LogType.Battle);\r
+            SnifferTest.SniffLogFile(sniffer, "both_combined_001");\r
+            PAssert.That(() =>\r
+                "2017-01-01 00:00:00,本土沖太平洋上,27,出撃&ボス,S,同航戦,第四警戒航行序列,第三警戒航行序列,16th任務部隊 主力機動部隊群,駆逐艦,天津風," +\r
+                "愛宕改(Lv98)・暁改二(Lv84),55/57・28/31,金剛改二(Lv99)・初月改(Lv98),69/82・33/37,飛龍改二(Lv99)・高雄改(Lv98),16/67・57/57,蒼龍改二(Lv99)・神通改二(Lv99),40/67・11/50,龍驤改二(Lv99)・木曾改二(Lv99),50/50・40/44,祥鳳改(Lv76)・北上改二(Lv97),26/45・43/43," +\r
+                "水母水姫・軽巡ヘ級(flagship),0/390・0/57,空母ヲ級改(flagship)・重巡リ級(flagship),0/160・0/76,空母ヲ級改(flagship)・重巡リ級(flagship),0/160・0/76,戦艦タ級(elite)・軽巡ツ級(elite),0/88・0/66,重巡ネ級(elite)・駆逐イ級後期型,0/88・0/35,重巡ネ級(elite)・駆逐イ級後期型,0/88・0/35," +\r
+                "750~751,389,航空優勢|"\r
+                == result);\r
         }\r
 \r
         [TestMethod]\r
index a3d7c38..604e691 100644 (file)
@@ -141,11 +141,13 @@ namespace KancolleSniffer
             var fstats = _shipInfo.GetShipStatuses(_fleet);\r
             FlagshipRecovery(fstats[0]);\r
             _friend = Record.Setup(fstats);\r
-            _enemyHp = nowhps.Skip(7).TakeWhile(hp => hp != -1).ToArray();\r
+            _enemyHp = nowhps.Skip(7).ToArray();\r
             _enemyStartHp = (int[])_enemyHp.Clone();\r
             EnemyResultStatus =\r
-            (from id in (int[])json.api_ship_ke\r
-                where id != -1\r
+            (from id in\r
+                json.api_ship_ke_combined()\r
+                    ? ((int[])json.api_ship_ke).Skip(1).Concat(((int[])json.api_ship_ke_combined).Skip(1))\r
+                    : ((int[])json.api_ship_ke).Skip(1)\r
                 select new ShipStatus {Id = id, Spec = _shipInfo.GetSpec(id)}).ToArray();\r
             _guard = new Record[0];\r
             _enemyGuardHp = new int[0];\r
@@ -159,7 +161,7 @@ namespace KancolleSniffer
             {\r
                 _enemyGuardHp =\r
                     ((int[])json.api_nowhps_combined).\r
-                        Skip(7).TakeWhile(hp => hp != -1).ToArray();\r
+                        Skip(7).ToArray();\r
                 _enemyGuardStartHp = (int[])_enemyGuardHp.Clone();\r
             }\r
         }\r
@@ -541,11 +543,16 @@ namespace KancolleSniffer
 \r
         private void SetEnemyResultStatus()\r
         {\r
-            for (var i = 0; i < EnemyResultStatus.Length; i++)\r
+            for (var i = 0; i < 6; i++)\r
             {\r
                 EnemyResultStatus[i].MaxHp = _enemyStartHp[i];\r
                 EnemyResultStatus[i].NowHp = _enemyHp[i];\r
             }\r
+            for (var i = 6; i < EnemyResultStatus.Length; i++)\r
+            {\r
+                EnemyResultStatus[i].MaxHp = _enemyGuardStartHp[i - 6];\r
+                EnemyResultStatus[i].NowHp = _enemyGuardHp[i - 6];\r
+            }\r
         }\r
 \r
         public void SetEscapeShips(dynamic json)\r
index feec873..3202ca8 100644 (file)
@@ -139,25 +139,8 @@ namespace KancolleSniffer
                 _map = _battle = null;\r
                 return;\r
             }\r
-            var fships = new List<string>();\r
-            int deckId = BattleInfo.DeckId(_battle);\r
-            var deck = _shipInfo.GetDeck(deckId);\r
-            fships.AddRange(deck.Select(id =>\r
-            {\r
-                if (id == -1)\r
-                    return ",";\r
-                var s = _shipInfo.GetStatus(id);\r
-                return $"{s.Name}(Lv{s.Level}),{s.NowHp}/{s.MaxHp}";\r
-            }));\r
-            var estatus = _battleInfo.EnemyResultStatus;\r
-            var edeck = ((int[])_battle.api_ship_ke).Skip(1).ToArray();\r
-            var eships = edeck.Select((id, i) =>\r
-            {\r
-                if (id == -1)\r
-                    return ",";\r
-                var s = estatus[i];\r
-                return $"{s.Name},{s.NowHp}/{s.MaxHp}";\r
-            });\r
+            var fships = GenerateFirendShipList();\r
+            var eships = GenerateEnemyShipList();\r
             var cell = (int)_map.api_no;\r
             var boss = "";\r
             if (_start)\r
@@ -181,7 +164,7 @@ namespace KancolleSniffer
                 else\r
                     dropName += "+" + itemName;\r
             }\r
-            var fp = _shipInfo.GetFighterPower(deckId);\r
+            var fp = _shipInfo.GetFighterPower(BattleInfo.DeckId(_battle));\r
             var fpower = fp[0] == fp[1] ? fp[0].ToString() : fp[0] + "~" + fp[1];\r
             _writer("海戦・ドロップ報告書", string.Join(",", _nowFunc().ToString(DateTimeFormat),\r
                 result.api_quest_name,\r
@@ -205,6 +188,75 @@ namespace KancolleSniffer
             _start = false;\r
         }\r
 \r
+        private IEnumerable<string> GenerateFirendShipList()\r
+        {\r
+            int deckId = BattleInfo.DeckId(_battle);\r
+            if (_battle.api_nowhps_combined() && (int)_battle.api_nowhps_combined[1] != -1)\r
+            {\r
+                var main = _shipInfo.GetDeck(0);\r
+                var guard = _shipInfo.GetDeck(1);\r
+                return main.Zip(guard, (m, g) =>\r
+                {\r
+                    if (m == -1 && g == -1)\r
+                        return ",";\r
+                    var name = "";\r
+                    var hp = "";\r
+                    if (m != -1)\r
+                    {\r
+                        var sm = _shipInfo.GetStatus(m);\r
+                        name = $"{sm.Name}(Lv{sm.Level})";\r
+                        hp = $"{sm.NowHp}/{sm.MaxHp}";\r
+                    }\r
+                    name += "・";\r
+                    hp += "・";\r
+                    if (g != -1)\r
+                    {\r
+                        var sg = _shipInfo.GetStatus(g);\r
+                        name += $"{sg.Name}(Lv{sg.Level})";\r
+                        hp += $"{sg.NowHp}/{sg.MaxHp}";\r
+                    }\r
+                    return name + "," + hp;\r
+                }).ToList();\r
+            }\r
+            var deck = _shipInfo.GetDeck(deckId);\r
+            return deck.Select(id =>\r
+            {\r
+                if (id == -1)\r
+                    return ",";\r
+                var s = _shipInfo.GetStatus(id);\r
+                return $"{s.Name}(Lv{s.Level}),{s.NowHp}/{s.MaxHp}";\r
+            }).ToList();\r
+        }\r
+\r
+        private IEnumerable<string> GenerateEnemyShipList()\r
+        {\r
+            var result = _battleInfo.EnemyResultStatus;\r
+            if (result.Length <= 6)\r
+                return result.Select(s => s.Id == -1 ? "," : $"{s.Name},{s.NowHp}/{s.MaxHp}").ToList();\r
+            var main = result.Take(6);\r
+            var guard = result.Skip(6);\r
+            return main.Zip(guard, (m, g) =>\r
+            {\r
+                if (m.Id == -1 && g.Id == -1)\r
+                    return ",";\r
+                var name = "";\r
+                var hp = "";\r
+                if (m.Id != -1)\r
+                {\r
+                    name = $"{m.Name}";\r
+                    hp = $"{m.NowHp}/{m.MaxHp}";\r
+                }\r
+                name += "・";\r
+                hp += "・";\r
+                if (g.Id != -1)\r
+                {\r
+                    name += $"{g.Name}";\r
+                    hp += $"{g.NowHp}/{g.MaxHp}";\r
+                }\r
+                return name + "," + hp;\r
+            }).ToList();\r
+        }\r
+\r
         private string FormationName(dynamic f)\r
         {\r
             if (f is string) // 連合艦隊のときは文字列\r