OSDN Git Service

基地空襲戦の制空値がメインウィンドウに表示されないのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / View / NumberAndHistory.cs
1 // Copyright (C) 2019 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 //\r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System.Drawing;\r
16 using System.Windows.Forms;\r
17 using KancolleSniffer.Model;\r
18 \r
19 namespace KancolleSniffer.View\r
20 {\r
21     public class NumberAndHistoryLabels\r
22     {\r
23         public Label NumOfShips { get; set; }\r
24         public Label NumOfEquips { get; set; }\r
25         public Label NumOfBuckets { get; set; }\r
26         public Label BucketHistory { get; set; }\r
27         public Label Achievement { get; set; }\r
28         public Label FuelHistory { get; set; }\r
29         public Label BulletHistory { get; set; }\r
30         public Label SteelHistory { get; set; }\r
31         public Label BauxiteHistory { get; set; }\r
32         public ToolTip ToolTip { get; set; }\r
33     }\r
34 \r
35     public interface INotifySubmitter\r
36     {\r
37         void Flash();\r
38         void Enqueue(string key, string subject);\r
39     }\r
40 \r
41     public class NumberAndHistory\r
42     {\r
43         private readonly NumberAndHistoryLabels _labels;\r
44         private readonly Sniffer _sniffer;\r
45         private readonly ToolTip _toolTip;\r
46         private readonly INotifySubmitter _submitter;\r
47 \r
48         public NumberAndHistory(NumberAndHistoryLabels labels, Sniffer sniffer, INotifySubmitter submitter)\r
49         {\r
50             _labels = labels;\r
51             _sniffer = sniffer;\r
52             _toolTip = labels.ToolTip;\r
53             _submitter = submitter;\r
54         }\r
55 \r
56         public void Update()\r
57         {\r
58             UpdateNumOfShips();\r
59             UpdateNumOfEquips();\r
60             _submitter.Flash();\r
61             UpdateNumOfBuckets();\r
62             UpdateBucketHistory();\r
63             UpdateAchievement();\r
64             UpdateMaterialHistory();\r
65         }\r
66 \r
67         private void UpdateNumOfBuckets()\r
68         {\r
69             _labels.NumOfBuckets.Text = _sniffer.Material.MaterialHistory[(int)Material.Bucket].Now.ToString("D");\r
70         }\r
71 \r
72         private void UpdateAchievement()\r
73         {\r
74             var ac = _sniffer.Achievement.Value;\r
75             if (ac >= 10000)\r
76                 ac = 9999;\r
77             _labels.Achievement.Text = ac >= 1000 ? ((int)ac).ToString("D") : ac.ToString("F1");\r
78             _toolTip.SetToolTip(_labels.Achievement,\r
79                 "今月 " + _sniffer.Achievement.ValueOfMonth.ToString("F1") + "\n" +\r
80                 "EO " + _sniffer.ExMap.Achievement);\r
81         }\r
82 \r
83         public void UpdateNumOfShips()\r
84         {\r
85             var ship = _sniffer.ShipCounter;\r
86             _labels.NumOfShips.Text = $"{ship.Now:D}/{ship.Max:D}";\r
87             _labels.NumOfShips.ForeColor = ship.TooMany ? CUDColors.Red : Color.Black;\r
88             if (ship.Alarm)\r
89             {\r
90                 var message = $"残り{ship.Rest:D}隻";\r
91                 _submitter.Enqueue("艦娘数超過", message);\r
92                 ship.Alarm = false;\r
93             }\r
94         }\r
95 \r
96         public void UpdateNumOfEquips()\r
97         {\r
98             var item = _sniffer.ItemCounter;\r
99             _labels.NumOfEquips.Text = $"{item.Now:D}/{item.Max:D}";\r
100             _labels.NumOfEquips.ForeColor = item.TooMany ? CUDColors.Red : Color.Black;\r
101             if (item.Alarm)\r
102             {\r
103                 var message = $"残り{item.Rest:D}個";\r
104                 _submitter.Enqueue("装備数超過", message);\r
105                 item.Alarm = false;\r
106             }\r
107         }\r
108 \r
109         private void UpdateBucketHistory()\r
110         {\r
111             var count = _sniffer.Material.MaterialHistory[(int)Material.Bucket];\r
112             var day = CutOverflow(count.Now - count.BegOfDay, 999);\r
113             var week = CutOverflow(count.Now - count.BegOfWeek, 999);\r
114             _labels.BucketHistory.Text = $"{day:+#;-#;±0} 今日\n{week:+#;-#;±0} 今週";\r
115         }\r
116 \r
117         private void UpdateMaterialHistory()\r
118         {\r
119             var labels = new[] {_labels.FuelHistory, _labels.BulletHistory, _labels.SteelHistory, _labels.BauxiteHistory };\r
120             var text = new[] { "燃料", "弾薬", "鋼材", "ボーキ" };\r
121             for (var i = 0; i < labels.Length; i++)\r
122             {\r
123                 var count = _sniffer.Material.MaterialHistory[i];\r
124                 var port = CutOverflow(count.Now - _sniffer.Material.PrevPort[i], 99999);\r
125                 var day = CutOverflow(count.Now - count.BegOfDay, 99999);\r
126                 var week = CutOverflow(count.Now - count.BegOfWeek, 99999);\r
127                 labels[i].Text = $"{text[i]}\n{port:+#;-#;±0}\n{day:+#;-#;±0}\n{week:+#;-#;±0}";\r
128             }\r
129         }\r
130 \r
131         private int CutOverflow(int value, int limit)\r
132         {\r
133             if (value > limit)\r
134                 return limit;\r
135             if (value < -limit)\r
136                 return -limit;\r
137             return value;\r
138         }\r
139     }\r
140 }