OSDN Git Service

編成を入れ替えたときに再計算の必要なときだけ疲労タイマーを無効にする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / ConditionTimer.cs
1 using System;\r
2 using System.Linq;\r
3 \r
4 namespace KancolleSniffer\r
5 {\r
6     public class ConditionTimer\r
7     {\r
8         private readonly ShipInfo _shipInfo;\r
9         private readonly DateTime[][] _times = new DateTime[ShipInfo.FleetCount][];\r
10         private readonly bool[] _enable = new bool[ShipInfo.FleetCount];\r
11         private readonly int[] _cond = new int[ShipInfo.FleetCount];\r
12 \r
13         public ConditionTimer(ShipInfo shipInfo)\r
14         {\r
15             _shipInfo = shipInfo;\r
16             for (var f = 0; f < _times.Length; f++)\r
17                 _times[f] = new DateTime[3];\r
18         }\r
19 \r
20         public void SetTimer()\r
21         {\r
22             for (var fleet = 0; fleet < ShipInfo.FleetCount; fleet++)\r
23             {\r
24                 _enable[fleet] = true;\r
25                 var cond = _cond[fleet] = CondMin(fleet);\r
26                 var time49 = _times[fleet][2];\r
27                 if (cond < 49 && time49 != DateTime.MinValue) // 計時中\r
28                 {\r
29                     // コンディション値から推定される残り時刻と経過時間の差\r
30                     var diff = TimeSpan.FromMinutes((49 - cond + 2) / 3 * 3) - (time49 - DateTime.Now);\r
31                     if (diff >= TimeSpan.Zero && diff <= TimeSpan.FromMinutes(3)) // 差が0以上3分以内ならタイマーを更新しない。\r
32                         return;\r
33                 }\r
34                 var thresh = new[] {30, 40, 49};\r
35                 for (var i = 0; i < thresh.Length; i++)\r
36                     _times[fleet][i] = cond < thresh[i]\r
37                         ? DateTime.Now.AddMinutes((thresh[i] - cond + 2) / 3 * 3)\r
38                         : DateTime.MinValue;\r
39             }\r
40         }\r
41 \r
42         public void Invalidate(int fleet)\r
43         {\r
44             _enable[fleet] = _cond[fleet] == CondMin(fleet);\r
45         }\r
46 \r
47         private int CondMin(int fleet)\r
48         {\r
49             return (from id in _shipInfo.GetDeck(fleet) where id != -1 select _shipInfo[id].Cond)\r
50                 .DefaultIfEmpty(49).Min();\r
51         }\r
52 \r
53         public string[] GetTimerStrings(int fleet)\r
54         {\r
55             if (!_enable[fleet])\r
56                 return new[] {"無効", "無効", "無効"};\r
57             var now = DateTime.Now;\r
58             return\r
59                 (from time in _times[fleet] select time > now ? (time - now).ToString(@"mm\:ss") : "00:00")\r
60                     .ToArray();\r
61         }\r
62     }\r
63 }