OSDN Git Service

夜間触接発動率を計算する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 22 Dec 2019 13:18:36 +0000 (22:18 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Wed, 25 Dec 2019 08:49:53 +0000 (17:49 +0900)
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer.Test/logs
KancolleSniffer/Model/Fleet.cs
KancolleSniffer/Model/ItemSpec.cs

index 1c2e2e6..cd5154d 100644 (file)
@@ -310,6 +310,25 @@ namespace KancolleSniffer.Test
         }\r
 \r
         /// <summary>\r
+        /// 夜戦発動率を計算する\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void NightContactTriggerRate()\r
+        {\r
+            var sniffer = new Sniffer();\r
+            SniffLogFile(sniffer, "nightrecon_001");\r
+            PAssert.That(() => Abs(sniffer.Fleets[0].NightContactTriggerRate - 84.64) < 0.01);\r
+            var ship = sniffer.Fleets[0].Ships[0];\r
+            var empty = Enumerable.Repeat(new ItemStatus(), 5).ToArray();\r
+            var orig = ship.Slot;\r
+            ship.Slot = empty;\r
+            PAssert.That(() => Abs(sniffer.Fleets[0].NightContactTriggerRate - 52) < 0.01);\r
+            ship.Slot = orig;\r
+            sniffer.Fleets[0].Ships[1].Slot = empty;\r
+            PAssert.That(() => Abs(sniffer.Fleets[0].NightContactTriggerRate - 68) < 0.01);\r
+        }\r
+\r
+        /// <summary>\r
         /// 編成で空き番号を使ったローテートを正しく反映する\r
         /// </summary>\r
         [TestMethod]\r
index bec859f..cee4be2 160000 (submodule)
@@ -1 +1 @@
-Subproject commit bec859f3bfa2e99759505a46cff017fd4d5b98c7
+Subproject commit cee4be25181f2e1bf9b45bcd410887301dacad49
index 691091e..dbcea00 100644 (file)
@@ -314,6 +314,14 @@ namespace KancolleSniffer.Model
 \r
         public int CombinedTorpedoPenalty => CombinedType != 0 && Number == 1 ? -5 : 0;\r
 \r
+        public double NightContactTriggerRate => (1.0 - NightContactFailRate) * 100;\r
+\r
+        private double NightContactFailRate => Ships.Aggregate(1.0,\r
+            (perFleet, ship) => ship.OnSlot.Where((onSlot, i) => onSlot > 0 && ship.Slot[i].Spec.IsNightRecon)\r
+                .Aggregate(perFleet, (perShip, _) => perShip * NightContactFailRateOne(ship)));\r
+\r
+        private static double NightContactFailRateOne(ShipStatus ship) => 1.0 - Floor(Sqrt(ship.Level * 3)) * 4 / 100.0;\r
+\r
         public string MissionParameter\r
         {\r
             get\r
index d91b626..c0ddc44 100644 (file)
@@ -152,6 +152,8 @@ namespace KancolleSniffer.Model
 \r
         public bool IsArmyAircraft => Type == 25 || Type == 26;\r
 \r
+        public bool IsNightRecon => Id == 102;\r
+\r
         public double ContactTriggerRate\r
         {\r
             get\r