OSDN Git Service

タイマーと終了時刻の切り替えをわかりやすくする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / MainForm.cs
index b50e133..be88edc 100644 (file)
@@ -24,6 +24,7 @@ using System.Net;
 using System.Runtime.InteropServices;\r
 using System.Text;\r
 using System.Text.RegularExpressions;\r
+using System.Threading;\r
 using System.Threading.Tasks;\r
 using System.Windows.Forms;\r
 using KancolleSniffer.Log;\r
@@ -32,6 +33,7 @@ using KancolleSniffer.Net;
 using KancolleSniffer.Util;\r
 using KancolleSniffer.View;\r
 using Microsoft.CSharp.RuntimeBinder;\r
+using Timer = System.Windows.Forms.Timer;\r
 using static System.Math;\r
 \r
 namespace KancolleSniffer\r
@@ -56,7 +58,6 @@ namespace KancolleSniffer
         private string _debugLogFile;\r
         private IEnumerator<string> _playLog;\r
         private DateTime _prev, _now;\r
-        private bool _inSortie;\r
 \r
         private readonly ErrorDialog _errorDialog = new ErrorDialog();\r
         private readonly ErrorLog _errorLog;\r
@@ -450,7 +451,7 @@ namespace KancolleSniffer
         public void ApplyLogSetting()\r
         {\r
             LogServer.OutputDir = _config.Log.OutputDir;\r
-            LogServer.LogProcessor = new LogProcessor(_sniffer.Material.MaterialHistory);\r
+            LogServer.LogProcessor = new LogProcessor(_sniffer.Material.MaterialHistory, _sniffer.MapDictionary);\r
             _sniffer.EnableLog(_config.Log.On ? LogType.All : LogType.None);\r
             _sniffer.MaterialLogInterval = _config.Log.MaterialLogInterval;\r
             _sniffer.LogOutputDir = _config.Log.OutputDir;\r
@@ -518,10 +519,11 @@ namespace KancolleSniffer
             if (!_listForm.Visible)\r
                 return;\r
             var idx = (int)((Control)sender).Tag;\r
-            var ships = _sniffer.Fleets[_currentFleet].ActualShips;\r
-            if (ships.Count <= idx)\r
-                return;\r
-            _listForm.ShowShip(ships[idx].Id);\r
+            var ship = (_combinedFleet\r
+                ? _sniffer.Fleets[0].Ships.Concat(_sniffer.Fleets[1].Ships).ToArray()\r
+                : _sniffer.Fleets[_currentFleet].Ships)[idx];\r
+            if (!ship.Empty)\r
+                _listForm.ShowShip(ship.Id);\r
         }\r
 \r
         private void UpdateItemInfo()\r
@@ -603,6 +605,7 @@ namespace KancolleSniffer
         private void UpdateShipInfo()\r
         {\r
             SetCurrentFleet();\r
+            SetCombined();\r
             UpdatePanelShipInfo();\r
             NotifyDamagedShip();\r
             UpdateChargeInfo();\r
@@ -612,6 +615,8 @@ namespace KancolleSniffer
                 _listForm.UpdateList();\r
         }\r
 \r
+        private bool _inSortie;\r
+\r
         private void SetCurrentFleet()\r
         {\r
             var states = _sniffer.Fleets.Select(fleet => fleet.State).ToArray();\r
@@ -634,6 +639,18 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
+        private bool _prevCombined;\r
+\r
+        private void SetCombined()\r
+        {\r
+            if (_sniffer.IsCombinedFleet && !_prevCombined)\r
+            {\r
+                _combinedFleet = true;\r
+                _currentFleet = 0;\r
+            }\r
+            _prevCombined = _sniffer.IsCombinedFleet;\r
+        }\r
+\r
         private void UpdatePanelShipInfo()\r
         {\r
             var fleets = _sniffer.Fleets;\r
@@ -642,7 +659,7 @@ namespace KancolleSniffer
             _mainLabels.SetShipLabels(ships);\r
             if (!_sniffer.IsCombinedFleet)\r
                 _combinedFleet = false;\r
-            labelFleet1.Text = _combinedFleet ? "連合" : "第一";\r
+            labelFleet1.Text = _combinedFleet ? CombinedName : "第一";\r
             panelCombinedFleet.Visible = _combinedFleet;\r
             if (_combinedFleet)\r
                 _mainLabels.SetCombinedShipLabels(fleets[0].ActualShips, fleets[1].ActualShips);\r
@@ -655,6 +672,24 @@ namespace KancolleSniffer
             UpdateCondTimers();\r
         }\r
 \r
+        private string CombinedName\r
+        {\r
+            get\r
+            {\r
+                switch (_sniffer.Fleets[0].CombinedType)\r
+                {\r
+                    case CombinedType.Carrier:\r
+                        return "機動";\r
+                    case CombinedType.Surface:\r
+                        return "水上";\r
+                    case CombinedType.Transport:\r
+                        return "輸送";\r
+                    default:\r
+                        return "連合";\r
+                }\r
+            }\r
+        }\r
+\r
         private void NotifyDamagedShip()\r
         {\r
             if (!_sniffer.BadlyDamagedShips.Any())\r
@@ -699,6 +734,7 @@ namespace KancolleSniffer
         {\r
             ResetBattleInfo();\r
             _listForm.UpdateBattleResult();\r
+            _listForm.UpdateAirBattleResult();\r
             if (_sniffer.Battle.BattleState == BattleState.None)\r
                 return;\r
             panelBattleInfo.BringToFront();\r
@@ -707,8 +743,6 @@ namespace KancolleSniffer
             UpdateBattleFighterPower();\r
             if ((_config.Spoilers & Spoiler.ResultRank) != 0)\r
                 ShowResultRank();\r
-            if (_sniffer.Battle.BattleState == BattleState.Day)\r
-                _listForm.UpdateAirBattleResult();\r
         }\r
 \r
         private void UpdateCellInfo()\r
@@ -774,12 +808,18 @@ namespace KancolleSniffer
         private void UpdateNDocLabels()\r
         {\r
             _mainLabels.SetNDockLabels(_sniffer.NDock);\r
+            SetNDockLabel();\r
         }\r
 \r
+        private void SetNDockLabel()\r
+        {\r
+            labelNDock.Text = (_config.ShowEndTime & TimerKind.NDock) != 0 ? "入渠終了" : "入渠";\r
+        }\r
 \r
         private void labelNDock_Click(object sender, EventArgs e)\r
         {\r
             _config.ShowEndTime ^= TimerKind.NDock;\r
+            SetNDockLabel();\r
             UpdateTimers();\r
         }\r
 \r
@@ -798,6 +838,12 @@ namespace KancolleSniffer
                 }\r
                 nameLabels[i].Text = names[i];\r
             }\r
+            SetMissionLabel();\r
+        }\r
+\r
+        private void SetMissionLabel()\r
+        {\r
+            labelMission.Text = (_config.ShowEndTime & TimerKind.Mission) != 0 ? "遠征終了" : "遠征";\r
         }\r
 \r
         private string GenerateFleetParamsForMission(int fleetNumber)\r
@@ -820,6 +866,7 @@ namespace KancolleSniffer
         private void labelMission_Click(object sender, EventArgs e)\r
         {\r
             _config.ShowEndTime ^= TimerKind.Mission;\r
+            SetMissionLabel();\r
             UpdateTimers();\r
         }\r
 \r
@@ -854,6 +901,8 @@ namespace KancolleSniffer
             for (var i = 0; i < _sniffer.Missions.Length; i++)\r
             {\r
                 var entry = _sniffer.Missions[i];\r
+                if (entry.Name == "前衛支援任務" || entry.Name == "艦隊決戦支援任務")\r
+                    continue;\r
                 CheckAlarm("遠征終了", entry.Timer, i + 1, entry.Name);\r
             }\r
             for (var i = 0; i < _sniffer.NDock.Length; i++)\r
@@ -1144,7 +1193,10 @@ namespace KancolleSniffer
             };\r
             foreach (var a in labels)\r
             {\r
-                for (var fleet = 0; fleet < labels[0].Length; fleet++)\r
+                a[0].Tag = 0;\r
+                a[0].Click += labelFleet1_Click;\r
+                a[0].DoubleClick += labelFleet1_DoubleClick;\r
+                for (var fleet = 1; fleet < labels[0].Length; fleet++)\r
                 {\r
                     a[fleet].Tag = fleet;\r
                     a[fleet].Click += labelFleet_Click;\r
@@ -1159,18 +1211,39 @@ namespace KancolleSniffer
                 return;\r
             var fleet = (int)((Label)sender).Tag;\r
             if (_currentFleet == fleet)\r
-            {\r
-                if (fleet > 0)\r
-                    return;\r
-                _combinedFleet = _sniffer.IsCombinedFleet && !_combinedFleet;\r
-                UpdatePanelShipInfo();\r
                 return;\r
-            }\r
             _combinedFleet = false;\r
             _currentFleet = fleet;\r
             UpdatePanelShipInfo();\r
         }\r
 \r
+        private readonly SemaphoreSlim _clickSemaphore = new SemaphoreSlim(1);\r
+        private readonly SemaphoreSlim _doubleClickSemaphore = new SemaphoreSlim(0);\r
+\r
+        private async void labelFleet1_Click(object sender, EventArgs e)\r
+        {\r
+            if (!_started)\r
+                return;\r
+            if (_currentFleet != 0)\r
+            {\r
+                labelFleet_Click(sender, e);\r
+                return;\r
+            }\r
+            if (!_clickSemaphore.Wait(0))\r
+                return;\r
+            try\r
+            {\r
+                if (await _doubleClickSemaphore.WaitAsync(SystemInformation.DoubleClickTime))\r
+                    return;\r
+            }\r
+            finally\r
+            {\r
+                _clickSemaphore.Release();\r
+            }\r
+            _combinedFleet = _sniffer.IsCombinedFleet && !_combinedFleet;\r
+            UpdatePanelShipInfo();\r
+        }\r
+\r
         private void labelFleet1_MouseHover(object sender, EventArgs e)\r
         {\r
             labelFleet1.Text = _currentFleet == 0 && _sniffer.IsCombinedFleet && !_combinedFleet ? "連合" : "第一";\r
@@ -1178,7 +1251,7 @@ namespace KancolleSniffer
 \r
         private void labelFleet1_MouseLeave(object sender, EventArgs e)\r
         {\r
-            labelFleet1.Text = _combinedFleet ? "連合" : "第一";\r
+            labelFleet1.Text = _combinedFleet ? CombinedName : "第一";\r
         }\r
 \r
         private void labelFleet_DoubleClick(object sender, EventArgs e)\r
@@ -1187,11 +1260,27 @@ namespace KancolleSniffer
                 return;\r
             var fleet = (int)((Label)sender).Tag;\r
             var text = TextGenerator.GenerateFleetData(_sniffer, fleet);\r
+            CopyFleetText(text, (Label)sender);\r
+        }\r
+\r
+        private void labelFleet1_DoubleClick(object sender, EventArgs e)\r
+        {\r
+            if (!_started)\r
+                return;\r
+            _doubleClickSemaphore.Release();\r
+            var text = TextGenerator.GenerateFleetData(_sniffer, 0);\r
+            if (_combinedFleet)\r
+                text += TextGenerator.GenerateFleetData(_sniffer, 1);\r
+            CopyFleetText(text, (Label)sender);\r
+        }\r
+\r
+        private void CopyFleetText(string text, Label fleetButton)\r
+        {\r
             if (string.IsNullOrEmpty(text))\r
                 return;\r
             Clipboard.SetText(text);\r
             _tooltipCopy.Active = true;\r
-            _tooltipCopy.Show("コピーしました。", (Label)sender);\r
+            _tooltipCopy.Show("コピーしました。", fleetButton);\r
             Task.Run(async () =>\r
             {\r
                 await Task.Delay(1000);\r