OSDN Git Service

Graf Zeppelin以外の空母の夜戦攻撃力を表示する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 18 Mar 2018 05:19:48 +0000 (14:19 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 18 Mar 2018 05:51:42 +0000 (14:51 +0900)
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer.Test/logs
KancolleSniffer/ItemInfo.cs
KancolleSniffer/ShipStatus.cs

index 312e626..15282c8 100644 (file)
@@ -352,11 +352,12 @@ namespace KancolleSniffer.Test
 \r
             var msgs = new[] {"", "鬼怒改二+特大発+おにぎり", "駆逐艦+士魂部隊", "補給艦"};\r
             var results = new[] {47, 19, 13, 15};\r
-            for (int i = 0; i < msgs.Length; i++)\r
+            for (var i = 0; i < msgs.Length; i++)\r
             {\r
                 var sniffer = new Sniffer();\r
                 SniffLogFile(sniffer, "transportpoint_00" + (i + 1));\r
-                PAssert.That(() => (int)sniffer.GetShipStatuses(0).Sum(s => s.TransportPoint) == results[i], msgs[i]);\r
+                var j = i;\r
+                PAssert.That(() => (int)sniffer.GetShipStatuses(0).Sum(s => s.TransportPoint) == results[j], msgs[j]);\r
             }\r
         }\r
 \r
@@ -377,6 +378,28 @@ namespace KancolleSniffer.Test
         }\r
 \r
         /// <summary>\r
+        /// 空母の夜戦火力を計算する\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void CvNightBattlePower()\r
+        {\r
+            var sniffer = new Sniffer();\r
+            SniffLogFile(sniffer, "nightbattlepower_001");\r
+            var ships = sniffer.GetShipStatuses(0);\r
+            PAssert.That(() =>\r
+                ships.Select(ship => (int)(ship.NightBattlePower * 100))\r
+                    .SequenceEqual(new[] {11202, 14985, 20092, 17354}));\r
+            // 夜間作戦航空要員を外す\r
+            ships[0].Slot[3] = ships[1].Slot[2] = ships[3].Slot[2] = new ItemStatus();\r
+            PAssert.That(() =>\r
+                ships.Select(ship => (int)(ship.NightBattlePower * 100))\r
+                    .SequenceEqual(new[] {6900, 7500, 20092, 0}));\r
+            // Ark RoyalからSwordfishを外す\r
+            ships[0].Slot[0] = new ItemStatus();\r
+            PAssert.That(() => (int)ships[0].NightBattlePower == 0);\r
+        }\r
+\r
+        /// <summary>\r
         /// 編成で空き番号を使ったローテートを正しく反映する\r
         /// </summary>\r
         [TestMethod]\r
index a490671..359c1bd 160000 (submodule)
@@ -1 +1 @@
-Subproject commit a490671d227804409f61dbc48939808951aed117
+Subproject commit 359c1bdaac80b0630b3301e04c165a45044b10e2
index 2e25de4..ef0f12c 100644 (file)
@@ -26,6 +26,7 @@ namespace KancolleSniffer
         public string Name;\r
         public int Type;\r
         public string TypeName;\r
+        public int Firepower;\r
         public int IconType;\r
         public int AntiAir;\r
         public int LoS;\r
@@ -433,7 +434,7 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        public double FirePowerLevelBonus\r
+        public double FirepowerLevelBonus\r
         {\r
             get\r
             {\r
@@ -637,6 +638,7 @@ namespace KancolleSniffer
                     Type = type,\r
                     TypeName = dict.TryGetValue(type, out var typeName) ? typeName : "不明",\r
                     IconType = (int)entry.api_type[3],\r
+                    Firepower = (int)entry.api_houg,\r
                     AntiAir = (int)entry.api_tyku,\r
                     LoS = (int)entry.api_saku,\r
                     AntiSubmarine = (int)entry.api_tais,\r
index c074583..ae240fc 100644 (file)
@@ -100,7 +100,7 @@ namespace KancolleSniffer
                     return 0;\r
                 var isRyuseiAttack = Spec.Id == 352 && // 速吸改\r
                                      Slot.Any(item => item.Spec.Type == 8); // 艦攻装備\r
-                var levelBonus = AllSlot.Sum(item => item.FirePowerLevelBonus);\r
+                var levelBonus = AllSlot.Sum(item => item.FirepowerLevelBonus);\r
                 if (!Spec.IsAircraftCarrier && !isRyuseiAttack)\r
                     return Firepower + levelBonus + CombinedFleetFirepowerBonus + 5;\r
                 var specs = (from item in Slot where item.Spec.IsAircraft select item.Spec).ToArray();\r
@@ -224,8 +224,54 @@ namespace KancolleSniffer
         {\r
             get\r
             {\r
-                if (Spec.IsAircraftCarrier && Spec.Id != 353 && Spec.Id != 432) // Graf Zeppelin以外の空母\r
-                    return 0;\r
+                if (!Spec.IsAircraftCarrier)\r
+                    return Firepower + Torpedo + Slot.Sum(item => item.NightBattleLevelBonus);\r
+\r
+                if (Slot.Any(item => item.Spec.IconType == 45 || item.Spec.IconType == 46) && // 夜戦か夜攻\r
+                    (Spec.Id == 545 || // Saratoga Mk.II\r
+                     Slot.Any(item => item.Spec.Id == 258 || item.Spec.Id == 259))) // 夜間作戦航空要員\r
+                {\r
+                    return Firepower + Slot.Zip(OnSlot, (item, onslot) =>\r
+                    {\r
+                        double a, b;\r
+                        var spec = item.Spec;\r
+                        switch (spec.Id)\r
+                        {\r
+                            case 154: // 零戦62型(爆戦/岩井隊)\r
+                            case 242: // Swordfish\r
+                            case 243: // Swordfish Mk.II(熟練)\r
+                            case 244: // Swordfish Mk.III(熟練)\r
+                                a = 0.0;\r
+                                b = 0.3;\r
+                                break;\r
+                            case 254: // F6F-3N\r
+                            case 255: // F6F-5N\r
+                            case 257: // TBD-3D\r
+                                a = 3.0;\r
+                                b = 0.45;\r
+                                break;\r
+                            default:\r
+                                return -spec.Firepower;\r
+                        }\r
+                        return spec.Torpedo + a * onslot +\r
+                               b * (spec.Firepower + spec.Torpedo + spec.Bomber + spec.AntiSubmarine) *\r
+                               Sqrt(onslot) + Sqrt(item.Level);\r
+                    }).Sum();\r
+                }\r
+                switch (Spec.Id)\r
+                {\r
+                    case 353: // Graf Zeppelin改\r
+                    case 432: // Graf Zeppelin\r
+                    case 433: // Saratoga\r
+                        break;\r
+                    case 393: // Ark Royal改\r
+                    case 515: // Ark Royal\r
+                        if (Slot.Any(item => new[] {242, 243, 244}.Contains(item.Spec.Id)))\r
+                            break;\r
+                        return 0;\r
+                    default:\r
+                        return 0;\r
+                }\r
                 return Firepower + Torpedo + Slot.Sum(item => item.NightBattleLevelBonus);\r
             }\r
         }\r