OSDN Git Service

敵が連合艦隊のときに勝利判定を間違えるのを直す
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 23 Oct 2016 17:57:57 +0000 (02:57 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 29 Oct 2016 06:25:06 +0000 (15:25 +0900)
KancolleSniffer/BattleInfo.cs
NOTICE.md

index 2926568..1430dbf 100644 (file)
@@ -74,10 +74,16 @@ namespace KancolleSniffer
             {\r
                 CalcDamage(json, url.EndsWith("battle_water"));\r
             }\r
-            ClearOverKill(_enemyHp);\r
+            ClearEnemyOverKill();\r
             ResultRank = url.EndsWith("ld_airbattle") ? CalcLdAirBattleRank() : CalcResultRank();\r
         }\r
 \r
+        private void ClearEnemyOverKill()\r
+        {\r
+            _enemyHp = _enemyHp.Select(hp => hp < 0 ? 0 : hp).ToArray();\r
+            _enemyGuardHp = _enemyGuardHp.Select(hp => hp < 0 ? 0 : hp).ToArray();\r
+        }\r
+\r
         public void InspectMapNext(string request)\r
         {\r
             var type = HttpUtility.ParseQueryString(request)["api_recovery_type"];\r
@@ -383,13 +389,6 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        private void ClearOverKill(int[] result)\r
-        {\r
-            for (var i = 0; i < result.Length; i++)\r
-                if (result[i] < 0)\r
-                    result[i] = 0;\r
-        }\r
-\r
         public void InspectBattleResult(dynamic json)\r
         {\r
             ShowResult();\r
@@ -450,6 +449,7 @@ namespace KancolleSniffer
             private ShipStatus _status;\r
             public int NowHp => _status.NowHp;\r
             public bool Escaped => _status.Escaped;\r
+            public ShipStatus.Damage DamageLevel => _status.DamageLevel;\r
             public int StartHp;\r
 \r
             public static Record[] Setup(ShipStatus[] ships) =>\r
@@ -513,87 +513,50 @@ namespace KancolleSniffer
             return BattleResultRank.E;\r
         }\r
 \r
-        // 以下のコードは航海日誌拡張版の以下のファイルのcalcResultRankを移植したもの\r
-        // https://github.com/nekopanda/logbook/blob/94ceca4be6d4ce79a8759d1ee747fb9827c08edc/main/logbook/dto/BattleExDto.java\r
-        //\r
-        // The MIT License (MIT)\r
-        //\r
-        // Copyright (c) 2014-2015 航海日誌拡張版開発者\r
-        //\r
-        // Permission is hereby granted, free of charge, to any person obtaining a copy\r
-        // of this software and associated documentation files (the "Software"), to deal\r
-        // in the Software without restriction, including without limitation the rights\r
-        // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
-        // copies of the Software, and to permit persons to whom the Software is\r
-        // furnished to do so, subject to the following conditions:\r
-        //\r
-        // The above copyright notice and this permission notice shall be included in\r
-        // all copies or substantial portions of the Software.\r
-        //\r
-        // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-        // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-        // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
-        // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
-        // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
-        // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
-        // THE SOFTWARE.\r
-        //\r
         private BattleResultRank CalcResultRank()\r
         {\r
             var friend = _friend.Concat(_guard).ToArray();\r
             var enemyHp = _enemyHp.Concat(_enemyGuardHp).ToArray();\r
             var enemyStartHp = _enemyStartHp.Concat(_enemyGuardStartHp).ToArray();\r
-            // 戦闘後に残っている艦数\r
-            var friendNowShips = friend.Count(r => r.NowHp > 0);\r
-            var enemyNowShips = enemyHp.Count(hp => hp > 0);\r
-            // 総ダメージ\r
-            var friendGauge = Max(friend.Sum(r => r.StartHp - r.NowHp), 0); // ダメコン・女神発動で負になりうる\r
-            var enemyGauge = enemyStartHp.Sum() - enemyHp.Sum();\r
-            // 轟沈・撃沈数\r
-            var friendSunk = friend.Count(r => r.NowHp == 0);\r
-            var enemySunk = enemyHp.Count(hp => hp == 0);\r
 \r
-            var friendGaugeRate = Floor((double)friendGauge / friend.Where(r => !r.Escaped).Sum(r => r.StartHp) * 100);\r
-            var enemyGaugeRate = Floor((double)enemyGauge / enemyStartHp.Sum() * 100);\r
-            var equalOrMore = enemyGaugeRate > 0.9 * friendGaugeRate;\r
-            var superior = enemyGaugeRate > 0 && enemyGaugeRate > 2.5 * friendGaugeRate;\r
-\r
-            if (friendSunk == 0)\r
+            var friendCount = friend.Length;\r
+            var friendStartHpTotal = 0;\r
+            var friendNowHpTotal = 0;\r
+            var friendSunk = 0;\r
+            foreach (var ship in friend)\r
             {\r
-                if (enemyNowShips == 0)\r
-                {\r
-                    if (friendGauge == 0)\r
-                        return BattleResultRank.P;\r
-                    return BattleResultRank.S;\r
-                }\r
-                if (enemyHp.Length == 6)\r
-                {\r
-                    if (enemySunk >= 4)\r
-                        return BattleResultRank.A;\r
-                }\r
-                else if (enemySunk * 2 >= _enemyHp.Length)\r
-                {\r
-                    return BattleResultRank.A;\r
-                }\r
-                if (_enemyHp[0] == 0)\r
-                    return BattleResultRank.B;\r
-                if (superior)\r
-                    return BattleResultRank.B;\r
+                if (ship.Escaped)\r
+                    continue;\r
+                friendStartHpTotal += ship.StartHp;\r
+                friendNowHpTotal += ship.NowHp;\r
+                if (ship.NowHp == 0)\r
+                    friendSunk++;\r
             }\r
-            else\r
+            var friendGaugeRate = (int)((double)(friendStartHpTotal - friendNowHpTotal) / friendStartHpTotal * 100);\r
+\r
+            var enemyCount = enemyHp.Length;\r
+            var enemyStartHpTotal = enemyStartHp.Sum();\r
+            var enemyNowHpTotal = enemyHp.Sum();\r
+            var enemySunk = enemyHp.Count(hp => hp == 0);\r
+            var enemyGaugeRate = (int)((double)(enemyStartHpTotal - enemyNowHpTotal) / enemyStartHpTotal * 100);\r
+\r
+            if (friendSunk == 0 && enemySunk == enemyCount)\r
             {\r
-                if (enemyNowShips == 0)\r
-                    return BattleResultRank.B;\r
-                if (_enemyHp[0] == 0 && friendSunk < enemySunk)\r
-                    return BattleResultRank.B;\r
-                if (superior)\r
-                    return BattleResultRank.B;\r
-                if (_enemyHp[0] == 0)\r
-                    return BattleResultRank.C;\r
+                if (friendNowHpTotal >= friendStartHpTotal)\r
+                    return BattleResultRank.P;\r
+                return BattleResultRank.S;\r
             }\r
-            if (enemyGauge > 0 && equalOrMore)\r
+            if (friendSunk == 0 && enemySunk >= (int)(enemyCount * 0.7) && enemyCount > 1)\r
+                return BattleResultRank.A;\r
+            if (friendSunk < enemySunk && enemyHp[0] == 0)\r
+                return BattleResultRank.B;\r
+            if (friendCount == 1 && friend[0].DamageLevel == ShipStatus.Damage.Badly)\r
+                return BattleResultRank.D;\r
+            if (enemyGaugeRate > friendGaugeRate * 2.5)\r
+                return BattleResultRank.B;\r
+            if (enemyGaugeRate > friendGaugeRate * 0.9)\r
                 return BattleResultRank.C;\r
-            if (friendSunk > 0 && friendNowShips == 1)\r
+            if (friendCount > 1 && friendCount - 1 == friendSunk)\r
                 return BattleResultRank.E;\r
             return BattleResultRank.D;\r
         }\r
index 5d3cd21..bc726c9 100644 (file)
--- a/NOTICE.md
+++ b/NOTICE.md
@@ -40,32 +40,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
 THE SOFTWARE.\r
 \r
-### [航海日誌 拡張版](http://nekopanda.blog.jp/)\r
-\r
-勝利判定のコードを利用しています。\r
-\r
-The MIT License (MIT)\r
-\r
-Copyright (c) 2014-2015 航海日誌拡張版開発者\r
-\r
-Permission is hereby granted, free of charge, to any person obtaining a copy\r
-of this software and associated documentation files (the "Software"), to deal\r
-in the Software without restriction, including without limitation the rights\r
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
-copies of the Software, and to permit persons to whom the Software is\r
-furnished to do so, subject to the following conditions:\r
-\r
-The above copyright notice and this permission notice shall be included in\r
-all copies or substantial portions of the Software.\r
-\r
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
-THE SOFTWARE.\r
-\r
 ## 音声ファイル\r
 \r
 [Open JTalk](http://open-jtalk.sp.nitech.ac.jp/index.php)で生成したものを、[CC-BY 3.0](https://creativecommons.org/licenses/by/3.0/)に基づき利用しています。\r