\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
}\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
-Subproject commit a490671d227804409f61dbc48939808951aed117
+Subproject commit 359c1bdaac80b0630b3301e04c165a45044b10e2
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
}\r
}\r
\r
- public double FirePowerLevelBonus\r
+ public double FirepowerLevelBonus\r
{\r
get\r
{\r
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
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
{\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