OSDN Git Service

航空戦の全フェイズの結果を表示する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Tue, 20 Dec 2016 15:50:40 +0000 (00:50 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 25 Dec 2016 06:43:33 +0000 (15:43 +0900)
KancolleSniffer/AirBattleResultPanel.cs
KancolleSniffer/BattleInfo.cs
KancolleSniffer/ListForm.Designer.cs
KancolleSniffer/ListForm.cs

index da44ee4..0c1ee56 100644 (file)
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and\r
 // limitations under the License.\r
 \r
+using System;\r
+using System.Collections.Generic;\r
 using System.Drawing;\r
 using System.Windows.Forms;\r
 \r
@@ -29,55 +31,115 @@ namespace KancolleSniffer
             public int EnemyLost { get; set; }\r
         }\r
 \r
+        public string PhaseName { get; set; }\r
+        public int AirControlLevel { get; set; }\r
         public StageResult Stage1 { get; set; } = new StageResult();\r
         public StageResult Stage2 { get; set; } = new StageResult();\r
     }\r
 \r
     public class AirBattleResultPanel : Panel\r
     {\r
+        private readonly Label _phaseName;\r
+        private readonly Label _stage1;\r
         private readonly Label[][][] _resultLabels = new Label[2][][];\r
+        private List<AirBattleResult> _resultList;\r
+        private int _resultIndex;\r
+\r
+        public bool ShowResultAutomatic { get; set; }\r
+\r
+        private bool ResultRemained\r
+        {\r
+            set { _phaseName.BorderStyle = value ? BorderStyle.FixedSingle : BorderStyle.None; }\r
+        }\r
 \r
         public AirBattleResultPanel()\r
         {\r
+            const int top = 20;\r
             var labels = new[]\r
             {\r
-                new Label {Text = "航空戦", Location = new Point(4, 4), AutoSize = true},\r
-                new Label {Text = "stage1", Location = new Point(4, 18), AutoSize = true},\r
-                new Label {Text = "stage2", Location = new Point(4, 32), AutoSize = true},\r
-                new Label {Text = "自軍", Location = new Point(59, 4), AutoSize = true},\r
-                new Label {Text = "敵軍", Location = new Point(115, 4), AutoSize = true}\r
+                _phaseName =\r
+                    new Label\r
+                    {\r
+                        Text = "航空戦",\r
+                        Location = new Point(4, 4),\r
+                        Size = new Size(49, 12),\r
+                        TextAlign = ContentAlignment.TopCenter\r
+                    },\r
+                _stage1 = new Label {Text = "stage1", Location = new Point(8, top), AutoSize = true},\r
+                new Label {Text = "stage2", Location = new Point(8, top + 14), AutoSize = true},\r
+                new Label {Text = "自軍", Location = new Point(67, 6), AutoSize = true},\r
+                new Label {Text = "敵軍", Location = new Point(124, 6), AutoSize = true}\r
             };\r
             Controls.AddRange(labels);\r
+            const int left = 54;\r
             for (var stage = 0; stage < 2; stage++)\r
             {\r
                 _resultLabels[stage] = new Label[2][];\r
                 for (var fe = 0; fe < 2; fe++)\r
                 {\r
                     _resultLabels[stage][fe] = new Label[2];\r
-                        Controls.Add(_resultLabels[stage][fe][1] = new Label\r
-                        {\r
-                            Location = new Point(78 + 56 * fe, 18 + 14 * stage),\r
-                            Size = new Size(23, 12),\r
-                            TextAlign = ContentAlignment.TopLeft,\r
-                        });\r
+                    Controls.Add(_resultLabels[stage][fe][1] = new Label\r
+                    {\r
+                        Location = new Point(left + 32 + 57 * fe, top + 14 * stage),\r
+                        Size = new Size(23, 12),\r
+                        TextAlign = ContentAlignment.TopLeft\r
+                    });\r
                     Controls.Add(new Label\r
                     {\r
-                        Location = new Point(66 + 56 * fe, 18 + 14 * stage),\r
+                        Location = new Point(left + 20 + 57 * fe, top + 14 * stage),\r
                         Text = "→",\r
                         AutoSize = true\r
                     });\r
                     Controls.Add(_resultLabels[stage][fe][0] = new Label\r
                     {\r
-                        Location = new Point(46 + 56 * fe, 18 + 14 * stage),\r
+                        Location = new Point(left + 57 * fe, top + 14 * stage),\r
                         Size = new Size(23, 12),\r
-                        TextAlign = ContentAlignment.TopRight,\r
+                        TextAlign = ContentAlignment.TopRight\r
                     });\r
                 }\r
             }\r
+            _phaseName.Click += PhaseNameOnClick;\r
         }\r
 \r
-        public void SetResult(AirBattleResult result)\r
+        public void SetResult(List<AirBattleResult> resultList)\r
         {\r
+            _resultList = resultList;\r
+            if (_resultList.Count == 0)\r
+            {\r
+                ResultRemained = false;\r
+                ClearResult();\r
+                return;\r
+            }\r
+            _resultIndex = _resultList.Count - 1;\r
+            if (!ShowResultAutomatic)\r
+            {\r
+                ResultRemained = true;\r
+                ClearResult();\r
+                return;\r
+            }\r
+            ShowResult();\r
+            ResultRemained = _resultList.Count > 1;\r
+            _resultIndex = 0;\r
+        }\r
+\r
+        private void PhaseNameOnClick(object sender, EventArgs eventArgs)\r
+        {\r
+            if (_resultList == null || _resultList.Count == 0)\r
+                return;\r
+            ShowResult();\r
+            if (_resultList.Count == 1)\r
+                ResultRemained = false;\r
+            _resultIndex = (_resultIndex + 1) % _resultList.Count;\r
+        }\r
+\r
+        private void ShowResult()\r
+        {\r
+            if (_resultIndex >= _resultList.Count)\r
+                return;\r
+            var result = _resultList[_resultIndex];\r
+            _phaseName.Text = result.PhaseName;\r
+            var color = new[] {DefaultForeColor, Color.Blue, Color.Green, Color.Orange, Color.Red};\r
+            _stage1.ForeColor = color[result.AirControlLevel];\r
             var stages = new[] {result.Stage1, result.Stage2};\r
             for (var i = 0; i < 2; i++)\r
             {\r
@@ -89,5 +151,21 @@ namespace KancolleSniffer
                 labels[1][1].Text = $"{stage.EnemyCount - stage.EnemyLost}";\r
             }\r
         }\r
+\r
+        private void ClearResult()\r
+        {\r
+            _phaseName.Text = "航空戦";\r
+            _stage1.ForeColor = DefaultForeColor;\r
+            for (var st = 0; st < 2; st++)\r
+            {\r
+                for (var fe = 0; fe < 2; fe++)\r
+                {\r
+                    for (var ba = 0; ba < 2; ba++)\r
+                    {\r
+                        _resultLabels[st][fe][ba].Text = "";\r
+                    }\r
+                }\r
+            }\r
+        }\r
     }\r
 }
\ No newline at end of file
index 0180d81..053022a 100644 (file)
@@ -49,7 +49,7 @@ namespace KancolleSniffer
         public int AirControlLevel { get; private set; }\r
         public BattleResultRank ResultRank { get; private set; }\r
         public ShipStatus[] EnemyResultStatus { get; private set; }\r
-        public AirBattleResult AirBattleResults { get; private set; }\r
+        public List<AirBattleResult> AirBattleResults { get; } = new List<AirBattleResult>();\r
 \r
         public BattleInfo(ShipInfo shipInfo, ItemInfo itemInfo)\r
         {\r
@@ -228,26 +228,32 @@ namespace KancolleSniffer
 \r
         private void CalcDamage(dynamic json, bool surfaceFleet = false)\r
         {\r
-            AirBattleResults = new AirBattleResult();\r
+            AirBattleResults.Clear();\r
             var fc = _guard.Length > 0;\r
             var ec = _enemyGuardHp.Length > 0;\r
             var both = fc && ec;\r
             if (json.api_air_base_injection())\r
             {\r
-                var obj = json.api_air_base_injection;\r
-                CalcAirBaseAttackDamage(obj.IsArray() ? obj : new[] {obj});\r
+                AddAirBattleResult(json.api_air_base_injection, "AB噴式");\r
+                CalcKoukuDamage(json.api_air_base_injection);\r
+            }\r
+            if (json.api_injection_kouku())\r
+            {\r
+                AddAirBattleResult(json.api_injection_kouku, "噴式");\r
+                CalcKoukuDamage(json.api_injection_kouku);\r
             }\r
             if (json.api_air_base_attack())\r
                 CalcAirBaseAttackDamage(json.api_air_base_attack);\r
-            if (json.api_injection_kouku()) // 噴式強襲\r
-                CalcKoukuDamage(json.api_injection_kouku);\r
             if (json.api_kouku())\r
             {\r
-                SetAirBattleResult(json.api_kouku);\r
+                AddAirBattleResult(json.api_kouku, "航空戦");\r
                 CalcKoukuDamage(json.api_kouku);\r
             }\r
             if (json.api_kouku2()) // 航空戦2回目\r
+            {\r
+                AddAirBattleResult(json.api_kouku2, "航空戦2");\r
                 CalcKoukuDamage(json.api_kouku2);\r
+            }\r
             if (!json.api_opening_atack()) // 航空戦のみ\r
                 return;\r
             if (json.api_support_info() && json.api_support_info != null)\r
@@ -337,28 +343,37 @@ namespace KancolleSniffer
 \r
         private void CalcAirBaseAttackDamage(dynamic json)\r
         {\r
+            var i = 1;\r
             foreach (var entry in json)\r
+            {\r
+                AddAirBattleResult(entry, "基地" + i++);\r
                 CalcKoukuDamage(entry);\r
+            }\r
         }\r
 \r
-        private void SetAirBattleResult(dynamic json)\r
+        private void AddAirBattleResult(dynamic json, string phaseName)\r
         {\r
             if (json.api_stage1 == null || json.api_stage2 == null)\r
                 return;\r
-            AirBattleResults.Stage1 = new AirBattleResult.StageResult\r
-            {\r
-                FriendCount = (int)json.api_stage1.api_f_count,\r
-                FriendLost = (int)json.api_stage1.api_f_lostcount,\r
-                EnemyCount = (int)json.api_stage1.api_e_count,\r
-                EnemyLost = (int)json.api_stage1.api_e_lostcount\r
-            };\r
-            AirBattleResults.Stage2 = new AirBattleResult.StageResult\r
+            AirBattleResults.Add(new AirBattleResult\r
             {\r
-                FriendCount = (int)json.api_stage2.api_f_count,\r
-                FriendLost = (int)json.api_stage2.api_f_lostcount,\r
-                EnemyCount = (int)json.api_stage2.api_e_count,\r
-                EnemyLost = (int)json.api_stage2.api_e_lostcount\r
-            };\r
+                PhaseName = phaseName,\r
+                AirControlLevel = json.api_stage1.api_disp_seiku() ? (int)json.api_stage1.api_disp_seiku : 0,\r
+                Stage1 = new AirBattleResult.StageResult\r
+                {\r
+                    FriendCount = (int)json.api_stage1.api_f_count,\r
+                    FriendLost = (int)json.api_stage1.api_f_lostcount,\r
+                    EnemyCount = (int)json.api_stage1.api_e_count,\r
+                    EnemyLost = (int)json.api_stage1.api_e_lostcount\r
+                },\r
+                Stage2 = new AirBattleResult.StageResult\r
+                {\r
+                    FriendCount = (int)json.api_stage2.api_f_count,\r
+                    FriendLost = (int)json.api_stage2.api_f_lostcount,\r
+                    EnemyCount = (int)json.api_stage2.api_e_count,\r
+                    EnemyLost = (int)json.api_stage2.api_e_lostcount\r
+                }\r
+            });\r
         }\r
 \r
         private void CalcKoukuDamage(dynamic json)\r
index 7bf0707..6aede76 100644 (file)
@@ -401,6 +401,7 @@ namespace KancolleSniffer
             this.airBattleResultPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r
             this.airBattleResultPanel.Location = new System.Drawing.Point(6, 23);\r
             this.airBattleResultPanel.Name = "airBattleResultPanel";\r
+            this.airBattleResultPanel.ShowResultAutomatic = false;\r
             this.airBattleResultPanel.Size = new System.Drawing.Size(238, 51);\r
             this.airBattleResultPanel.TabIndex = 18;\r
             // \r
index 1293d0f..7ae7b70 100644 (file)
@@ -84,6 +84,7 @@ namespace KancolleSniffer
 \r
         public void UpdateAirBattleResult()\r
         {\r
+            airBattleResultPanel.ShowResultAutomatic = _config.AlwaysShowResultRank;\r
             airBattleResultPanel.SetResult(_sniffer.Battle.AirBattleResults);\r
         }\r
 \r