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
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
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
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
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
private void UpdateShipInfo()\r
{\r
SetCurrentFleet();\r
+ SetCombined();\r
UpdatePanelShipInfo();\r
NotifyDamagedShip();\r
UpdateChargeInfo();\r
_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
}\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
_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
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
{\r
ResetBattleInfo();\r
_listForm.UpdateBattleResult();\r
+ _listForm.UpdateAirBattleResult();\r
if (_sniffer.Battle.BattleState == BattleState.None)\r
return;\r
panelBattleInfo.BringToFront();\r
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
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
};\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
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
\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
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