_notificationManager.Enqueue("大破警告", string.Join(" ", _sniffer.BadlyDamagedShips));\r
}\r
\r
- private void NotifyAkashiTimer()\r
- {\r
- var akashi = _sniffer.AkashiTimer;\r
- var msgs = akashi.GetNotice();\r
- if (msgs.Length == 0)\r
- {\r
- _notificationManager.StopRepeat("泊地修理");\r
- return;\r
- }\r
- if (!akashi.CheckReparing() && !(akashi.CheckPresetReparing() && _config.UsePresetAkashi))\r
- {\r
- _notificationManager.StopRepeat("泊地修理");\r
- return;\r
- }\r
- if (msgs[0].Proceeded == "20分経過しました。")\r
- {\r
- SetNotification("泊地修理20分経過", msgs[0].Proceeded);\r
- msgs[0].Proceeded = "";\r
- // 修理完了がいるかもしれないので続ける\r
- }\r
- for (var i = 0; i < ShipInfo.FleetCount; i++)\r
- {\r
- if (msgs[i].Proceeded != "")\r
- SetNotification("泊地修理進行", i, msgs[i].Proceeded);\r
- if (msgs[i].Completed != "")\r
- SetNotification("泊地修理完了", i, msgs[i].Completed);\r
- }\r
- }\r
-\r
public void UpdateFighterPower(bool combined)\r
{\r
var fp = combined\r
UpdateTimers();\r
}\r
\r
+ private DateTime _prev, _now;\r
+\r
private void UpdateTimers()\r
{\r
+ _prev = _now;\r
+ _now = DateTime.Now;\r
var mission = new[] {labelMission1, labelMission2, labelMission3};\r
for (var i = 0; i < mission.Length; i++)\r
{\r
var entry = _sniffer.Missions[i];\r
- entry.Timer.Update();\r
- SetTimerColor(mission[i], entry.Timer);\r
- mission[i].Text = entry.Timer.ToString(_missionFinishTimeMode);\r
- if (!entry.Timer.NeedRing)\r
- continue;\r
- SetNotification("遠征終了", i + 1, entry.Name);\r
- entry.Timer.NeedRing = false;\r
+ SetTimerColor(mission[i], entry.Timer, _now);\r
+ mission[i].Text = entry.Timer.ToString(_now, _missionFinishTimeMode);\r
+ if (entry.Timer.CheckRing(_prev, _now))\r
+ SetNotification("遠征終了", i + 1, entry.Name);\r
}\r
for (var i = 0; i < _sniffer.NDock.Length; i++)\r
{\r
var entry = _sniffer.NDock[i];\r
- entry.Timer.Update();\r
- _shipLabels.SetNDockTimer(i, entry.Timer, _ndockFinishTimeMode);\r
- if (!entry.Timer.NeedRing)\r
- continue;\r
- SetNotification("入渠終了", i, entry.Name);\r
- entry.Timer.NeedRing = false;\r
+ _shipLabels.SetNDockTimer(i, entry.Timer, _now, _ndockFinishTimeMode);\r
+ if (entry.Timer.CheckRing(_prev, _now))\r
+ SetNotification("入渠終了", i, entry.Name);\r
}\r
var kdock = new[] {labelConstruct1, labelConstruct2, labelConstruct3, labelConstruct4};\r
for (var i = 0; i < kdock.Length; i++)\r
{\r
var timer = _sniffer.KDock[i];\r
- timer.Update();\r
- SetTimerColor(kdock[i], timer);\r
-\r
- kdock[i].Text = timer.ToString();\r
- if (!timer.NeedRing)\r
- continue;\r
- SetNotification("建造完了", $"第{i + 1:D}ドック");\r
- timer.NeedRing = false;\r
+ SetTimerColor(kdock[i], timer, _now);\r
+ kdock[i].Text = timer.ToString(_now);\r
+ if (timer.CheckRing(_prev, _now))\r
+ SetNotification("建造完了", $"第{i + 1:D}ドック");\r
}\r
UpdateCondTimers();\r
UpdateAkashiTimer();\r
}\r
\r
- private void SetTimerColor(Label label, RingTimer timer)\r
+ private void SetTimerColor(Label label, RingTimer timer, DateTime now)\r
{\r
- label.ForeColor = timer.IsFinished ? CUDColor.Red : Color.Black;\r
+ label.ForeColor = timer.IsFinished(now) ? CUDColor.Red : Color.Black;\r
}\r
\r
private void UpdateCondTimers()\r
{\r
timer = _sniffer.GetConditionTimer(_currentFleet);\r
}\r
- var now = DateTime.Now;\r
if (timer == DateTime.MinValue)\r
{\r
labelCondTimerTitle.Text = "";\r
labelCondTimer.Text = "";\r
return;\r
}\r
- var span = TimeSpan.FromSeconds(Ceiling((timer - now).TotalSeconds));\r
+ var span = TimeSpan.FromSeconds(Ceiling((timer - _now).TotalSeconds));\r
if (span >= TimeSpan.FromMinutes(9))\r
{\r
labelCondTimerTitle.Text = "cond40まで";\r
labelCondTimer.Text = (span >= TimeSpan.Zero ? span : TimeSpan.Zero).ToString(@"mm\:ss");\r
labelCondTimer.ForeColor = span <= TimeSpan.Zero ? CUDColor.Red : DefaultForeColor;\r
}\r
- var notice = _sniffer.GetConditionNotice();\r
+ var notice = _sniffer.GetConditionNotice(_prev, _now);\r
if (notice == null)\r
return;\r
for (var i = 0; i < ShipInfo.FleetCount; i++)\r
}\r
}\r
\r
+ private void NotifyAkashiTimer()\r
+ {\r
+ var akashi = _sniffer.AkashiTimer;\r
+ var msgs = akashi.GetNotice(_prev, _now);\r
+ if (msgs.Length == 0)\r
+ {\r
+ _notificationManager.StopRepeat("泊地修理");\r
+ return;\r
+ }\r
+ if (!akashi.CheckReparing() && !(akashi.CheckPresetReparing() && _config.UsePresetAkashi))\r
+ {\r
+ _notificationManager.StopRepeat("泊地修理");\r
+ return;\r
+ }\r
+ if (msgs[0].Proceeded == "20分経過しました。")\r
+ {\r
+ SetNotification("泊地修理20分経過", msgs[0].Proceeded);\r
+ msgs[0].Proceeded = "";\r
+ // 修理完了がいるかもしれないので続ける\r
+ }\r
+ for (var i = 0; i < ShipInfo.FleetCount; i++)\r
+ {\r
+ if (msgs[i].Proceeded != "")\r
+ SetNotification("泊地修理進行", i, msgs[i].Proceeded);\r
+ if (msgs[i].Completed != "")\r
+ SetNotification("泊地修理完了", i, msgs[i].Completed);\r
+ }\r
+ }\r
+\r
private void UpdateRepairList()\r
{\r
panelRepairList.SetRepairList(_sniffer.RepairList);\r
\r
public DateTime GetConditionTimer(int fleet) => _conditionTimer.GetTimer(fleet);\r
\r
- public int[] GetConditionNotice() => _conditionTimer.GetNotice();\r
+ public int[] GetConditionNotice(DateTime prev, DateTime now) => _conditionTimer.GetNotice(prev, now);\r
\r
public ShipStatus[] GetShipStatuses(int fleet) => _shipInfo.GetShipStatuses(fleet);\r
\r
private readonly TimeSpan _spare;\r
private bool _finished;\r
\r
- public TimeSpan Rest { get; private set; }\r
-\r
- public bool IsFinished => _finished;\r
+ public bool IsFinished(DateTime now) => EndTime != DateTime.MinValue && EndTime - now < _spare || _finished;\r
\r
public DateTime EndTime { get; private set; }\r
\r
- public bool NeedRing { get; set; }\r
-\r
public RingTimer(int spare = 60)\r
{\r
_spare = TimeSpan.FromSeconds(spare);\r
_finished = true;\r
}\r
\r
- public void Update()\r
+ public bool CheckRing(DateTime prev, DateTime now)\r
{\r
- if (EndTime == DateTime.MinValue || _finished)\r
- {\r
- Rest = TimeSpan.Zero;\r
- return;\r
- }\r
- var prev = Rest;\r
- Rest = EndTime - DateTime.Now;\r
- if (Rest < TimeSpan.Zero)\r
- Rest = TimeSpan.Zero;\r
- if (_spare >= Rest)\r
- {\r
- _finished = true;\r
- if (prev > _spare)\r
- NeedRing = true;\r
- }\r
+ return EndTime != DateTime.MinValue && prev != DateTime.MinValue &&\r
+ prev < EndTime -_spare && EndTime - _spare <= now;\r
}\r
\r
- public string ToString(bool endTime = false)\r
- => EndTime == DateTime.MinValue && !_finished\r
- ? ""\r
- : endTime\r
- ? EndTime.ToString(@"dd\ HH\:mm", CultureInfo.InvariantCulture)\r
- : $"{(int)Rest.TotalHours:d2}:" + Rest.ToString(@"mm\:ss", CultureInfo.InvariantCulture);\r
+ public string ToString(DateTime now, bool endTime = false)\r
+ {\r
+ if (EndTime == DateTime.MinValue && !_finished)\r
+ return "";\r
+ if (endTime)\r
+ return EndTime.ToString(@"dd\ HH\:mm", CultureInfo.InvariantCulture);\r
+ var rest = _finished || EndTime - now < TimeSpan.Zero ? TimeSpan.Zero : EndTime - now;\r
+ return $"{(int)rest.TotalHours:d2}:" + rest.ToString(@"mm\:ss", CultureInfo.InvariantCulture);\r
+ }\r
}\r
}
\ No newline at end of file