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.Model;\r
using KancolleSniffer.Net;\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 Resume() => _manager.ResumeRepeat();\r
}\r
\r
- public class ConfigFileException : Exception\r
- {\r
- public ConfigFileException(string message, Exception innerException) : base(message, innerException)\r
- {\r
- }\r
- }\r
-\r
private void HttpProxy_AfterSessionComplete(HttpProxy.Session session)\r
{\r
BeginInvoke(new Action<HttpProxy.Session>(ProcessRequest), session);\r
WriteDebugLog(url, request, response);\r
return;\r
}\r
- response = UnescapeString(response.Remove(0, "svdata=".Length));\r
+ response = UnEscapeString(response.Remove(0, "svdata=".Length));\r
WriteDebugLog(url, request, response);\r
ProcessRequestMain(url, request, response);\r
}\r
}\r
}\r
\r
- private string UnescapeString(string s)\r
+ private string UnEscapeString(string s)\r
{\r
try\r
{\r
public void ApplyLogSetting()\r
{\r
LogServer.OutputDir = _config.Log.OutputDir;\r
- LogServer.MaterialHistory = _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
_toolTip.SetToolTip(labelAchievement,\r
"今月 " + _sniffer.Achievement.ValueOfMonth.ToString("F1") + "\n" +\r
"EO " + _sniffer.ExMap.Achievement);\r
- UpdateMaterialHistry();\r
+ UpdateMaterialHistory();\r
if (_listForm.Visible)\r
_listForm.UpdateList();\r
}\r
{\r
var ship = _sniffer.ShipCounter;\r
labelNumOfShips.Text = $"{ship.Now:D}/{ship.Max:D}";\r
- labelNumOfShips.ForeColor = ship.TooMany ? CUDColor.Red : Color.Black;\r
+ labelNumOfShips.ForeColor = ship.TooMany ? CUDColors.Red : Color.Black;\r
if (ship.Alarm)\r
{\r
var message = $"残り{ship.Rest:D}隻";\r
{\r
var item = _sniffer.ItemCounter;\r
labelNumOfEquips.Text = $"{item.Now:D}/{item.Max:D}";\r
- labelNumOfEquips.ForeColor = item.TooMany ? CUDColor.Red : Color.Black;\r
+ labelNumOfEquips.ForeColor = item.TooMany ? CUDColors.Red : Color.Black;\r
if (item.Alarm)\r
{\r
var message = $"残り{item.Rest:D}個";\r
labelBucketHistory.Text = $"{day:+#;-#;±0} 今日\n{week:+#;-#;±0} 今週";\r
}\r
\r
- private void UpdateMaterialHistry()\r
+ private void UpdateMaterialHistory()\r
{\r
var labels = new[] {labelFuelHistory, labelBulletHistory, labelSteelHistory, labelBouxiteHistory};\r
var text = new[] {"燃料", "弾薬", "鋼材", "ボーキ"};\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
}\r
UpdateFighterPower(_sniffer.IsCombinedFleet && battle.EnemyIsCombined);\r
labelFighterPower.ForeColor = new[]\r
- {DefaultForeColor, DefaultForeColor, CUDColor.Blue, CUDColor.Green, CUDColor.Orange, CUDColor.Red}[\r
+ {DefaultForeColor, DefaultForeColor, CUDColors.Blue, CUDColors.Green, CUDColors.Orange, CUDColors.Red}[\r
battle.AirControlLevel + 1];\r
}\r
\r
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
}\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
private void labelMission_Click(object sender, EventArgs e)\r
{\r
_config.ShowEndTime ^= TimerKind.Mission;\r
+ SetMissionLabel();\r
UpdateTimers();\r
}\r
\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
private void SetTimerColor(Label label, AlarmTimer timer, DateTime now)\r
{\r
- label.ForeColor = timer.IsFinished(now) ? CUDColor.Red : Color.Black;\r
+ label.ForeColor = timer.IsFinished(now) ? CUDColors.Red : Color.Black;\r
}\r
\r
private void UpdateCondTimers()\r
{\r
labelCondTimerTitle.Text = "cond49まで";\r
labelCondTimer.Text = (span >= TimeSpan.Zero ? span : TimeSpan.Zero).ToString(@"mm\:ss");\r
- labelCondTimer.ForeColor = span <= TimeSpan.Zero ? CUDColor.Red : DefaultForeColor;\r
+ labelCondTimer.ForeColor = span <= TimeSpan.Zero ? CUDColors.Red : DefaultForeColor;\r
}\r
}\r
\r
{\r
var akashi = _sniffer.AkashiTimer;\r
var span = akashi.GetPresetDeckTimer(_now);\r
- var color = span == TimeSpan.Zero && akashi.CheckPresetRepairing() ? CUDColor.Red : DefaultForeColor;\r
+ var color = span == TimeSpan.Zero && akashi.CheckPresetRepairing() ? CUDColors.Red : DefaultForeColor;\r
var text = span == TimeSpan.MinValue ? "" : span.ToString(@"mm\:ss");\r
labelAkashiRepairTimer.ForeColor = color;\r
labelAkashiRepairTimer.Text = text;\r
continue;\r
}\r
count[i].Text = " " + c;\r
- count[i].ForeColor = c.Cleared ? CUDColor.Green : Color.Black;\r
+ count[i].ForeColor = c.Cleared ? CUDColors.Green : Color.Black;\r
_toolTip.SetToolTip(count[i], c.ToToolTip());\r
}\r
else\r
\r
[DllImport("winmm.dll")]\r
private static extern int mciSendString(String command,\r
- StringBuilder buffer, int bufferSize, IntPtr hwndCallback);\r
+ StringBuilder buffer, int bufferSize, IntPtr hWndCallback);\r
\r
// ReSharper disable InconsistentNaming\r
+ // ReSharper disable once IdentifierTypo\r
private const int MM_MCINOTIFY = 0x3B9;\r
\r
private const int MCI_NOTIFY_SUCCESSFUL = 1;\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
});\r
}\r
\r
- private readonly Color _activeButtonColor = Color.FromArgb(152, 179, 208);\r
-\r
private void labelBucketHistoryButton_Click(object sender, EventArgs e)\r
{\r
if (labelBucketHistory.Visible)\r
{\r
labelBucketHistory.Visible = true;\r
labelBucketHistory.BringToFront();\r
- labelBucketHistoryButton.BackColor = _activeButtonColor;\r
+ labelBucketHistoryButton.BackColor = CustomColors.ActiveButtonColor;\r
}\r
}\r
\r
{\r
panelMaterialHistory.Visible = true;\r
panelMaterialHistory.BringToFront();\r
- labelMaterialHistoryButton.BackColor = _activeButtonColor;\r
+ labelMaterialHistoryButton.BackColor = CustomColors.ActiveButtonColor;\r
}\r
}\r
\r
labelMaterialHistoryButton.BackColor = DefaultBackColor;\r
}\r
\r
- public void ResetAchievemnt()\r
+ public void ResetAchievement()\r
{\r
_sniffer.Achievement.Reset();\r
UpdateItemInfo();\r
{\r
panelRepairList.Visible = true;\r
panelRepairList.BringToFront();\r
- labelRepairListButton.BackColor = _activeButtonColor;\r
+ labelRepairListButton.BackColor = CustomColors.ActiveButtonColor;\r
}\r
}\r
\r
\r
private void labelClearQuest_MouseDown(object sender, MouseEventArgs e)\r
{\r
- labelClearQuest.BackColor = _activeButtonColor;\r
+ labelClearQuest.BackColor = CustomColors.ActiveButtonColor;\r
}\r
\r
private void labelClearQuest_MouseUp(object sender, MouseEventArgs e)\r