<Compile Include="Log\BattleLogProcessor.cs" />\r
<Compile Include="Model\Range.cs" />\r
<Compile Include="Util\Clipboard.cs" />\r
+ <Compile Include="Util\TimeStep.cs" />\r
<Compile Include="View\ChargeStatus.cs">\r
<SubType>Component</SubType>\r
</Compile>\r
private bool _timerEnabled;\r
private string _debugLogFile;\r
private IEnumerator<string> _playLog;\r
- private DateTime _prev, _now;\r
+ private readonly TimeStep _step = new TimeStep();\r
private IEnumerable<IUpdateContext> _updateable;\r
private IEnumerable<IUpdateTimers> _timers;\r
\r
hqPanel, missionPanel, kdockPanel, ndockPanel, materialHistoryPanel, shipInfoPanel, chargeStatus1,\r
chargeStatus2, chargeStatus3, chargeStatus4, _notifier\r
};\r
- var context = new UpdateContext(Sniffer, Config, () => _now, () => _prev);\r
+ var context = new UpdateContext(Sniffer, Config, () => _step);\r
foreach (var updateable in _updateable)\r
updateable.Context = context;\r
_timers = new IUpdateTimers[] {missionPanel, kdockPanel, ndockPanel, shipInfoPanel};\r
}\r
if (!_started)\r
return;\r
- if (_now == DateTime.MinValue)\r
- _now = DateTime.Now;\r
+ if (_step.Now == DateTime.MinValue)\r
+ _step.SetNow();\r
if ((update & Sniffer.Update.Item) != 0)\r
UpdateItemInfo();\r
if ((update & Sniffer.Update.Timer) != 0)\r
{\r
try\r
{\r
- _now = DateTime.Now;\r
+ _step.SetNow();\r
UpdateTimers();\r
_notifier.NotifyTimers();\r
- _prev = _now;\r
+ _step.SetPrev();\r
}\r
catch (Exception ex)\r
{\r
private IReadOnlyList<int> _deck = new int[0];\r
private TimeSpan FirstRepairTime => TimeSpan.FromMinutes(20);\r
\r
- private bool PassedFirstRepairTime(DateTime start, DateTime prev, DateTime now) =>\r
- prev - start < FirstRepairTime && now - start >= FirstRepairTime;\r
+ private bool PassedFirstRepairTime(DateTime start, TimeStep step) =>\r
+ step.Prev - start < FirstRepairTime && step.Now - start >= FirstRepairTime;\r
\r
private TimeSpan RepairTime(ShipStatus ship, int damage) =>\r
TimeSpan.FromMinutes(Math.Ceiling(ship.RepairTime.TotalMinutes / (ship.MaxHp - ship.NowHp) * damage));\r
}).ToArray();\r
}\r
\r
- public Notice GetNotice(DateTime start, DateTime prev, DateTime now)\r
+ public Notice GetNotice(DateTime start, TimeStep step)\r
{\r
var proc = new List<string>();\r
var comp = new List<string>();\r
continue;\r
if (damage == 1)\r
{\r
- if (PassedFirstRepairTime(start, prev, now))\r
+ if (PassedFirstRepairTime(start, step))\r
comp.Add(s.Name);\r
continue;\r
}\r
var span = RepairTime(s, d);\r
if (span <= FirstRepairTime)\r
{\r
- if (d == damage && PassedFirstRepairTime(start, prev, now))\r
+ if (d == damage && PassedFirstRepairTime(start, step))\r
comp.Add(s.Name);\r
continue;\r
}\r
- if (span <= prev - start || now - start < span)\r
+ if (span <= step.Prev - start || step.Now - start < span)\r
continue;\r
if (d == damage)\r
comp.Add(s.Name);\r
=> _presetDeck.Decks.Where(deck => deck != null)\r
.Any(deck => RepairTarget(deck.Select(id => _shipInfo.GetShip(id)).ToArray()).Any(s => s.NowHp < s.MaxHp));\r
\r
- public Notice[] GetNotice(DateTime prev, DateTime now)\r
+ public Notice[] GetNotice(TimeStep step)\r
{\r
- if (prev == DateTime.MinValue || _start == DateTime.MinValue)\r
+ if (step.Prev == DateTime.MinValue || _start == DateTime.MinValue)\r
return new Notice[0];\r
- var r = _repairStatuses.Select(repair => repair.GetNotice(_start, prev, now)).ToArray();\r
+ var r = _repairStatuses.Select(repair => repair.GetNotice(_start, step)).ToArray();\r
var m20 = TimeSpan.FromMinutes(20);\r
- if (prev - _start < m20 && now - _start >= m20)\r
+ if (step.Prev - _start < m20 && step.Now - _start >= m20)\r
r[0].Proceeded = "20分経過しました。";\r
return r;\r
}\r
\r
using System;\r
using System.Globalization;\r
+using KancolleSniffer.Util;\r
\r
namespace KancolleSniffer.Model\r
{\r
_finished = true;\r
}\r
\r
- public bool CheckAlarm(DateTime prev, DateTime now)\r
+ public bool CheckAlarm(TimeStep step)\r
{\r
- return EndTime != DateTime.MinValue && prev < EndTime - _spare && EndTime - _spare <= now;\r
+ return EndTime != DateTime.MinValue && step.Prev < EndTime - _spare && EndTime - _spare <= step.Now;\r
}\r
\r
public string ToString(DateTime now, bool endTime = false)\r
\r
using System;\r
using System.Linq;\r
+using KancolleSniffer.Util;\r
\r
namespace KancolleSniffer.Model\r
{\r
return cond >= 46 ? nextRegain : nextRegain.AddSeconds((46 - cond + 2) / 3 * Interval);\r
}\r
\r
- public int[] GetNotice(DateTime prev, DateTime now)\r
+ public int[] GetNotice(TimeStep step)\r
{\r
var result = new int[ShipInfo.FleetCount];\r
- if (prev == DateTime.MinValue)\r
+ if (step.Prev == DateTime.MinValue)\r
return result;\r
foreach (var fleet in _shipInfo.Fleets)\r
{\r
if (fleet.State != FleetState.Port)\r
continue;\r
var timer = GetTimer(fleet.Number);\r
- if (timer == DateTime.MinValue || prev < _lastUpdate)\r
+ if (timer == DateTime.MinValue || step.Prev < _lastUpdate)\r
continue;\r
- if (prev < timer.AddMinutes(-9) && now >= timer.AddMinutes(-9))\r
+ if (step.Prev < timer.AddMinutes(-9) && step.Now >= timer.AddMinutes(-9))\r
result[fleet.Number] = 40;\r
- else if (prev < timer && now >= timer)\r
+ else if (step.Prev < timer && step.Now >= timer)\r
result[fleet.Number] = 49;\r
}\r
return result;\r
using System.Threading.Tasks;\r
using KancolleSniffer.Model;\r
using KancolleSniffer.Net;\r
+using KancolleSniffer.Util;\r
using KancolleSniffer.View;\r
\r
namespace KancolleSniffer.Notification\r
\r
public UpdateContext Context { get; set; }\r
\r
- private DateTime Now => Context.GetNow();\r
-\r
- private DateTime Prev => Context.GetPrev();\r
+ private TimeStep Step => Context.GetStep();\r
\r
private NotificationConfig Notifications => Context.Config.Notifications;\r
\r
\r
private void CheckAlarm(string key, AlarmTimer timer, int fleet, string subject)\r
{\r
- if (timer.CheckAlarm(Prev, Now))\r
+ if (timer.CheckAlarm(Step))\r
{\r
SetNotification(key, fleet, subject);\r
return;\r
var pre = TimeSpan.FromSeconds(Notifications[key].PreliminaryPeriod);\r
if (pre == TimeSpan.Zero)\r
return;\r
- if (timer.CheckAlarm(Prev + pre, Now + pre))\r
+ if (timer.CheckAlarm(Step + pre))\r
SetPreNotification(key, fleet, subject);\r
}\r
\r
private void NotifyCondTimers()\r
{\r
- var notice = Context.Sniffer.GetConditionNotice(Prev, Now);\r
+ var notice = Context.Sniffer.GetConditionNotice(Step);\r
var pre = TimeSpan.FromSeconds(Notifications["疲労回復"].PreliminaryPeriod);\r
var preNotice = pre == TimeSpan.Zero\r
? new int[ShipInfo.FleetCount]\r
- : Context.Sniffer.GetConditionNotice(Prev + pre, Now + pre);\r
+ : Context.Sniffer.GetConditionNotice(Step + pre);\r
var conditions = Context.Config.NotifyConditions;\r
for (var i = 0; i < ShipInfo.FleetCount; i++)\r
{\r
private void NotifyAkashiTimer()\r
{\r
var akashi = Context.Sniffer.AkashiTimer;\r
- var msgs = akashi.GetNotice(Prev, Now);\r
+ var msgs = akashi.GetNotice(Step);\r
if (msgs.Length == 0)\r
{\r
_scheduler.StopRepeat("泊地修理");\r
return;\r
}\r
- if (!akashi.CheckRepairing(Context.GetNow()) && !(akashi.CheckPresetRepairing() && Context.Config.UsePresetAkashi))\r
+ if (!akashi.CheckRepairing(Context.GetStep().Now) && !(akashi.CheckPresetRepairing() && Context.Config.UsePresetAkashi))\r
{\r
_scheduler.StopRepeat("泊地修理");\r
return;\r
var pre = TimeSpan.FromSeconds(Notifications["泊地修理20分経過"].PreliminaryPeriod);\r
if (skipPreliminary || pre == TimeSpan.Zero)\r
return;\r
- if ((msgs = akashi.GetNotice(Prev + pre, Now + pre))[0].Proceeded == "20分経過しました。")\r
+ if ((msgs = akashi.GetNotice(Step + pre))[0].Proceeded == "20分経過しました。")\r
SetPreNotification("泊地修理20分経過", 0, msgs[0].Proceeded);\r
}\r
\r
\r
public DateTime GetConditionTimer(int fleet) => _conditionTimer.GetTimer(fleet);\r
\r
- public int[] GetConditionNotice(DateTime prev, DateTime now) => _conditionTimer.GetNotice(prev, now);\r
+ public int[] GetConditionNotice(TimeStep step) => _conditionTimer.GetNotice(step);\r
\r
public AlarmCounter ShipCounter => _shipInfo.Counter;\r
\r
--- /dev/null
+// Copyright (C) 2020 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+using System;\r
+using System.Runtime.CompilerServices;\r
+\r
+namespace KancolleSniffer.Util\r
+{\r
+ public class TimeStep\r
+ {\r
+ public DateTime Prev { get; private set; }\r
+ public DateTime Now { get; private set; }\r
+\r
+ public void SetNow()\r
+ {\r
+ Now = DateTime.Now;\r
+ }\r
+\r
+ public void SetPrev()\r
+ {\r
+ Prev = Now;\r
+ }\r
+\r
+ public static TimeStep operator +(TimeStep lhs, TimeSpan rhs)\r
+ {\r
+ return new TimeStep\r
+ {\r
+ Prev = lhs.Prev + rhs,\r
+ Now = lhs.Now + rhs\r
+ };\r
+ }\r
+ }\r
+}
\ No newline at end of file
\r
public void UpdateTimers()\r
{\r
- var now = Context.GetNow();\r
+ var now = Context.GetStep().Now;\r
foreach (var entry in _labels.Zip(Context.Sniffer.KDock,\r
(label, kdock) => new {label = label.Timer, timer = kdock}))\r
{\r
\r
public void UpdateTimers()\r
{\r
- var now = Context.GetNow();\r
+ var now = Context.GetStep().Now;\r
var showEndTime = (Context.Config.ShowEndTime & TimerKind.Mission) != 0;\r
for (var i = 0; i < Lines; i++)\r
{\r
\r
public void UpdateTimers()\r
{\r
- var now = Context.GetNow();\r
+ var now = Context.GetStep().Now;\r
var showEndTime = (Context.Config.ShowEndTime & TimerKind.NDock) != 0;\r
foreach (var entry in _labels.Zip(Context.Sniffer.NDock,\r
(label, ndock) => new {label = label.Timer, timer = ndock.Timer}))\r
_condTimer.Text = "";\r
return;\r
}\r
- var span = TimeSpan.FromSeconds(Math.Ceiling((timer - Context.GetNow()).TotalSeconds));\r
+ var span = TimeSpan.FromSeconds(Math.Ceiling((timer - Context.GetStep().Now).TotalSeconds));\r
if (span >= TimeSpan.FromMinutes(9) && Context.Config.NotifyConditions.Contains(40))\r
{\r
_condTimerCaption.Text = "cond40まで";\r
if (Context.Config.UsePresetAkashi)\r
UpdatePresetAkashiTimer();\r
_mainLabels.SetAkashiTimer(Context.Sniffer.Fleets[CurrentFleet].ActualShips,\r
- Context.Sniffer.AkashiTimer.GetTimers(CurrentFleet, Context.GetNow()));\r
+ Context.Sniffer.AkashiTimer.GetTimers(CurrentFleet, Context.GetStep().Now));\r
}\r
\r
private void UpdatePresetAkashiTimer()\r
{\r
- var now = Context.GetNow();\r
+ var now = Context.GetStep().Now;\r
var akashi = Context.Sniffer.AkashiTimer;\r
var span = akashi.GetPresetDeckTimer(now);\r
var color = span == TimeSpan.Zero && akashi.CheckPresetRepairing() ? CUDColors.Red : DefaultForeColor;\r
// limitations under the License.\r
\r
using System;\r
+using KancolleSniffer.Util;\r
\r
namespace KancolleSniffer.View\r
{\r
{\r
public Sniffer Sniffer { get; }\r
public Config Config { get; }\r
- public Func<DateTime> GetNow { get; }\r
- public Func<DateTime> GetPrev { get; }\r
+ public Func<TimeStep> GetStep { get; }\r
\r
- public UpdateContext(Sniffer sniffer, Config config, Func<DateTime> getNow, Func<DateTime> getPrev)\r
+ public UpdateContext(Sniffer sniffer, Config config, Func<TimeStep> getStep)\r
{\r
Sniffer = sniffer;\r
Config = config;\r
- GetNow = getNow;\r
- GetPrev = getPrev;\r
+ GetStep = getStep;\r
}\r
}\r
}
\ No newline at end of file