OSDN Git Service

海戦・ドロップ報告書に連合艦隊の護衛艦隊を出力する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / BattleInfo.cs
index 0180d81..604e691 100644 (file)
@@ -29,6 +29,14 @@ namespace KancolleSniffer
         E,\r
     }\r
 \r
+    public enum BattleState\r
+    {\r
+        None,\r
+        Day,\r
+        Night,\r
+        Result\r
+    }\r
+\r
     public class BattleInfo\r
     {\r
         private readonly ShipInfo _shipInfo;\r
@@ -43,13 +51,14 @@ namespace KancolleSniffer
         private readonly List<int> _escapingShips = new List<int>();\r
         private int _flagshipRecoveryType;\r
 \r
-        public bool InBattle { get; set; }\r
+        public BattleState BattleState { get; set; }\r
         public string Formation { get; private set; }\r
         public string EnemyFighterPower { 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
-        public AirBattleResult AirBattleResults { get; private set; }\r
+        public List<AirBattleResult> AirBattleResults { get; } = new List<AirBattleResult>();\r
+\r
 \r
         public BattleInfo(ShipInfo shipInfo, ItemInfo itemInfo)\r
         {\r
@@ -59,7 +68,6 @@ namespace KancolleSniffer
 \r
         public void InspectBattle(dynamic json, string url)\r
         {\r
-            InBattle = true;\r
             Formation = FormationName(json);\r
             EnemyFighterPower = CalcEnemyFighterPower(json);\r
             AirControlLevel = CheckAirControlLevel(json);\r
@@ -67,12 +75,14 @@ namespace KancolleSniffer
             SetupResult(json);\r
             if (IsNightBattle(json))\r
             {\r
+                BattleState = BattleState.Night;\r
                 CalcHougekiDamage(json.api_hougeki,\r
                     _guard.Length > 0 ? _guard : _friend,\r
                     json.api_active_deck() && json.api_active_deck[1] != 1 ? _enemyGuardHp : _enemyHp);\r
             }\r
             else\r
             {\r
+                BattleState = BattleState.Day;\r
                 CalcDamage(json, url.EndsWith("battle_water"));\r
             }\r
             ClearEnemyOverKill();\r
@@ -95,11 +105,11 @@ namespace KancolleSniffer
 \r
         private bool IsNightBattle(dynamic json) => json.api_hougeki();\r
 \r
-        private int DeckId(dynamic json)\r
+        public static int DeckId(dynamic json)\r
         {\r
             if (json.api_dock_id()) // 昼戦はtypoしている\r
                 return (int)json.api_dock_id - 1;\r
-            if (json.api_deck_id is string) // 通常の夜戦では文字列\r
+            if (json.api_deck_id is string) // é\80\9a常ã\81®å¤\9cæ\88¦ã\81¨é\80£å\90\88è\89¦é\9a\8a\91³æ\96¹ã\81®ã\81¿)ã\81§ã\81¯æ\96\87å­\97å\88\97\r
                 return int.Parse(json.api_deck_id) - 1;\r
             return (int)json.api_deck_id - 1;\r
         }\r
@@ -131,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
@@ -149,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
@@ -228,35 +240,48 @@ namespace KancolleSniffer
 \r
         private void CalcDamage(dynamic json, bool surfaceFleet = false)\r
         {\r
-            AirBattleResults = new AirBattleResult();\r
+            AirBattleResults.Clear();\r
             var fc = _guard.Length > 0;\r
             var ec = _enemyGuardHp.Length > 0;\r
             var both = fc && ec;\r
             if (json.api_air_base_injection())\r
             {\r
-                var obj = json.api_air_base_injection;\r
-                CalcAirBaseAttackDamage(obj.IsArray() ? obj : new[] {obj});\r
+                AddAirBattleResult(json.api_air_base_injection, "AB噴式");\r
+                CalcKoukuDamage(json.api_air_base_injection);\r
+            }\r
+            if (json.api_injection_kouku())\r
+            {\r
+                AddAirBattleResult(json.api_injection_kouku, "噴式");\r
+                CalcKoukuDamage(json.api_injection_kouku);\r
             }\r
             if (json.api_air_base_attack())\r
                 CalcAirBaseAttackDamage(json.api_air_base_attack);\r
-            if (json.api_injection_kouku()) // 噴式強襲\r
-                CalcKoukuDamage(json.api_injection_kouku);\r
             if (json.api_kouku())\r
             {\r
-                SetAirBattleResult(json.api_kouku);\r
+                AddAirBattleResult(json.api_kouku, "航空戦");\r
                 CalcKoukuDamage(json.api_kouku);\r
             }\r
             if (json.api_kouku2()) // 航空戦2回目\r
+            {\r
+                AddAirBattleResult(json.api_kouku2, "航空戦2");\r
                 CalcKoukuDamage(json.api_kouku2);\r
+            }\r
             if (!json.api_opening_atack()) // 航空戦のみ\r
                 return;\r
             if (json.api_support_info() && json.api_support_info != null)\r
                 CalcSupportDamage(json.api_support_info);\r
             if (json.api_opening_taisen() && json.api_opening_taisen != null)\r
             {\r
-                CalcHougekiDamage(json.api_opening_taisen,\r
-                    fc ? _guard : _friend, // 先制対潜攻撃の対象は護衛(たぶん)\r
-                    _enemyHp);\r
+                if (json.api_opening_taisen.api_at_eflag())\r
+                {\r
+                    CalcCombinedHougekiDamage(json.api_opening_taisen, _friend, _guard, _enemyHp, _enemyGuardHp);\r
+                }\r
+                else\r
+                {\r
+                    CalcHougekiDamage(json.api_opening_taisen,\r
+                        fc ? _guard : _friend, // 先制対潜攻撃の対象は護衛\r
+                        _enemyHp);\r
+                }\r
             }\r
             if (json.api_opening_atack != null)\r
             {\r
@@ -331,34 +356,52 @@ namespace KancolleSniffer
             }\r
             else if (json.api_support_airatack != null)\r
             {\r
-                CalcKoukuDamage(json.api_support_airatack);\r
+                CalcSimpleDamage(json.api_support_airatack.api_stage3.api_edam, _enemyHp, _enemyGuardHp);\r
             }\r
         }\r
 \r
         private void CalcAirBaseAttackDamage(dynamic json)\r
         {\r
+            var i = 1;\r
             foreach (var entry in json)\r
+            {\r
+                AddAirBattleResult(entry, "基地" + i++);\r
                 CalcKoukuDamage(entry);\r
+            }\r
         }\r
 \r
-        private void SetAirBattleResult(dynamic json)\r
+        private void AddAirBattleResult(dynamic json, string phaseName)\r
         {\r
-            if (json.api_stage1 == null || json.api_stage2 == null)\r
+            var stage1 = json.api_stage1;\r
+            if (stage1 == null || (stage1.api_f_count == 0 && stage1.api_e_count == 0))\r
                 return;\r
-            AirBattleResults.Stage1 = new AirBattleResult.StageResult\r
-            {\r
-                FriendCount = (int)json.api_stage1.api_f_count,\r
-                FriendLost = (int)json.api_stage1.api_f_lostcount,\r
-                EnemyCount = (int)json.api_stage1.api_e_count,\r
-                EnemyLost = (int)json.api_stage1.api_e_lostcount\r
-            };\r
-            AirBattleResults.Stage2 = new AirBattleResult.StageResult\r
+            AirBattleResults.Add(new AirBattleResult\r
             {\r
-                FriendCount = (int)json.api_stage2.api_f_count,\r
-                FriendLost = (int)json.api_stage2.api_f_lostcount,\r
-                EnemyCount = (int)json.api_stage2.api_e_count,\r
-                EnemyLost = (int)json.api_stage2.api_e_lostcount\r
-            };\r
+                PhaseName = phaseName,\r
+                AirControlLevel = json.api_stage1.api_disp_seiku() ? (int)json.api_stage1.api_disp_seiku : 0,\r
+                Stage1 = new AirBattleResult.StageResult\r
+                {\r
+                    FriendCount = (int)json.api_stage1.api_f_count,\r
+                    FriendLost = (int)json.api_stage1.api_f_lostcount,\r
+                    EnemyCount = (int)json.api_stage1.api_e_count,\r
+                    EnemyLost = (int)json.api_stage1.api_e_lostcount\r
+                },\r
+                Stage2 = json.api_stage2 == null\r
+                    ? new AirBattleResult.StageResult\r
+                    {\r
+                        FriendCount = 0,\r
+                        FriendLost = 0,\r
+                        EnemyCount = 0,\r
+                        EnemyLost = 0\r
+                    }\r
+                    : new AirBattleResult.StageResult\r
+                    {\r
+                        FriendCount = (int)json.api_stage2.api_f_count,\r
+                        FriendLost = (int)json.api_stage2.api_f_lostcount,\r
+                        EnemyCount = (int)json.api_stage2.api_e_count,\r
+                        EnemyLost = (int)json.api_stage2.api_e_lostcount\r
+                    }\r
+            });\r
         }\r
 \r
         private void CalcKoukuDamage(dynamic json)\r
@@ -469,6 +512,7 @@ namespace KancolleSniffer
 \r
         public void InspectBattleResult(dynamic json)\r
         {\r
+            BattleState = BattleState.Result;\r
             ShowResult();\r
             CleanupResult();\r
             SetEscapeShips(json);\r
@@ -476,6 +520,7 @@ namespace KancolleSniffer
 \r
         public void InspectPracticeResult(dynamic json)\r
         {\r
+            BattleState = BattleState.Result;\r
             ShowResult(false);\r
             CleanupResult();\r
         }\r
@@ -498,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