OSDN Git Service

連合艦隊同士の戦闘に対応する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 25 Nov 2016 15:52:41 +0000 (00:52 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 26 Nov 2016 03:37:07 +0000 (12:37 +0900)
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer.Test/logs
KancolleSniffer/BattleInfo.cs
KancolleSniffer/Sniffer.cs

index fd5be97..ab1e334 100644 (file)
@@ -530,6 +530,22 @@ namespace KancolleSniffer.Test
             PAssert.That(() => sniffer3.Battle.ResultRank == BattleResultRank.A, "護衛を撃ちもらす");\r
         }\r
 \r
+\r
+        /// <summary>\r
+        /// 双方連合艦隊の戦闘に対応する\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BothCombinedBattle()\r
+        {\r
+            var sniffer1 = new Sniffer();\r
+            SniffLogFile(sniffer1, "both_combined_water_001");\r
+            PAssert.That(() => sniffer1.Battle.ResultRank == BattleResultRank.A);\r
+\r
+            var sniffer2 = new Sniffer();\r
+            SniffLogFile(sniffer2, "both_combined_001");\r
+            PAssert.That(() => sniffer2.Battle.ResultRank == BattleResultRank.S);\r
+        }\r
+\r
         /// <summary>\r
         /// 2-5をクリアしたときの特別戦果を反映する\r
         /// </summary>\r
index 3cc6d1c..b41e0f0 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 3cc6d1cbb33606c544f6178f8eb179d5f40d77d0
+Subproject commit b41e0f0016ece2bb5ce5239ef4f322ac3576e4ad
index 1430dbf..d93be51 100644 (file)
@@ -229,6 +229,7 @@ namespace KancolleSniffer
         {\r
             var fc = _guard.Length > 0;\r
             var ec = _enemyGuardHp.Length > 0;\r
+            var both = fc && ec;\r
             if (json.api_air_base_attack())\r
                 CalcAirBaseAttackDamage(json.api_air_base_attack);\r
             if (json.api_kouku.api_stage3 != null)\r
@@ -248,19 +249,35 @@ namespace KancolleSniffer
                 CalcSupportDamage(json.api_support_info);\r
             if (json.api_opening_taisen() && json.api_opening_taisen != null)\r
             {\r
-                var friend = fc ? _guard : _friend; // 先制対潜攻撃の対象は護衛(たぶん)\r
-                CalcHougekiDamage(json.api_opening_taisen, friend, _enemyHp);\r
+                CalcHougekiDamage(json.api_opening_taisen,\r
+                    fc ? _guard : _friend, // 先制対潜攻撃の対象は護衛(たぶん)\r
+                    _enemyHp);\r
             }\r
             if (json.api_opening_atack != null)\r
             {\r
-                var friend = fc ? _guard : _friend; // 雷撃の対象は護衛\r
-                CalcSimpleDamage(json.api_opening_atack, friend, _enemyHp, _enemyGuardHp);\r
+                if (both)\r
+                {\r
+                    CalcSimpleDamage(json.api_opening_atack, _friend, _guard, _enemyHp, _enemyGuardHp);\r
+                }\r
+                else\r
+                {\r
+                    CalcSimpleDamage(json.api_opening_atack,\r
+                        fc ? _guard : _friend, // 雷撃の対象は護衛\r
+                        _enemyHp, _enemyGuardHp);\r
+                }\r
             }\r
             if (json.api_hougeki1() && json.api_hougeki1 != null)\r
             {\r
-                CalcHougekiDamage(json.api_hougeki1,\r
-                    fc && !surfaceFleet ? _guard : _friend, // 空母機動部隊は一巡目が護衛\r
-                    ec ? _enemyGuardHp : _enemyHp); // 敵連合艦隊は一巡目が護衛\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
             if (json.api_hougeki2() && json.api_hougeki2 != null)\r
             {\r
@@ -277,26 +294,39 @@ namespace KancolleSniffer
                 }\r
                 else\r
                 {\r
-                    var friend = fc && surfaceFleet ? _guard : _friend; // 水上打撃部隊は三順目が護衛\r
-                    CalcHougekiDamage(json.api_hougeki3, friend, _enemyHp);\r
+                    CalcHougekiDamage(json.api_hougeki3,\r
+                        fc && surfaceFleet ? _guard : _friend, // 水上打撃部隊は三順目が護衛\r
+                        _enemyHp);\r
                 }\r
             }\r
             if (json.api_raigeki() && json.api_raigeki != null)\r
             {\r
-                var friend = fc ? _guard : _friend;\r
-                CalcSimpleDamage(json.api_raigeki, friend, _enemyHp, _enemyGuardHp);\r
+                if (both)\r
+                {\r
+                    CalcSimpleDamage(json.api_raigeki, _friend, _guard, _enemyHp, _enemyGuardHp);\r
+                }\r
+                else\r
+                {\r
+                    CalcSimpleDamage(json.api_raigeki,\r
+                        fc ? _guard : _friend, // 雷撃の対象は護衛\r
+                        _enemyHp, _enemyGuardHp);\r
+                }\r
             }\r
         }\r
 \r
         private void CalcSupportDamage(dynamic json)\r
         {\r
             if (json.api_support_hourai != null)\r
-                CalcSimpleDamage(json.api_support_hourai.api_damage, _enemyHp);\r
+            {\r
+                CalcSimpleDamage(json.api_support_hourai.api_damage, _enemyHp, _enemyGuardHp);\r
+            }\r
             else if (json.api_support_airatack != null)\r
             {\r
-                var stage3 = json.api_support_airatack.api_stage3;\r
-                if (stage3 != null)\r
-                    CalcSimpleDamage(stage3.api_edam, _enemyHp);\r
+                var airattack = json.api_support_airatack;\r
+                if (airattack.api_stage3 != null)\r
+                    CalcSimpleDamage(airattack.api_stage3.api_edam, _enemyHp);\r
+                if (airattack.api_stage3_combined() && airattack.api_stage3_combined != null)\r
+                    CalcSimpleDamage(airattack.api_stage3_combined.api_edam, _enemyGuardHp);\r
             }\r
         }\r
 \r
@@ -323,18 +353,38 @@ namespace KancolleSniffer
         private void CalcSimpleDamage(dynamic json, Record[] friend, int[] enemy, int[] enemyGuard)\r
         {\r
             CalcSimpleDamage(json.api_fdam, friend);\r
-            var damage = (int[])json.api_edam;\r
-            for (var i = 0; i < enemy.Length; i++)\r
-                enemy[i] -= damage[i + 1];\r
-            for (var i = 0; i < enemyGuard.Length; i++)\r
-                enemyGuard[i] -= damage[i + 6 + 1];\r
+            CalcSimpleDamage(json.api_edam, enemy, enemyGuard);\r
+        }\r
+\r
+        private void CalcSimpleDamage(dynamic json, Record[] friend, Record[] guard, int[] enemy, int[] enemyGuard)\r
+        {\r
+            CalcSimpleDamage(json.api_fdam, friend, guard);\r
+            CalcSimpleDamage(json.api_edam, enemy, enemyGuard);\r
         }\r
 \r
-        private void CalcSimpleDamage(dynamic rawDamage, Record[] result)\r
+        private void CalcSimpleDamage(dynamic rawDamage, Record[] friend, Record[] guard)\r
         {\r
             var damage = (int[])rawDamage;\r
-            for (var i = 0; i < result.Length; i++)\r
-                result[i].ApplyDamage(damage[i + 1]);\r
+            for (var i = 0; i < friend.Length; i++)\r
+                friend[i].ApplyDamage(damage[i + 1]);\r
+            for (var i = 0; i < guard.Length; i++)\r
+                friend[i].ApplyDamage(damage[i + 6 + 1]);\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
+        }\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
+            for (var i = 0; i < enemyGuard.Length; i++)\r
+                enemyGuard[i] -= damage[i + 6 + 1];\r
         }\r
 \r
         private void CalcSimpleDamage(dynamic rawDamage, int[] result)\r
@@ -376,7 +426,7 @@ namespace KancolleSniffer
                         if (hit.t <= 6)\r
                             friend[hit.t - 1].ApplyDamage(hit.d);\r
                         else\r
-                            guard[hit.t - 1].ApplyDamage(hit.d);\r
+                            guard[(hit.t - 1) % 6].ApplyDamage(hit.d);\r
                     }\r
                     else\r
                     {\r
index 2ca01f1..97210c5 100644 (file)
@@ -357,7 +357,9 @@ namespace KancolleSniffer
                    url.EndsWith("api_req_combined_battle/midnight_battle") ||\r
                    url.EndsWith("api_req_combined_battle/sp_midnight") ||\r
                    url.EndsWith("api_req_combined_battle/ec_battle") ||\r
-                   url.EndsWith("api_req_combined_battle/ec_midnight_battle");\r
+                   url.EndsWith("api_req_combined_battle/ec_midnight_battle") ||\r
+                   url.EndsWith("api_req_combined_battle/each_battle") ||\r
+                   url.EndsWith("api_req_combined_battle/each_battle_water");\r
         }\r
 \r
         private Update ApiOthers(string url, string request, dynamic data)\r