OSDN Git Service

連合艦隊の雷撃戦で第二艦隊のダメコン発動が計上されないのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Model / BattleInfo.cs
index de4487d..5f20f6e 100644 (file)
@@ -37,6 +37,7 @@ namespace KancolleSniffer.Model
         None,\r
         Day,\r
         Night,\r
+        SpNight,\r
         Result,\r
         Unknown\r
     }\r
@@ -107,14 +108,13 @@ namespace KancolleSniffer.Model
             SetupResult(request, json, url.Contains("practice"));\r
             FighterPower = CalcFighterPower();\r
             EnemyFighterPower = CalcEnemyFighterPower(json);\r
-            BattleState = IsNightBattle(json) ? BattleState.Night : BattleState.Day;\r
+            BattleState = url.Contains("sp_midnight") ? BattleState.SpNight :\r
+                url.Contains("midnight") ? BattleState.Night : BattleState.Day;\r
             CalcDamage(json);\r
-            ResultRank = url.EndsWith("ld_airbattle") ? CalcLdAirBattleRank() : CalcResultRank();\r
+            ResultRank = url.Contains("/ld_") ? CalcLdResultRank() : CalcResultRank();\r
             SetResult();\r
         }\r
 \r
-        private bool IsNightBattle(dynamic json) => json.api_hougeki();\r
-\r
         public static int DeckId(dynamic json)\r
         {\r
             if (json.api_dock_id()) // 昼戦はtypoしている\r
@@ -165,7 +165,7 @@ namespace KancolleSniffer.Model
             };\r
         }\r
 \r
-        private void FlagshipRecovery(string request,  ShipStatus flagship)\r
+        private void FlagshipRecovery(string request, ShipStatus flagship)\r
         {\r
             var type = int.Parse(HttpUtility.ParseQueryString(request)["api_recovery_type"] ?? "0");\r
             switch (type)\r
@@ -437,7 +437,10 @@ namespace KancolleSniffer.Model
             if (guard == null)\r
                 return;\r
             for (var i = 0; i < guard.Length; i++)\r
+            {\r
                 guard[i].ApplyDamage(damage[i + 6]);\r
+                guard[i].CheckDamageControl();\r
+            }\r
         }\r
 \r
         private void CalcDamageByTurn(dynamic json, bool ignoreFriendDamage = false)\r
@@ -447,9 +450,11 @@ namespace KancolleSniffer.Model
                   json.api_at_eflag() && json.api_at_eflag != null))\r
                 return;\r
 \r
+            var eFlags = (int[])json.api_at_eflag;\r
+            var sources = (int[])json.api_at_list;\r
+            var types = json.api_at_type() ? (int[])json.api_at_type : (int[])json.api_sp_list;\r
             var targets = (int[][])json.api_df_list;\r
             var damages = (int[][])json.api_damage;\r
-            var eFlags = (int[])json.api_at_eflag;\r
             var records = new[] {new Record[12], new Record[12]};\r
             Array.Copy(_friend, records[1], _friend.Length);\r
             Array.Copy(_guard, 0, records[1], 6, _guard.Length);\r
@@ -459,10 +464,12 @@ namespace KancolleSniffer.Model
             {\r
                 if (ignoreFriendDamage && eFlags[turn] == 1)\r
                     continue;\r
+                if (types[turn] == 100 || types[turn] == 101) // Nelson Touchと長門一斉射\r
+                    records[eFlags[turn] ^ 1][sources[turn]].TriggerSpecialAttack();\r
                 for (var shot = 0; shot < targets[turn].Length; shot++)\r
                 {\r
                     var target = targets[turn][shot];\r
-                    var damage  = damages[turn][shot];\r
+                    var damage = damages[turn][shot];\r
                     if (target == -1 || damage == -1)\r
                         continue;\r
                     records[eFlags[turn]][target].ApplyDamage(damage);\r
@@ -567,7 +574,6 @@ namespace KancolleSniffer.Model
             public ShipStatus.Damage DamageLevel => _status.DamageLevel;\r
             public string Name => _status.Name;\r
             public int StartHp { get; private set; }\r
-            public bool GoddessConsumed { get; private set; }\r
 \r
             public static Record[] Setup(IEnumerable<ShipStatus> ships, bool practice) =>\r
             (from s in ships\r
@@ -592,6 +598,11 @@ namespace KancolleSniffer.Model
                     }).ToArray();\r
             }\r
 \r
+            public void TriggerSpecialAttack()\r
+            {\r
+                _status.SpecialAttack = ShipStatus.Attack.Fire;\r
+            }\r
+\r
             public void ApplyDamage(int damage)\r
             {\r
                 _status.NowHp = Max(0, _status.NowHp - damage);\r
@@ -613,7 +624,6 @@ namespace KancolleSniffer.Model
                     {\r
                         _status.NowHp = _status.MaxHp;\r
                         ConsumeSlotItem(_status, 43);\r
-                        GoddessConsumed = true;\r
                         break;\r
                     }\r
                 }\r
@@ -624,10 +634,13 @@ namespace KancolleSniffer.Model
                 ship.NowHp = NowHp;\r
                 ship.Slot = _status.Slot;\r
                 ship.SlotEx = _status.SlotEx;\r
+                ship.SpecialAttack = _status.SpecialAttack == ShipStatus.Attack.Fire\r
+                    ? ShipStatus.Attack.Fired\r
+                    : ShipStatus.Attack.None;\r
             }\r
         }\r
 \r
-        private BattleResultRank CalcLdAirBattleRank()\r
+        private BattleResultRank CalcLdResultRank()\r
         {\r
             var combined = _friend.Concat(_guard).Where(r => !r.Escaped).ToArray();\r
             var friendGauge = combined.Sum(r => r.StartHp - r.NowHp);\r
@@ -655,7 +668,6 @@ namespace KancolleSniffer.Model
             var friendStartHpTotal = 0;\r
             var friendNowHpTotal = 0;\r
             var friendSunk = 0;\r
-            var goddessConsumed = false;\r
             foreach (var ship in friend)\r
             {\r
                 if (ship.Escaped)\r
@@ -664,7 +676,6 @@ namespace KancolleSniffer.Model
                 friendNowHpTotal += ship.NowHp;\r
                 if (ship.NowHp == 0)\r
                     friendSunk++;\r
-                goddessConsumed |= ship.GoddessConsumed;\r
             }\r
             var friendGaugeRate = (int)((double)(friendStartHpTotal - friendNowHpTotal) / friendStartHpTotal * 100);\r
 \r
@@ -676,7 +687,7 @@ namespace KancolleSniffer.Model
 \r
             if (friendSunk == 0 && enemySunk == enemyCount)\r
             {\r
-                if (friendNowHpTotal == friendStartHpTotal && !goddessConsumed)\r
+                if (friendNowHpTotal >= friendStartHpTotal)\r
                     return BattleResultRank.P;\r
                 return BattleResultRank.S;\r
             }\r