OSDN Git Service

タイマーの実装を変更する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 16 Dec 2017 09:42:51 +0000 (18:42 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 27 Jan 2018 08:33:54 +0000 (17:33 +0900)
KancolleSniffer/AkashiTimer.cs
KancolleSniffer/ConditionTimer.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/ShipLabels.cs
KancolleSniffer/Sniffer.cs

index 584fce1..d02ca53 100644 (file)
@@ -25,7 +25,6 @@ namespace KancolleSniffer
         private readonly PresetDeck _presetDeck;\r
         private readonly RepairStatus[] _repairStatuses = new RepairStatus[ShipInfo.FleetCount];\r
         private DateTime _start;\r
-        private DateTime _prev;\r
 \r
         public class RepairSpan\r
         {\r
@@ -244,11 +243,8 @@ namespace KancolleSniffer
             => _presetDeck.Decks.Where(deck => deck != null)\r
                 .Any(deck => RepairTarget(deck).Any(s => s.NowHp < s.MaxHp));\r
 \r
-        public Notice[] GetNotice()\r
+        public Notice[] GetNotice(DateTime prev, DateTime now)\r
         {\r
-            var now = DateTime.Now;\r
-            var prev = _prev;\r
-            _prev = now;\r
             if (prev == DateTime.MinValue || _start == DateTime.MinValue)\r
                 return new Notice[0];\r
             var r = _repairStatuses.Select(repair => repair.GetNotice(_start, prev, now)).ToArray();\r
index 215e632..6b12551 100644 (file)
@@ -24,7 +24,6 @@ namespace KancolleSniffer
         private int _lastCond = int.MinValue;\r
         private DateTime _lastUpdate;\r
         private double _regenTime;\r
-        private DateTime _prevNotice;\r
 \r
         public bool NeedSave { get; private set; }\r
 \r
@@ -90,12 +89,9 @@ namespace KancolleSniffer
             return cond >= 46 ? nextRegen : nextRegen.AddSeconds((46 - cond + 2) / 3 * Interval);\r
         }\r
 \r
-        public int[] GetNotice()\r
+        public int[] GetNotice(DateTime prev, DateTime now)\r
         {\r
             var result = new int[ShipInfo.FleetCount];\r
-            var now = DateTime.Now;\r
-            var prev = _prevNotice;\r
-            _prevNotice = now;\r
             if (prev == DateTime.MinValue)\r
                 return result;\r
             for (var f = 0; f < result.Length; f++)\r
index 25b5de2..869df77 100644 (file)
@@ -576,35 +576,6 @@ namespace KancolleSniffer
                 _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
@@ -725,50 +696,44 @@ namespace KancolleSniffer
             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
@@ -784,14 +749,13 @@ namespace KancolleSniffer
             {\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
@@ -804,7 +768,7 @@ namespace KancolleSniffer
                 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
@@ -857,6 +821,35 @@ namespace KancolleSniffer
             }\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
index c16c343..5d510e5 100644 (file)
@@ -347,11 +347,11 @@ namespace KancolleSniffer
                 _ndockLabels[i][1].SetName(ndock[i].Name, ShipNameWidth.NDock);\r
         }\r
 \r
-        public void SetNDockTimer(int dock, RingTimer timer, bool finishTime)\r
+        public void SetNDockTimer(int dock, RingTimer timer, DateTime now, bool finishTime)\r
         {\r
             var label = _ndockLabels[dock][0];\r
-            label.ForeColor = timer.IsFinished ? CUDColor.Red : Color.Black;\r
-            label.Text = timer.ToString(finishTime);\r
+            label.ForeColor = timer.IsFinished(now) ? CUDColor.Red : Color.Black;\r
+            label.Text = timer.ToString(now, finishTime);\r
         }\r
     }\r
 \r
index 795fc27..cc41743 100644 (file)
@@ -532,7 +532,7 @@ namespace KancolleSniffer
 \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
@@ -639,14 +639,10 @@ namespace KancolleSniffer
         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
@@ -670,30 +666,20 @@ namespace KancolleSniffer
             _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