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
             {\r
                 CalcDamage(json, url.EndsWith("battle_water"));\r
             }\r
-            ClearOverKill(_enemyHp);\r
+            ClearEnemyOverKill();\r
             ResultRank = url.EndsWith("ld_airbattle") ? CalcLdAirBattleRank() : CalcResultRank();\r
         }\r
 \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
         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
             }\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
         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
             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
             public int StartHp;\r
 \r
             public static Record[] Setup(ShipStatus[] ships) =>\r
@@ -513,87 +513,50 @@ namespace KancolleSniffer
             return BattleResultRank.E;\r
         }\r
 \r
             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
         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
 \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
             {\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
             }\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
             {\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
             }\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
                 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
                 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
 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
 ## 音声ファイル\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