}\r
\r
/// <summary>\r
+ /// SGレーダー(初期型)の装備ボーナスを外して索敵スコアを計算する\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void LineOfSightWithSgRadar()\r
+ {\r
+ var sniffer = new Sniffer();\r
+ SniffLogFile(sniffer, "lineofsight_004");\r
+ var fleet = sniffer.Fleets[0];\r
+ PAssert.That(() => Abs(fleet.GetLineOfSights(1) - 0.93) < 0.01);\r
+ }\r
+\r
+ /// <summary>\r
/// 触接開始率を正しく計算する\r
/// </summary>\r
[TestMethod]\r
-Subproject commit 7877795d0035744d2fba262aac91245267b5bd8b
+Subproject commit 57340ec2ceb0ccd27c8f548bc67320e901dd68f2
<s:Boolean x:Key="/Default/UserDictionary/Words/=Scrollify/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Seiran/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=taiha/@EntryIndexedValue">True</s:Boolean>
- <s:Boolean x:Key="/Default/UserDictionary/Words/=Truncator/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
+ <s:Boolean x:Key="/Default/UserDictionary/Words/=Truncator/@EntryIndexedValue">True</s:Boolean>
+ <s:Boolean x:Key="/Default/UserDictionary/Words/=Yomi/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
\r
public double GetLineOfSights(int factor)\r
{\r
- var result = 0.0;\r
- var emptyBonus = 6;\r
- foreach (var s in ActualShips.Where(s => !s.Escaped))\r
- {\r
- emptyBonus--;\r
- var itemLoS = 0;\r
- foreach (var item in s.AllSlot)\r
- {\r
- var spec = item.Spec;\r
- itemLoS += spec.LoS;\r
- result += (spec.LoS + item.LoSLevelBonus) * spec.LoSScaleFactor * factor;\r
- }\r
- result += Sqrt(s.LoS - itemLoS);\r
- }\r
+ var actual = ActualShips.Where(s => !s.Escaped).ToArray();\r
+ var emptyBonus = 6 - actual.Length;\r
+ var result = actual.Sum(s =>\r
+ s.AllSlot.Sum(item => item.EffectiveLoS * factor) + Sqrt(s.RawLoS));\r
return result > 0 ? result - Ceiling(_getHqLevel() * 0.4) + emptyBonus * 2 : 0.0;\r
}\r
\r
}\r
}\r
\r
+ public int LoSSgRadarBonus => Id == 315 ? 4 : 0;\r
+\r
public bool IsAircraft\r
{\r
get\r
}\r
}\r
\r
- public double LoSLevelBonus\r
+ public double EffectiveLoS => (Spec.LoS + LoSLevelBonus) * Spec.LoSScaleFactor;\r
+\r
+ private double LoSLevelBonus\r
{\r
get\r
{\r
Id = (int)entry.api_id,\r
SortId = entry.api_sort_id() ? (int)entry.api_sort_id : 0,\r
Name = ShipName(entry),\r
+ Yomi = entry.api_yomi,\r
FuelMax = entry.api_fuel_max() ? (int)entry.api_fuel_max : 0,\r
BullMax = entry.api_bull_max() ? (int)entry.api_bull_max : 0,\r
SlotNum = (int)entry.api_slot_num,\r
public int Id { get; set; }\r
public int SortId { get; set; }\r
public string Name { get; set; }\r
+ public string Yomi { get; set; }\r
public int FuelMax { get; set; }\r
public int BullMax { get; set; }\r
public int SlotNum { get; set; }\r
public bool IsRepairShip => ShipType == 19;\r
\r
public bool IsTrainingCruiser => ShipType == 21;\r
+\r
+ public bool HaveSgRadarBonus\r
+ {\r
+ get\r
+ {\r
+ switch (Yomi)\r
+ {\r
+ case "フレッチャー":\r
+ case "ジョンストン":\r
+ case "サミュエル・B・ロバーツ":\r
+ case "コロラド":\r
+ case "サウスダコタ":\r
+ case "アイオワ":\r
+ case "サラトガ":\r
+ case "ホーネット":\r
+ case "イントレピッド":\r
+ case "ガンビア・ベイ":\r
+ case "ヒューストン":\r
+ case "ヘレナ":\r
+ case "アトランタ":\r
+ return true;\r
+ default:\r
+ return false;\r
+ }\r
+ }\r
+ }\r
}\r
}
\ No newline at end of file
\r
public int EffectiveBullMax => Max((int)(Spec.BullMax * (Level >= 100 ? 0.85 : 1.0)), 1);\r
\r
+ public int RawLoS =>\r
+ LoS - AllSlot.Sum(item => item.Spec.LoS + (Spec.HaveSgRadarBonus ? item.Spec.LoSSgRadarBonus : 0));\r
+\r
public object Clone()\r
{\r
var r = (ShipStatus)MemberwiseClone();\r