OSDN Git Service

戦闘APIの変更に暫定的に対応する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 17 Nov 2017 18:02:38 +0000 (03:02 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 17 Nov 2017 18:06:26 +0000 (03:06 +0900)
KancolleSniffer/BattleInfo.cs
KancolleSniffer/Logger.cs

index 6e52a3a..2ed6599 100644 (file)
@@ -66,6 +66,7 @@ namespace KancolleSniffer
         public int AirControlLevel { get; private set; }\r
         public BattleResultRank ResultRank { get; private set; }\r
         public ShipStatus[] EnemyResultStatus { get; private set; }\r
+        public ShipStatus[] EnemyGuardResultStatus { get; private set; }\r
         public bool EnemyIsCombined => EnemyResultStatus.Length > 6;\r
         public List<AirBattleResult> AirBattleResults { get; } = new List<AirBattleResult>();\r
 \r
@@ -85,14 +86,12 @@ namespace KancolleSniffer
             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
+                CalcCombinedHougekiDamage(json.api_hougeki, _friend, _guard, _enemyHp, _enemyGuardHp);\r
             }\r
             else\r
             {\r
                 BattleState = BattleState.Day;\r
-                CalcDamage(json, url.EndsWith("battle_water"));\r
+                CalcDamage(json);\r
             }\r
             ClearEnemyOverKill();\r
             ResultRank = url.EndsWith("ld_airbattle") ? CalcLdAirBattleRank() : CalcResultRank();\r
@@ -145,31 +144,28 @@ namespace KancolleSniffer
         {\r
             if (_friend != null)\r
                 return;\r
-            var nowhps = (int[])json.api_nowhps;\r
             _fleet = DeckId(json);\r
             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 = (int[])json.api_e_nowhps;\r
             _enemyStartHp = (int[])_enemyHp.Clone();\r
-            EnemyResultStatus =\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
+            EnemyResultStatus = ((int[])json.api_ship_ke)\r
+                .Select(id => new ShipStatus {Id = id, Spec = _shipInfo.GetSpec(id)}).ToArray();\r
+            EnemyGuardResultStatus = new ShipStatus[0];\r
+            if (json.api_ship_ke_combined())\r
+            {\r
+                EnemyGuardResultStatus = ((int[])json.api_ship_ke_combined)\r
+                    .Select(id => new ShipStatus {Id = id, Spec = _shipInfo.GetSpec(id)}).ToArray();\r
+            }\r
             _guard = new Record[0];\r
             _enemyGuardHp = new int[0];\r
             _enemyGuardStartHp = new int[0];\r
-            if (!json.api_nowhps_combined())\r
-                return;\r
-            var combined = (int[])json.api_nowhps_combined;\r
-            if (combined[1] != -1) // 味方が連合艦隊\r
+            if (json.api_f_nowhps_combined())\r
                 _guard = Record.Setup(_shipInfo.GetShipStatuses(1));\r
-            if (combined.Length > 7) // 敵が連合艦隊\r
+            if (json.api_e_nowhps_combined()) // 敵が連合艦隊\r
             {\r
-                _enemyGuardHp =\r
-                    ((int[])json.api_nowhps_combined).Skip(7).TakeWhile(hp => hp != -1).ToArray();\r
+                _enemyGuardHp = (int[])json.api_nowhps;\r
                 _enemyGuardStartHp = (int[])_enemyGuardHp.Clone();\r
             }\r
         }\r
@@ -232,9 +228,9 @@ namespace KancolleSniffer
         private EnemyFighterPower CalcEnemyFighterPower(dynamic json)\r
         {\r
             var result = new EnemyFighterPower();\r
-            var ships = ((int[])json.api_ship_ke).Skip(1);\r
+            var ships = (int[])json.api_ship_ke;\r
             if (json.api_ship_ke_combined() && _guard.Length > 0)\r
-                ships = ships.Concat(((int[])json.api_ship_ke_combined).Skip(1));\r
+                ships = ships.Concat((int[])json.api_ship_ke_combined).ToArray();\r
             var maxEq = ships.SelectMany(id =>\r
             {\r
                 var r = _shipInfo.GetSpec(id).MaxEq;\r
@@ -246,10 +242,10 @@ namespace KancolleSniffer
             var equips = ((int[][])json.api_eSlot).SelectMany(x => x);\r
             if (json.api_eSlot_combined() && _guard.Length > 0)\r
                 equips = equips.Concat(((int[][])json.api_eSlot_combined).SelectMany(x => x));\r
-            foreach (var entry in from slot in equips.Zip(maxEq, (id, max) => new { id, max })\r
+            foreach (var entry in from slot in equips.Zip(maxEq, (id, max) => new {id, max})\r
                 let spec = _itemInfo.GetSpecByItemId(slot.id)\r
                 let perSlot = (int)Floor(spec.AntiAir * Sqrt(slot.max))\r
-                select new { spec, perSlot })\r
+                select new {spec, perSlot})\r
             {\r
                 if (entry.spec.CanAirCombat)\r
                     result.AirCombat += entry.perSlot;\r
@@ -259,7 +255,7 @@ namespace KancolleSniffer
             return result;\r
         }\r
 \r
-        private void CalcDamage(dynamic json, bool surfaceFleet = false)\r
+        private void CalcDamage(dynamic json)\r
         {\r
             AirBattleResults.Clear();\r
             var fc = _guard.Length > 0;\r
@@ -292,18 +288,7 @@ namespace KancolleSniffer
             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
-                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
+                CalcCombinedHougekiDamage(json.api_opening_taisen, _friend, _guard, _enemyHp, _enemyGuardHp);\r
             if (json.api_opening_atack != null)\r
             {\r
                 if (both)\r
@@ -318,42 +303,11 @@ namespace KancolleSniffer
                 }\r
             }\r
             if (json.api_hougeki1() && json.api_hougeki1 != null)\r
-            {\r
-                if (json.api_hougeki1.api_at_eflag())\r
-                {\r
-                    CalcCombinedHougekiDamage(json.api_hougeki1, _friend, _guard, _enemyHp, _enemyGuardHp);\r
-                }\r
-                else\r
-                {\r
-                    CalcHougekiDamage(json.api_hougeki1,\r
-                        fc && !surfaceFleet ? _guard : _friend, // 空母機動部隊は一巡目が護衛\r
-                        ec ? _enemyGuardHp : _enemyHp); // 敵連合艦隊は一巡目が護衛\r
-                }\r
-            }\r
+                CalcCombinedHougekiDamage(json.api_hougeki1, _friend, _guard, _enemyHp, _enemyGuardHp);\r
             if (json.api_hougeki2() && json.api_hougeki2 != null)\r
-            {\r
-                if (json.api_hougeki2.api_at_eflag())\r
-                {\r
-                    CalcCombinedHougekiDamage(json.api_hougeki2, _friend, _guard, _enemyHp, _enemyGuardHp);\r
-                }\r
-                else\r
-                {\r
-                    CalcHougekiDamage(json.api_hougeki2, _friend, _enemyHp);\r
-                }\r
-            }\r
+                CalcCombinedHougekiDamage(json.api_hougeki2, _friend, _guard, _enemyHp, _enemyGuardHp);\r
             if (json.api_hougeki3() && json.api_hougeki3 != null)\r
-            {\r
-                if (json.api_hougeki3.api_at_eflag())\r
-                {\r
-                    CalcCombinedHougekiDamage(json.api_hougeki3, _friend, _guard, _enemyHp, _enemyGuardHp);\r
-                }\r
-                else\r
-                {\r
-                    CalcHougekiDamage(json.api_hougeki3,\r
-                        fc && surfaceFleet ? _guard : _friend, // 水上打撃部隊は三順目が護衛\r
-                        _enemyHp);\r
-                }\r
-            }\r
+                CalcCombinedHougekiDamage(json.api_hougeki3, _friend, _guard, _enemyHp, _enemyGuardHp);\r
             if (json.api_raigeki() && json.api_raigeki != null)\r
             {\r
                 if (both)\r
@@ -457,55 +411,40 @@ namespace KancolleSniffer
         {\r
             var damage = (int[])rawDamage;\r
             for (var i = 0; i < friend.Length; i++)\r
-                friend[i].ApplyDamage(damage[i + 1]);\r
+                friend[i].ApplyDamage(damage[i]);\r
             for (var i = 0; i < guard.Length; i++)\r
-                guard[i].ApplyDamage(damage[i + 6 + 1]);\r
+                guard[i].ApplyDamage(damage[i + 6]);\r
         }\r
 \r
         private void CalcSimpleDamage(dynamic rawDamage, Record[] friend)\r
         {\r
             var damage = (int[])rawDamage;\r
             for (var i = 0; i < friend.Length; i++)\r
-                friend[i].ApplyDamage(damage[i + 1]);\r
+                friend[i].ApplyDamage(damage[i]);\r
         }\r
 \r
         private void CalcSimpleDamage(dynamic rawDamage, int[] enemy, int[] enemyGuard)\r
         {\r
             var damage = (int[])rawDamage;\r
             for (var i = 0; i < enemy.Length; i++)\r
-                enemy[i] -= damage[i + 1];\r
+                enemy[i] -= damage[i];\r
             for (var i = 0; i < enemyGuard.Length; i++)\r
-                enemyGuard[i] -= damage[i + 6 + 1];\r
+                enemyGuard[i] -= damage[i + 6];\r
         }\r
 \r
         private void CalcSimpleDamage(dynamic rawDamage, int[] result)\r
         {\r
             var damage = (int[])rawDamage;\r
             for (var i = 0; i < result.Length; i++)\r
-                result[i] -= damage[i + 1];\r
-        }\r
-\r
-        private void CalcHougekiDamage(dynamic hougeki, Record[] friend, int[] enemy)\r
-        {\r
-            var targets = ((dynamic[])hougeki.api_df_list).Skip(1).SelectMany(x => (int[])x);\r
-            var damages = ((dynamic[])hougeki.api_damage).Skip(1).SelectMany(x => (int[])x);\r
-            foreach (var hit in targets.Zip(damages, (t, d) => new {t, d}))\r
-            {\r
-                if (hit.t == -1)\r
-                    continue;\r
-                if (hit.t <= 6)\r
-                    friend[hit.t - 1].ApplyDamage(hit.d);\r
-                else\r
-                    enemy[(hit.t - 1) % 6] -= hit.d;\r
-            }\r
+                result[i] -= damage[i];\r
         }\r
 \r
         private void CalcCombinedHougekiDamage(dynamic hougeki, Record[] friend, Record[] guard,\r
             int[] enemy, int[] enemyGuard)\r
         {\r
-            var targets = ((dynamic[])hougeki.api_df_list).Skip(1).Select(x => (int[])x);\r
-            var damages = ((dynamic[])hougeki.api_damage).Skip(1).Select(x => (int[])x);\r
-            var eflags = ((int[])hougeki.api_at_eflag).Skip(1);\r
+            var targets = ((dynamic[])hougeki.api_df_list).Select(x => (int[])x);\r
+            var damages = ((dynamic[])hougeki.api_damage).Select(x => (int[])x);\r
+            var eflags = (int[])hougeki.api_at_eflag;\r
             foreach (var turn in\r
                 targets.Zip(damages, (t, d) => new {t, d}).Zip(eflags, (td, e) => new {e, td.t, td.d}))\r
             {\r
@@ -513,17 +452,25 @@ namespace KancolleSniffer
                 {\r
                     if (turn.e == 1)\r
                     {\r
-                        if (hit.t <= 6)\r
-                            friend[hit.t - 1].ApplyDamage(hit.d);\r
+                        if (hit.t < 6)\r
+                        {\r
+                            friend[hit.t].ApplyDamage(hit.d);\r
+                        }\r
                         else\r
-                            guard[(hit.t - 1) % 6].ApplyDamage(hit.d);\r
+                        {\r
+                            guard[hit.t % 6].ApplyDamage(hit.d);\r
+                        }\r
                     }\r
                     else\r
                     {\r
-                        if (hit.t <= 6)\r
-                            enemy[hit.t - 1] -= hit.d;\r
+                        if (hit.t < 6)\r
+                        {\r
+                            enemy[hit.t] -= hit.d;\r
+                        }\r
                         else\r
-                            enemyGuard[(hit.t - 1) % 6] -= hit.d;\r
+                        {\r
+                            enemyGuard[hit.t % 6] -= hit.d;\r
+                        }\r
                     }\r
                 }\r
             }\r
@@ -579,8 +526,8 @@ namespace KancolleSniffer
             }\r
             for (var i = 0; i < _enemyGuardHp.Length; i++)\r
             {\r
-                EnemyResultStatus[i + 6].MaxHp = _enemyGuardStartHp[i];\r
-                EnemyResultStatus[i + 6].NowHp = _enemyGuardHp[i];\r
+                EnemyGuardResultStatus[i].MaxHp = _enemyGuardStartHp[i];\r
+                EnemyGuardResultStatus[i].NowHp = _enemyGuardHp[i];\r
             }\r
         }\r
 \r
index 6d199bb..267bd32 100644 (file)
@@ -236,7 +236,7 @@ namespace KancolleSniffer
         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
+            if (_battle.api_f_nowhps_combined())\r
             {\r
                 var main = _shipInfo.GetDeck(0);\r
                 var guard = _shipInfo.GetDeck(1);\r
@@ -275,11 +275,13 @@ namespace KancolleSniffer
 \r
         private IEnumerable<string> GenerateEnemyShipList()\r
         {\r
-            var result = _battleInfo.EnemyResultStatus;\r
-            if (result.Length <= 6)\r
+            var result = _battleInfo.EnemyResultStatus.Concat(Enumerable.Repeat(new ShipStatus(), 6)).Take(6);\r
+            if (_battleInfo.EnemyGuardResultStatus.Length == 0)\r
+            {\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
+            }\r
+            var main = result;\r
+            var guard = _battleInfo.EnemyGuardResultStatus.Concat(Enumerable.Repeat(new ShipStatus(), 6)).Take(6);\r
             return main.Zip(guard, (m, g) =>\r
             {\r
                 if (m.Id == -1 && g.Id == -1)\r
@@ -318,6 +320,8 @@ namespace KancolleSniffer
                     return "梯形陣";\r
                 case 5:\r
                     return "単横陣";\r
+                case 6:\r
+                    return "警戒陣";\r
                 case 11:\r
                     return "第一警戒航行序列";\r
                 case 12:\r