OSDN Git Service

航空戦の結果の処理をBattleInfoからAirBattleResultに分離する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 17 Aug 2019 07:44:56 +0000 (16:44 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 17 Aug 2019 07:44:56 +0000 (16:44 +0900)
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/Model/AirBattleResult.cs [new file with mode: 0644]
KancolleSniffer/Model/BattleInfo.cs
KancolleSniffer/View/AirBattleResultPanel.cs

index 283f0c7..e997acc 100644 (file)
@@ -55,6 +55,7 @@
   </ItemGroup>\r
   <ItemGroup>\r
     <Compile Include="Log\BattleLogger.cs" />\r
+    <Compile Include="Model\AirBattleResult.cs" />\r
     <Compile Include="Model\AirCorpsFighterPower.cs" />\r
     <Compile Include="Model\QuestCounter.cs" />\r
     <Compile Include="Model\QuestCountList.cs" />\r
diff --git a/KancolleSniffer/Model/AirBattleResult.cs b/KancolleSniffer/Model/AirBattleResult.cs
new file mode 100644 (file)
index 0000000..f8c1d53
--- /dev/null
@@ -0,0 +1,105 @@
+// Copyright (C) 2019 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+//    http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// 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
+\r
+namespace KancolleSniffer.Model\r
+{\r
+    public class AirBattleResult\r
+    {\r
+        public List<AirBattleRecord> Result = new List<AirBattleRecord>();\r
+\r
+        private readonly Func<int, string> _getShipName;\r
+        private readonly Func<int[], string[]> _getItemNames;\r
+\r
+        public AirBattleResult(Func<int, string> getShipName, Func<int[], string[]> getItemNames)\r
+        {\r
+            _getShipName = getShipName;\r
+            _getItemNames = getItemNames;\r
+        }\r
+\r
+        public class AirBattleRecord\r
+        {\r
+            public string PhaseName { get; set; }\r
+            public int AirControlLevel { get; set; }\r
+            public StageResult Stage1 { get; set; }\r
+            public StageResult Stage2 { get; set; }\r
+            public AirFireResult AirFire { get; set; }\r
+        }\r
+\r
+        public void Clear()\r
+        {\r
+            Result.Clear();\r
+        }\r
+\r
+        public class StageResult\r
+        {\r
+            public int FriendCount { get; set; }\r
+            public int FriendLost { get; set; }\r
+            public int EnemyCount { get; set; }\r
+            public int EnemyLost { get; set; }\r
+        }\r
+\r
+        public class AirFireResult\r
+        {\r
+            public string ShipName { get; set; }\r
+            public int Kind { get; set; }\r
+            public string[] Items { get; set; }\r
+        }\r
+\r
+        public void Add(dynamic json, string phaseName)\r
+        {\r
+            var stage1 = json.api_stage1;\r
+            if (stage1 == null || (stage1.api_f_count == 0 && stage1.api_e_count == 0))\r
+                return;\r
+            var result = new AirBattleRecord\r
+            {\r
+                PhaseName = phaseName,\r
+                AirControlLevel = json.api_stage1.api_disp_seiku() ? (int)json.api_stage1.api_disp_seiku : 0,\r
+                Stage1 = CreateStageResult(json.api_stage1),\r
+                Stage2 = json.api_stage2 == null\r
+                    ? new StageResult()\r
+                    : CreateStageResult(json.api_stage2),\r
+                AirFire = CreateAirFireResult(json)\r
+            };\r
+            Result.Add(result);\r
+        }\r
+\r
+        private StageResult CreateStageResult(dynamic stage)\r
+        {\r
+            return new StageResult\r
+            {\r
+                FriendCount = (int)stage.api_f_count,\r
+                FriendLost = (int)stage.api_f_lostcount,\r
+                EnemyCount = (int)stage.api_e_count,\r
+                EnemyLost = (int)stage.api_e_lostcount\r
+            };\r
+        }\r
+\r
+        private AirFireResult CreateAirFireResult(dynamic json)\r
+        {\r
+            if (json.api_stage2 == null || !json.api_stage2.api_air_fire())\r
+                return null;\r
+            var airFire = json.api_stage2.api_air_fire;\r
+            var idx = (int)airFire.api_idx;\r
+            return new AirFireResult\r
+            {\r
+                ShipName = _getShipName(idx),\r
+                Kind = (int)airFire.api_kind,\r
+                Items = _getItemNames((int[])airFire.api_use_items)\r
+            };\r
+        }\r
+    }\r
+}
\ No newline at end of file
index 260f93d..8e9e6bf 100644 (file)
@@ -16,7 +16,6 @@ using System;
 using System.Collections.Generic;\r
 using System.Linq;\r
 using KancolleSniffer.Util;\r
-using KancolleSniffer.View;\r
 using static System.Math;\r
 \r
 namespace KancolleSniffer.Model\r
@@ -72,7 +71,7 @@ namespace KancolleSniffer.Model
         public RankPair DisplayedResultRank { get; } = new RankPair();\r
         public BattleResult Result { get; set; }\r
         public bool EnemyIsCombined => _enemyGuard.Length > 0;\r
-        public List<AirBattleResult> AirBattleResults { get; } = new List<AirBattleResult>();\r
+        public AirBattleResult AirBattleResult;\r
         public int SupportType { get; private set; }\r
 \r
         public class RankPair\r
@@ -99,6 +98,17 @@ namespace KancolleSniffer.Model
             _shipInfo = shipInfo;\r
             _itemInfo = itemInfo;\r
             _airBase = airBase;\r
+            AirBattleResult = new AirBattleResult(GetAirFireShipName, GetItemNames);\r
+        }\r
+\r
+        private string GetAirFireShipName(int idx)\r
+        {\r
+            return idx < _friend.Length ? _friend[idx].Name : _guard[idx - 6].Name;\r
+        }\r
+\r
+        private string[] GetItemNames(int[] ids)\r
+        {\r
+            return ids.Select(id => _itemInfo.GetSpecByItemId(id).Name).ToArray();\r
         }\r
 \r
         public void Port()\r
@@ -125,7 +135,6 @@ namespace KancolleSniffer.Model
             SetResult();\r
         }\r
 \r
-\r
         private void SetFormation(dynamic json)\r
         {\r
             if (json.api_formation())\r
@@ -307,7 +316,7 @@ namespace KancolleSniffer.Model
             SetupEnemyDamageRecord(json, false);\r
             SetEnemyFighterPower();\r
             BattleState = BattleState.Day;\r
-            AddAirBattleResult(json.api_air_base_attack, "空襲");\r
+            AirBattleResult.Add(json.api_air_base_attack, "空襲");\r
             CalcKoukuDamage(json.api_air_base_attack);\r
             SetAirRaidResultRank(json);\r
             SetResult();\r
@@ -366,7 +375,7 @@ namespace KancolleSniffer.Model
 \r
         private void CalcDamage(dynamic json)\r
         {\r
-            AirBattleResults.Clear();\r
+            AirBattleResult.Clear();\r
             foreach (KeyValuePair<string, dynamic> kv in json)\r
             {\r
                 if (kv.Value == null)\r
@@ -374,11 +383,11 @@ namespace KancolleSniffer.Model
                 switch (kv.Key)\r
                 {\r
                     case "api_air_base_injection":\r
-                        AddAirBattleResult(kv.Value, "AB噴式");\r
+                        AirBattleResult.Add(kv.Value, "AB噴式");\r
                         CalcKoukuDamage(kv.Value);\r
                         break;\r
                     case "api_injection_kouku":\r
-                        AddAirBattleResult(kv.Value, "噴式");\r
+                        AirBattleResult.Add(kv.Value, "噴式");\r
                         CalcKoukuDamage(kv.Value);\r
                         break;\r
                     case "api_air_base_attack":\r
@@ -394,11 +403,11 @@ namespace KancolleSniffer.Model
                         CalcDamageByTurn(kv.Value);\r
                         break;\r
                     case "api_kouku":\r
-                        AddAirBattleResult(kv.Value, "航空戦");\r
+                        AirBattleResult.Add(kv.Value, "航空戦");\r
                         CalcKoukuDamage(kv.Value);\r
                         break;\r
                     case "api_kouku2":\r
-                        AddAirBattleResult(kv.Value, "航空戦2");\r
+                        AirBattleResult.Add(kv.Value, "航空戦2");\r
                         CalcKoukuDamage(kv.Value);\r
                         break;\r
                     case "api_support_info":\r
@@ -449,7 +458,7 @@ namespace KancolleSniffer.Model
             var i = 1;\r
             foreach (var entry in json)\r
             {\r
-                AddAirBattleResult(entry, "基地" + i++);\r
+                AirBattleResult.Add(entry, "基地" + i++);\r
                 CalcKoukuDamage(entry);\r
             }\r
         }\r
@@ -459,49 +468,6 @@ namespace KancolleSniffer.Model
             CalcDamageByTurn(json.api_hougeki, true);\r
         }\r
 \r
-        private void AddAirBattleResult(dynamic json, string phaseName)\r
-        {\r
-            var stage1 = json.api_stage1;\r
-            if (stage1 == null || (stage1.api_f_count == 0 && stage1.api_e_count == 0))\r
-                return;\r
-            var result = new AirBattleResult\r
-            {\r
-                PhaseName = phaseName,\r
-                AirControlLevel = json.api_stage1.api_disp_seiku() ? (int)json.api_stage1.api_disp_seiku : 0,\r
-                Stage1 = CreateStageResult(json.api_stage1),\r
-                Stage2 = json.api_stage2 == null\r
-                    ? new AirBattleResult.StageResult()\r
-                    : CreateStageResult(json.api_stage2),\r
-                AirFire = CreateAirFireResult(json)\r
-            };\r
-            AirBattleResults.Add(result);\r
-        }\r
-\r
-        private AirBattleResult.StageResult CreateStageResult(dynamic stage)\r
-        {\r
-            return new AirBattleResult.StageResult\r
-            {\r
-                FriendCount = (int)stage.api_f_count,\r
-                FriendLost = (int)stage.api_f_lostcount,\r
-                EnemyCount = (int)stage.api_e_count,\r
-                EnemyLost = (int)stage.api_e_lostcount\r
-            };\r
-        }\r
-\r
-        private AirBattleResult.AirFireResult CreateAirFireResult(dynamic json)\r
-        {\r
-            if (json.api_stage2 == null || !json.api_stage2.api_air_fire())\r
-                return null;\r
-            var airFire = json.api_stage2.api_air_fire;\r
-            var idx = (int)airFire.api_idx;\r
-            return new AirBattleResult.AirFireResult\r
-            {\r
-                ShipName = idx < _friend.Length ? _friend[idx].Name : _guard[idx - 6].Name,\r
-                Kind = (int)airFire.api_kind,\r
-                Items = ((int[])airFire.api_use_items).Select(id => _itemInfo.GetSpecByItemId(id).Name).ToArray()\r
-            };\r
-        }\r
-\r
         private void CalcKoukuDamage(dynamic json)\r
         {\r
             if (json.api_stage3() && json.api_stage3 != null)\r
index 07f1fcf..35b7c8e 100644 (file)
@@ -22,37 +22,13 @@ using KancolleSniffer.Model;
 \r
 namespace KancolleSniffer.View\r
 {\r
-    public class AirBattleResult\r
-    {\r
-        public class StageResult\r
-        {\r
-            public int FriendCount { get; set; }\r
-            public int FriendLost { get; set; }\r
-            public int EnemyCount { get; set; }\r
-            public int EnemyLost { get; set; }\r
-        }\r
-\r
-        public class AirFireResult\r
-        {\r
-            public string ShipName { get; set; }\r
-            public int Kind { get; set; }\r
-            public string[] Items { get; set; }\r
-        }\r
-\r
-        public string PhaseName { get; set; }\r
-        public int AirControlLevel { get; set; }\r
-        public StageResult Stage1 { get; set;  }\r
-        public StageResult Stage2 { get; set;  }\r
-        public AirFireResult AirFire { get; set; }\r
-    }\r
-\r
     [DesignerCategory("Code")]\r
     public class AirBattleResultPanel : PanelWithToolTip\r
     {\r
         private readonly Label _phaseName;\r
         private readonly Label _stage1;\r
         private readonly Label[][][] _resultLabels = new Label[2][][];\r
-        private AirBattleResult[] _resultList;\r
+        private AirBattleResult.AirBattleRecord[] _resultList;\r
         private int _resultIndex;\r
         private readonly ShipLabel.Name _ciShipName;\r
         private readonly Label _ciKind;\r
@@ -127,7 +103,7 @@ namespace KancolleSniffer.View
             var state = sniffer.Battle.BattleState;\r
             if (state != BattleState.Day && state != BattleState.SpNight)\r
                 return;\r
-            _resultList = sniffer.Battle.AirBattleResults.ToArray();\r
+            _resultList = sniffer.Battle.AirBattleResult.Result.ToArray();\r
             if (_resultList.Length == 0)\r
             {\r
                 ResultRemained = false;\r