}\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
-Subproject commit bec859f3bfa2e99759505a46cff017fd4d5b98c7
+Subproject commit cee4be25181f2e1bf9b45bcd410887301dacad49
\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
\r
public bool IsArmyAircraft => Type == 25 || Type == 26;\r
\r
+ public bool IsNightRecon => Id == 102;\r
+\r
public double ContactTriggerRate\r
{\r
get\r