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         private readonly TimeSpan[] _prevLeftTimes = new TimeSpan[ShipInfo.FleetCount];\r
13 \r
14         public ConditionTimer(ShipInfo shipInfo)\r
15         {\r
16             _shipInfo = shipInfo;\r
17         }\r
18 \r
19         public void SetTimer()\r
20         {\r
21             for (var fleet = 0; fleet < ShipInfo.FleetCount; fleet++)\r
22             {\r
23                 if (!_enable[fleet]) // タイマーが無効なら前回の残り時間を無効にする\r
24                     _prevLeftTimes[fleet] = TimeSpan.MinValue;\r
25                 _enable[fleet] = true;\r
26                 var cond = _cond[fleet] = CondMin(fleet);\r
27                 if (cond < 49 && _times[fleet] != DateTime.MinValue) // 計時中\r
28                 {\r
29                     // コンディション値から推定される残り時刻と経過時間の差\r
30                     var diff = TimeSpan.FromMinutes((49 - cond + 2) / 3 * 3) - (_times[fleet] - DateTime.Now);\r
31                     if (diff >= TimeSpan.Zero && diff <= TimeSpan.FromMinutes(3)) // 差が0以上3分以内ならタイマーを更新しない。\r
32                         return;\r
33                 }\r
34                 _times[fleet] = cond < 49\r
35                     ? DateTime.Now.AddMinutes((49 - cond + 2) / 3 * 3)\r
36                     : DateTime.MinValue;\r
37             }\r
38         }\r
39 \r
40         public void Invalidate(int fleet)\r
41         {\r
42             _enable[fleet] = _cond[fleet] == CondMin(fleet);\r
43         }\r
44 \r
45         private int CondMin(int fleet)\r
46         {\r
47             return (from id in _shipInfo.GetDeck(fleet) where id != -1 select _shipInfo[id].Cond)\r
48                 .DefaultIfEmpty(49).Min();\r
49         }\r
50 \r
51         public DateTime GetTimer(int fleet)\r
52         {\r
53             return _enable[fleet] ? _times[fleet] : DateTime.MinValue;\r
54         }\r
55 \r
56         public int[] GetNotice()\r
57         {\r
58             var result = new int[_times.Length];\r
59             for (var f = 0; f < _times.Length; f++)\r
60             {\r
61                 var now = _times[f] == DateTime.MinValue ? TimeSpan.Zero : _times[f] - DateTime.Now;\r
62                 var prev = _prevLeftTimes[f];\r
63                 _prevLeftTimes[f] = now;\r
64                 if (prev == TimeSpan.MinValue)\r
65                     continue;\r
66                 if (prev > TimeSpan.FromMinutes(9) && now <= TimeSpan.FromMinutes(9))\r
67                     result[f] = 40;\r
68                 else if (prev > TimeSpan.Zero && now <= TimeSpan.Zero)\r
69                     result[f] = 49;\r
70             }\r
71             return result;\r
72         }\r
73     }\r
74 }