OSDN Git Service

戦況パネルの情報量を増やす
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Tue, 9 Jan 2018 09:06:09 +0000 (18:06 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 27 Jan 2018 08:34:00 +0000 (17:34 +0900)
KancolleSniffer/BattleInfo.cs
KancolleSniffer/BattleResultPanel.cs
KancolleSniffer/MainForm.cs

index 8cd90f2..e23c7bd 100644 (file)
@@ -60,7 +60,8 @@ namespace KancolleSniffer
         private bool _lastCell;\r
 \r
         public BattleState BattleState { get; set; }\r
-        public string Formation { get; private set; }\r
+        public int[] Formation { get; private set; }\r
+        public int[] FighterPower { get; private set; }\r
         public EnemyFighterPower EnemyFighterPower { get; private set; }\r
         public int AirControlLevel { get; private set; }\r
         public BattleResultRank ResultRank { get; private set; }\r
@@ -96,10 +97,12 @@ namespace KancolleSniffer
 \r
         public void InspectBattle(string url, string request, dynamic json)\r
         {\r
-            Formation = FormationName(json);\r
+            if (json.api_formation())\r
+                Formation = ((dynamic[])json.api_formation).Select(f => f is string ? (int)int.Parse(f) : (int)f).ToArray();\r
             AirControlLevel = CheckAirControlLevel(json);\r
             ShowResult(false); // 昼戦の結果を夜戦のときに表示する\r
             SetupResult(request, json);\r
+            FighterPower = CalcFighterPower();\r
             EnemyFighterPower = CalcEnemyFighterPower(json);\r
             BattleState = IsNightBattle(json) ? BattleState.Night : BattleState.Day;\r
             CalcDamage(json);\r
@@ -118,24 +121,6 @@ namespace KancolleSniffer
             return (int)json.api_deck_id - 1;\r
         }\r
 \r
-        private string FormationName(dynamic json)\r
-        {\r
-            if (!json.api_formation()) // 演習の夜戦\r
-                return "";\r
-            switch ((int)json.api_formation[2])\r
-            {\r
-                case 1:\r
-                    return "同航戦";\r
-                case 2:\r
-                    return "反航戦";\r
-                case 3:\r
-                    return "T字有利";\r
-                case 4:\r
-                    return "T字不利";\r
-            }\r
-            return "";\r
-        }\r
-\r
         private void SetupResult(string request, dynamic json)\r
         {\r
             if (_friend != null)\r
@@ -229,6 +214,13 @@ namespace KancolleSniffer
             return (int)stage1.api_disp_seiku;\r
         }\r
 \r
+        private int[] CalcFighterPower()\r
+        {\r
+            if (_guard.Length > 0 && _enemyGuard.Length > 0)\r
+                return _shipInfo.GetFighterPower(0).Zip(_shipInfo.GetFighterPower(1), (a, b) => a + b).ToArray();\r
+            return _shipInfo.GetFighterPower(_fleet);\r
+        }\r
+\r
         private EnemyFighterPower CalcEnemyFighterPower(dynamic json)\r
         {\r
             var result = new EnemyFighterPower();\r
index 1046e3f..46574a1 100644 (file)
@@ -32,8 +32,10 @@ namespace KancolleSniffer
         private readonly List<ShipLabel> _hpLabels = new List<ShipLabel>();\r
         private readonly ToolTip _toolTip = new ToolTip {ShowAlways = true};\r
         private readonly BattleInfo.BattleResult[] _result = new BattleInfo.BattleResult[2];\r
-        private Label _phaseLabel;\r
+        private Label _phaseLabel, _rankLabel;\r
         private BattleState _prevBattleState;\r
+        private readonly BattleResultRank[] _rank = new BattleResultRank[2];\r
+        private readonly InformationPanel _infomationPanel = new InformationPanel();\r
 \r
         public bool Spoiler { get; set; }\r
 \r
@@ -53,7 +55,6 @@ namespace KancolleSniffer
 \r
         public void Update(Sniffer sniffer)\r
         {\r
-\r
             if (_prevBattleState == BattleState.None)\r
                 _result[0] = _result[1] = null;\r
             var state = _prevBattleState = sniffer.Battle.BattleState;\r
@@ -62,32 +63,37 @@ namespace KancolleSniffer
             if (Spoiler)\r
             {\r
                 ShowResult(sniffer.Battle.Result);\r
+                ShowResultRank(sniffer.Battle.ResultRank);\r
                 if (state == BattleState.Day)\r
                 {\r
                     _result[0] = sniffer.Battle.Result;\r
+                    _rank[0] = sniffer.Battle.ResultRank;\r
                     SetPhase("昼戦");\r
                 }\r
                 else if (state == BattleState.Night)\r
                 {\r
                     _result[1] = sniffer.Battle.Result;\r
+                    _rank[1] = sniffer.Battle.ResultRank;\r
                     SetPhase("夜戦");\r
                 }\r
+                _infomationPanel.Visible = true;\r
             }\r
             else\r
             {\r
                 ClearResult();\r
-                _phaseLabel.Text = "結果";\r
-                _phaseLabel.BorderStyle = BorderStyle.FixedSingle;\r
-                _phaseLabel.Cursor = Cursors.Hand;\r
+                SetPhase("結果");\r
                 if (state == BattleState.Day)\r
                 {\r
                     _result[0] = sniffer.Battle.Result;\r
+                    _rank[0] = sniffer.Battle.ResultRank;\r
                 }\r
                 else if (state == BattleState.Night)\r
                 {\r
                     _result[1] = sniffer.Battle.Result;\r
+                    _rank[1] = sniffer.Battle.ResultRank;\r
                 }\r
             }\r
+            _infomationPanel.SetInformation(sniffer.Battle);\r
         }\r
 \r
         private void PhaseLabelClick(object sender, EventArgs ev)\r
@@ -98,11 +104,13 @@ namespace KancolleSniffer
                     if (_result[0] != null)\r
                     {\r
                         ShowResult(_result[0]);\r
+                        ShowResultRank(_rank[0]);\r
                         SetPhase("昼戦");\r
                     }\r
                     else if (_result[1] != null)\r
                     {\r
                         ShowResult(_result[1]);\r
+                        ShowResultRank(_rank[1]);\r
                         SetPhase("夜戦");\r
                     }\r
                     break;\r
@@ -110,6 +118,7 @@ namespace KancolleSniffer
                     if (_result[1] != null)\r
                     {\r
                         ShowResult(_result[1]);\r
+                        ShowResultRank(_rank[1]);\r
                         SetPhase("夜戦");\r
                     }\r
                     break;\r
@@ -117,6 +126,7 @@ namespace KancolleSniffer
                     if (_result[0] != null)\r
                     {\r
                         ShowResult(_result[0]);\r
+                        ShowResultRank(_rank[0]);\r
                         SetPhase("昼戦");\r
                     }\r
                     break;\r
@@ -126,7 +136,7 @@ namespace KancolleSniffer
         private void SetPhase(string phase)\r
         {\r
             _phaseLabel.Text = phase;\r
-            if (_result[0] != null && _result[1] != null)\r
+            if (phase == "結果" || _result[0] != null && _result[1] != null)\r
             {\r
                 _phaseLabel.BorderStyle = BorderStyle.FixedSingle;\r
                 _phaseLabel.Cursor = Cursors.Hand;\r
@@ -142,6 +152,7 @@ namespace KancolleSniffer
         {\r
             foreach (var panel in _panelList)\r
                 panel.Visible = false;\r
+            _rankLabel.Visible = _infomationPanel.Visible = false;\r
         }\r
 \r
         private void ShowResult(BattleInfo.BattleResult result)\r
@@ -149,7 +160,6 @@ namespace KancolleSniffer
             SuspendLayout();\r
             var friend = result.Friend;\r
             var enemy = result.Enemy;\r
-\r
             var fleet = new[] {"第一", "第二", "第三", "第四"};\r
             _friendLabels[0][1].Text = fleet[friend.Main[0].Fleet];\r
             for (var i = 0; i < friend.Main.Length; i++)\r
@@ -215,6 +225,9 @@ namespace KancolleSniffer
             }\r
             for (var i = lines; i < _panelList.Count; i++)\r
                 _panelList[i].Visible = false;\r
+            _infomationPanel.Location =\r
+                new Point(35 + AutoScrollPosition.X, lines * LineHeight + 1 + 3 + AutoScrollPosition.Y);\r
+            _infomationPanel.Visible = true;\r
             ResumeLayout();\r
         }\r
 \r
@@ -224,16 +237,30 @@ namespace KancolleSniffer
                 match => match.Value == "(elite)" ? "(e)" : "(f)");\r
         }\r
 \r
+        private void ShowResultRank(BattleResultRank rank)\r
+        {\r
+            _rankLabel.Visible = true;\r
+            var result = new[] {"完全S", "勝利S", "勝利A", "勝利B", "敗北C", "敗北D", "敗北E"};\r
+            _rankLabel.Text = result[(int)rank];\r
+        }\r
+\r
         private void CreateLabels()\r
         {\r
             SuspendLayout();\r
             _phaseLabel = new Label\r
             {\r
-                Location = new Point(93, 2),\r
+                Location = new Point(78, 2),\r
                 Size = new Size(31, 14)\r
             };\r
             _phaseLabel.Click += PhaseLabelClick;\r
             Controls.Add(_phaseLabel);\r
+            _rankLabel = new Label\r
+            {\r
+                Location = new Point(110, 2),\r
+                Size = new Size(42, 12)\r
+            };\r
+            Controls.Add(_rankLabel);\r
+            Controls.Add(_infomationPanel);\r
             for (var i = 0; i < 14; i++)\r
             {\r
                 var y = 1 + LineHeight * i;\r
@@ -269,5 +296,116 @@ namespace KancolleSniffer
             }\r
             ResumeLayout();\r
         }\r
+\r
+        private class InformationPanel : Panel\r
+        {\r
+            private readonly Label[] _formation;\r
+            private readonly Label[] _fighterPower;\r
+            private readonly ToolTip _toolTip = new ToolTip {ShowAlways = true};\r
+\r
+            public InformationPanel()\r
+            {\r
+                Visible = false;\r
+                Size = new Size(152, 32);\r
+                Controls.AddRange(_formation = new[]\r
+                {\r
+                    new Label\r
+                    {\r
+                        Location = new Point(1, 2),\r
+                        Size = new Size(53, 12),\r
+                        TextAlign = ContentAlignment.MiddleRight\r
+                    },\r
+                    new Label\r
+                    {\r
+                        Location = new Point(98, 2),\r
+                        Size = new Size(53, 12),\r
+                        TextAlign = ContentAlignment.MiddleLeft\r
+                    },\r
+                    new Label\r
+                    {\r
+                        Location = new Point(52, 2),\r
+                        Size = new Size(48, 12),\r
+                        TextAlign = ContentAlignment.MiddleCenter\r
+                    }\r
+                });\r
+                Controls.AddRange(_fighterPower = new[]\r
+                {\r
+                    new Label\r
+                    {\r
+                        Location = new Point(28, 17),\r
+                        Size = new Size(23, 12),\r
+                        TextAlign = ContentAlignment.MiddleRight\r
+                    },\r
+                    new Label\r
+                    {\r
+                        Location = new Point(102, 17),\r
+                        Size = new Size(23, 12),\r
+                        TextAlign = ContentAlignment.MiddleLeft\r
+                    },\r
+                    new Label\r
+                    {\r
+                        Location = new Point(50, 17),\r
+                        Size = new Size(53, 12),\r
+                        TextAlign = ContentAlignment.MiddleCenter\r
+                    }\r
+                });\r
+            }\r
+\r
+            public void SetInformation(BattleInfo battleInfo)\r
+            {\r
+                _formation[0].Text = FormationName(battleInfo.Formation[0]);\r
+                _formation[1].Text = FormationName(battleInfo.Formation[1]);\r
+                _formation[2].Text = new[] {"同航戦", "反航戦", "T字有利", "T字不利"}[battleInfo.Formation[2] - 1];\r
+\r
+                if (battleInfo.AirControlLevel == -1)\r
+                {\r
+                    if (battleInfo.BattleState == BattleState.Night)\r
+                        return;\r
+                    foreach (var label in _fighterPower)\r
+                        label.Visible = false;\r
+                    return;\r
+                }\r
+                var fp = battleInfo.FighterPower;\r
+                _fighterPower[0].Text = fp[0].ToString("D");\r
+                _toolTip.SetToolTip(_fighterPower[0], fp[0] == fp[1] ? "" : $"{fp[0]}~{fp[1]}");\r
+                var efp = battleInfo.EnemyFighterPower;\r
+                _fighterPower[1].Text = efp.AirCombat + efp.UnknownMark;\r
+                _toolTip.SetToolTip(_fighterPower[1],\r
+                    efp.AirCombat == efp.Interception ? "" : "防空:" + efp.Interception + efp.UnknownMark);\r
+                _fighterPower[2].Text =\r
+                    new[] {"", "制空均衡", "制空確保", "航空優勢", "航空劣勢", "制空喪失"}[battleInfo.AirControlLevel + 1];\r
+                foreach (var label in _fighterPower)\r
+                    label.Visible = true;\r
+            }\r
+\r
+            private string FormationName(int formation)\r
+            {\r
+                switch (formation)\r
+                {\r
+                    case 1:\r
+                        return "単縦陣";\r
+                    case 2:\r
+                        return "複縦陣";\r
+                    case 3:\r
+                        return "輪形陣";\r
+                    case 4:\r
+                        return "梯形陣";\r
+                    case 5:\r
+                        return "単横陣";\r
+                    case 6:\r
+                        return "警戒陣";\r
+                    case 11:\r
+                        return "第一警戒";\r
+                    case 12:\r
+                        return "第二警戒";\r
+                    case 13:\r
+                        return "第三警戒";\r
+                    case 14:\r
+                        return "第四警戒";\r
+                    default:\r
+                        return "単縦陣";\r
+                }\r
+            }\r
+        }\r
     }\r
 }
\ No newline at end of file
index 5d56b84..e1d937b 100644 (file)
@@ -617,7 +617,7 @@ namespace KancolleSniffer
                 return;\r
             panelBattleInfo.BringToFront();\r
             var battle = _sniffer.Battle;\r
-            labelFormation.Text = battle.Formation;\r
+            labelFormation.Text = new[] {"同航戦", "反航戦", "T字有利", "T字不利"}[battle.Formation[2] - 1];\r
             UpdateBattleFighterPower();\r
             if ((_config.Spoilers & Spoiler.ResultRank) != 0)\r
                 ShowResultRank();\r