OSDN Git Service

連撃の初弾でダメコンが発動するバグが再発しているのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Model / BattleInfo.cs
index d4057cc..de4487d 100644 (file)
@@ -387,13 +387,13 @@ namespace KancolleSniffer.Model
             };\r
             if (json.api_stage2 != null && json.api_stage2.api_air_fire())\r
             {\r
-                var airfire = json.api_stage2.api_air_fire;\r
-                var idx = (int)airfire.api_idx;\r
+                var airFire = json.api_stage2.api_air_fire;\r
+                var idx = (int)airFire.api_idx;\r
                 result.AirFire = new AirBattleResult.AirFireResult\r
                 {\r
                     ShipName = idx < _friend.Length ? _friend[idx].Name : _guard[idx - 6].Name,\r
-                    Kind = (int)airfire.api_kind,\r
-                    Items = ((int[])airfire.api_use_items).Select(id => _itemInfo.GetSpecByItemId(id).Name).ToArray()\r
+                    Kind = (int)airFire.api_kind,\r
+                    Items = ((int[])airFire.api_use_items).Select(id => _itemInfo.GetSpecByItemId(id).Name).ToArray()\r
                 };\r
             }\r
             AirBattleResults.Add(result);\r
@@ -430,7 +430,10 @@ namespace KancolleSniffer.Model
         {\r
             var damage = (int[])rawDamage;\r
             for (var i = 0; i < friend.Length; i++)\r
+            {\r
                 friend[i].ApplyDamage(damage[i]);\r
+                friend[i].CheckDamageControl();\r
+            }\r
             if (guard == null)\r
                 return;\r
             for (var i = 0; i < guard.Length; i++)\r
@@ -446,21 +449,26 @@ namespace KancolleSniffer.Model
 \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 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
             Array.Copy(_enemy, records[0], _enemy.Length);\r
             Array.Copy(_enemyGuard, 0, records[0], 6, _enemyGuard.Length);\r
-            for (var i = 0; i < eflags.Length; i++)\r
+            for (var turn = 0; turn < eFlags.Length; turn++)\r
             {\r
-                // 一度に複数の目標を狙う攻撃はないものと仮定する\r
-                var hit = new {t = targets[i][0], d = damages[i].Sum(d => d >= 0 ? d : 0)};\r
-                if (hit.t == -1)\r
-                    continue;\r
-                if (ignoreFriendDamage && eflags[i] == 1)\r
+                if (ignoreFriendDamage && eFlags[turn] == 1)\r
                     continue;\r
-                records[eflags[i]][hit.t].ApplyDamage(hit.d);\r
+                for (var shot = 0; shot < targets[turn].Length; shot++)\r
+                {\r
+                    var target = targets[turn][shot];\r
+                    var damage  = damages[turn][shot];\r
+                    if (target == -1 || damage == -1)\r
+                        continue;\r
+                    records[eFlags[turn]][target].ApplyDamage(damage);\r
+                }\r
+                foreach (var ship in records[1])\r
+                    ship?.CheckDamageControl();\r
             }\r
         }\r
 \r
@@ -559,22 +567,23 @@ 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
                 select new Record {_status = (ShipStatus)s.Clone(), _practice = practice, StartHp = s.NowHp}).ToArray();\r
 \r
-            public static Record[] Setup(int[] nowhps, ShipSpec[] specs, ItemSpec[][] slots, bool practice)\r
+            public static Record[] Setup(int[] nowHps, ShipSpec[] specs, ItemSpec[][] slots, bool practice)\r
             {\r
-                return Enumerable.Range(0, nowhps.Length).Select(i =>\r
+                return Enumerable.Range(0, nowHps.Length).Select(i =>\r
                     new Record\r
                     {\r
-                        StartHp = nowhps[i],\r
+                        StartHp = nowHps[i],\r
                         _status = new ShipStatus\r
                         {\r
                             Id = specs[i].Id,\r
-                            NowHp = nowhps[i],\r
-                            MaxHp = nowhps[i],\r
+                            NowHp = nowHps[i],\r
+                            MaxHp = nowHps[i],\r
                             Spec = specs[i],\r
                             Slot = slots[i].Select(spec => new ItemStatus {Id = spec.Id, Spec = spec}).ToArray(),\r
                             SlotEx = new ItemStatus(0)\r
@@ -585,13 +594,12 @@ namespace KancolleSniffer.Model
 \r
             public void ApplyDamage(int damage)\r
             {\r
-                if (_status.NowHp > damage)\r
-                {\r
-                    _status.NowHp -= damage;\r
-                    return;\r
-                }\r
-                _status.NowHp = 0;\r
-                if (_practice)\r
+                _status.NowHp = Max(0, _status.NowHp - damage);\r
+            }\r
+\r
+            public void CheckDamageControl()\r
+            {\r
+                if (_status.NowHp > 0 || _practice)\r
                     return;\r
                 foreach (var item in new[] {_status.SlotEx}.Concat(_status.Slot))\r
                 {\r
@@ -605,6 +613,7 @@ namespace KancolleSniffer.Model
                     {\r
                         _status.NowHp = _status.MaxHp;\r
                         ConsumeSlotItem(_status, 43);\r
+                        GoddessConsumed = true;\r
                         break;\r
                     }\r
                 }\r
@@ -646,6 +655,7 @@ 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
@@ -654,6 +664,7 @@ 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
@@ -665,7 +676,7 @@ namespace KancolleSniffer.Model
 \r
             if (friendSunk == 0 && enemySunk == enemyCount)\r
             {\r
-                if (friendNowHpTotal >= friendStartHpTotal)\r
+                if (friendNowHpTotal == friendStartHpTotal && !goddessConsumed)\r
                     return BattleResultRank.P;\r
                 return BattleResultRank.S;\r
             }\r