OSDN Git Service

タイマーの時刻を保持するTimeStepクラスを導入する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 25 Apr 2020 12:05:38 +0000 (21:05 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 30 Aug 2020 05:58:21 +0000 (14:58 +0900)
13 files changed:
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/MainForm.cs
KancolleSniffer/Model/AkashiTimer.cs
KancolleSniffer/Model/AlarmTimer.cs
KancolleSniffer/Model/ConditionTimer.cs
KancolleSniffer/Notification/Notifier.cs
KancolleSniffer/Sniffer.cs
KancolleSniffer/Util/TimeStep.cs [new file with mode: 0644]
KancolleSniffer/View/KDockPanel.cs
KancolleSniffer/View/MissionPanel.cs
KancolleSniffer/View/NDockPanel.cs
KancolleSniffer/View/ShipInfoPanel.cs
KancolleSniffer/View/UpdateContext.cs

index 1ccdde2..0d3ac7d 100644 (file)
@@ -85,6 +85,7 @@
     <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
index d4c4ba9..e610650 100644 (file)
@@ -53,7 +53,7 @@ namespace KancolleSniffer
         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
@@ -101,7 +101,7 @@ namespace KancolleSniffer
                 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
@@ -255,8 +255,8 @@ namespace KancolleSniffer
             }\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
@@ -515,10 +515,10 @@ namespace KancolleSniffer
             {\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
index 9a3d6ac..1e540ba 100644 (file)
@@ -46,8 +46,8 @@ namespace KancolleSniffer.Model
             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
@@ -93,7 +93,7 @@ namespace KancolleSniffer.Model
                 }).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
@@ -104,7 +104,7 @@ namespace KancolleSniffer.Model
                         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
@@ -115,11 +115,11 @@ namespace KancolleSniffer.Model
                         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
@@ -243,13 +243,13 @@ namespace KancolleSniffer.Model
             => _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
index 7390f05..6076652 100644 (file)
@@ -14,6 +14,7 @@
 \r
 using System;\r
 using System.Globalization;\r
+using KancolleSniffer.Util;\r
 \r
 namespace KancolleSniffer.Model\r
 {\r
@@ -60,9 +61,9 @@ namespace KancolleSniffer.Model
             _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
index 2f87ed2..b133eea 100644 (file)
@@ -14,6 +14,7 @@
 \r
 using System;\r
 using System.Linq;\r
+using KancolleSniffer.Util;\r
 \r
 namespace KancolleSniffer.Model\r
 {\r
@@ -95,21 +96,21 @@ namespace KancolleSniffer.Model
             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
index af717d8..7c4ad24 100644 (file)
@@ -18,6 +18,7 @@ using System.Linq;
 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
@@ -36,9 +37,7 @@ namespace KancolleSniffer.Notification
 \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
@@ -128,7 +127,7 @@ namespace KancolleSniffer.Notification
 \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
@@ -136,17 +135,17 @@ namespace KancolleSniffer.Notification
             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
@@ -164,13 +163,13 @@ namespace KancolleSniffer.Notification
         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
@@ -193,7 +192,7 @@ namespace KancolleSniffer.Notification
             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
index 22f3cd1..f719d6b 100644 (file)
@@ -637,7 +637,7 @@ namespace KancolleSniffer
 \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
diff --git a/KancolleSniffer/Util/TimeStep.cs b/KancolleSniffer/Util/TimeStep.cs
new file mode 100644 (file)
index 0000000..de5b48a
--- /dev/null
@@ -0,0 +1,44 @@
+// 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
index 8841315..9f12311 100644 (file)
@@ -63,7 +63,7 @@ namespace KancolleSniffer.View
 \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
index 2c8815c..75ed3ec 100644 (file)
@@ -126,7 +126,7 @@ namespace KancolleSniffer.View
 \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
index 0c35fcd..f7a78cf 100644 (file)
@@ -108,7 +108,7 @@ namespace KancolleSniffer.View
 \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
index 8bad2ad..0bf185a 100644 (file)
@@ -362,7 +362,7 @@ namespace KancolleSniffer.View
                 _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
@@ -390,12 +390,12 @@ namespace KancolleSniffer.View
             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
index cc443e2..322a78c 100644 (file)
@@ -13,6 +13,7 @@
 // limitations under the License.\r
 \r
 using System;\r
+using KancolleSniffer.Util;\r
 \r
 namespace KancolleSniffer.View\r
 {\r
@@ -20,15 +21,13 @@ namespace KancolleSniffer.View
     {\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