4 namespace KancolleSniffer
\r
6 public class ConditionTimer
\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
14 public ConditionTimer(ShipInfo shipInfo)
\r
16 _shipInfo = shipInfo;
\r
19 public void SetTimer()
\r
21 for (var fleet = 0; fleet < ShipInfo.FleetCount; fleet++)
\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
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
34 _times[fleet] = cond < 49
\r
35 ? DateTime.Now.AddMinutes((49 - cond + 2) / 3 * 3)
\r
36 : DateTime.MinValue;
\r
40 public void Invalidate(int fleet)
\r
42 _enable[fleet] = _cond[fleet] == CondMin(fleet);
\r
45 private int CondMin(int fleet)
\r
47 return (from id in _shipInfo.GetDeck(fleet) where id != -1 select _shipInfo[id].Cond)
\r
48 .DefaultIfEmpty(49).Min();
\r
51 public DateTime GetTimer(int fleet)
\r
53 return _enable[fleet] ? _times[fleet] : DateTime.MinValue;
\r
56 public int[] GetNotice()
\r
58 var result = new int[_times.Length];
\r
59 for (var f = 0; f < _times.Length; f++)
\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
66 if (prev > TimeSpan.FromMinutes(9) && now <= TimeSpan.FromMinutes(9))
\r
68 else if (prev > TimeSpan.Zero && now <= TimeSpan.Zero)
\r