OSDN Git Service

基地航空隊の制空値周りをリファクタリングする
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 19 Jul 2019 12:42:34 +0000 (21:42 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 19 Jul 2019 12:45:22 +0000 (21:45 +0900)
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/Model/AirBase.cs
KancolleSniffer/Model/AirBaseParams.cs [deleted file]
KancolleSniffer/Model/AirCorpsFighterPower.cs [new file with mode: 0644]
KancolleSniffer/Model/ItemSpec.cs
KancolleSniffer/Model/ItemStatus.cs
KancolleSniffer/Sniffer.cs
KancolleSniffer/View/FleetSpec.cs

index 93ac1e0..8484a65 100644 (file)
@@ -113,9 +113,9 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "airbase_001");\r
-            PAssert.That(() => (int)sniffer.AirBase[0].AirCorps[0].CalcFighterPower().Max.AirCombat == 301);\r
+            PAssert.That(() => sniffer.AirBase[0].AirCorps[0].CalcFighterPower().AirCombat.Max == 301);\r
             sniffer.AirBase[0].AirCorps[0].Action = 2; // 防空\r
-            PAssert.That(() => (int)sniffer.AirBase[0].AirCorps[0].CalcFighterPower().Max.Interception == 320);\r
+            PAssert.That(() => sniffer.AirBase[0].AirCorps[0].CalcFighterPower().Interception.Max == 320);\r
         }\r
 \r
         /// <summary>\r
@@ -126,7 +126,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "airbase_002");\r
-            PAssert.That(() => (int)sniffer.AirBase[0].AirCorps[2].CalcFighterPower().Min.Interception == 353);\r
+            PAssert.That(() => sniffer.AirBase[0].AirCorps[2].CalcFighterPower().Interception.Min == 353);\r
         }\r
 \r
         /// <summary>\r
@@ -137,7 +137,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "airbase_003");\r
-            PAssert.That(() => (int)sniffer.AirBase[1].AirCorps[0].CalcFighterPower().Min.AirCombat == 121);\r
+            PAssert.That(() => sniffer.AirBase[1].AirCorps[0].CalcFighterPower().AirCombat.Min == 121);\r
         }\r
 \r
         /// <summary>\r
@@ -159,7 +159,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "airbase_004");\r
-            PAssert.That(() => (int)sniffer.AirBase[1].AirCorps[0].CalcFighterPower().Min.AirCombat == 328);\r
+            PAssert.That(() => sniffer.AirBase[1].AirCorps[0].CalcFighterPower().AirCombat.Min == 328);\r
         }\r
 \r
         /// <summary>\r
@@ -173,13 +173,13 @@ namespace KancolleSniffer.Test
 \r
             // 二式陸上偵察機(熟練)\r
             var fp1 = sniffer.AirBase[0].AirCorps[0].CalcFighterPower();\r
-            PAssert.That(() => (int)fp1.Min.AirCombat == 274);\r
-            PAssert.That(() => (int)fp1.Min.Interception == 302);\r
+            PAssert.That(() => fp1.AirCombat.Min == 274);\r
+            PAssert.That(() => fp1.Interception.Min == 302);\r
 \r
             // 二式陸上偵察機\r
             var fp3 = sniffer.AirBase[0].AirCorps[2].CalcFighterPower();\r
-            PAssert.That(() => (int)fp3.Min.AirCombat == 206);\r
-            PAssert.That(() => (int)fp3.Min.Interception == 310);\r
+            PAssert.That(() => fp3.AirCombat.Min == 206);\r
+            PAssert.That(() => fp3.Interception.Min == 310);\r
         }\r
 \r
         /// <summary>\r
index de4c5cd..5efc7da 100644 (file)
@@ -54,7 +54,7 @@
     <Reference Include="System.Xml" />\r
   </ItemGroup>\r
   <ItemGroup>\r
-    <Compile Include="Model\AirBaseParams.cs" />\r
+    <Compile Include="Model\AirCorpsFighterPower.cs" />\r
     <Compile Include="Model\QuestCounter.cs" />\r
     <Compile Include="Model\QuestCountList.cs" />\r
     <Compile Include="Model\QuestSpec.cs" />\r
index d582601..0b1fc51 100644 (file)
@@ -30,7 +30,7 @@ namespace KancolleSniffer.Model
             _itemInfo = item;\r
         }\r
 \r
-        public BaseInfo[] AllAirCorps { get; set; }\r
+        public BaseInfo[] AllBase { get; set; }\r
 \r
         public class BaseInfo\r
         {\r
@@ -75,20 +75,21 @@ namespace KancolleSniffer.Model
                 }\r
             }\r
 \r
-            public AirBaseParams.Range CalcFighterPower()\r
+            public AirCorpsFighterPower CalcFighterPower()\r
             {\r
-                var reconPlaneBonus = Planes.Aggregate(new AirBaseParams(), (max, plane) =>\r
+                var reconPlaneBonus = Planes.Aggregate(new AirCorpsFighterPower.Pair(), (max, plane) =>\r
                 {\r
                     var bonus = plane.Slot.Spec.ReconPlaneAirBaseBonus;\r
-                    return AirBaseParams.Max(max, bonus);\r
+                    return AirCorpsFighterPower.Pair.Max(max, bonus);\r
                 });\r
-                return (Planes.Aggregate(new AirBaseParams.Range(), (previous, plane) =>\r
+                var range = (Planes.Aggregate(new AirCorpsFighterPower.Range(), (previous, plane) =>\r
                 {\r
                     if (plane.State != 1)\r
                         return previous;\r
                     var current = plane.Slot.CalcFighterPowerInBase(plane.Count);\r
                     return previous + current;\r
                 }) * reconPlaneBonus).Floor();\r
+                return new AirCorpsFighterPower(range);\r
             }\r
 \r
             public int[] CostForSortie => Planes.Aggregate(new[] {0, 0}, (prev, plane) =>\r
@@ -135,12 +136,12 @@ namespace KancolleSniffer.Model
                 }\r
             }\r
 \r
-            public AirBaseParams.Range FighterPower => Slot.CalcFighterPowerInBase(Count);\r
+            public AirCorpsFighterPower FighterPower => new AirCorpsFighterPower(Slot.CalcFighterPowerInBase(Count));\r
         }\r
 \r
         public void Inspect(dynamic json)\r
         {\r
-            AllAirCorps = (from entry in (dynamic[])json\r
+            AllBase = (from entry in (dynamic[])json\r
                 group\r
                     new AirCorpsInfo\r
                     {\r
@@ -161,7 +162,7 @@ namespace KancolleSniffer.Model
 \r
         public void InspectSetPlane(string request, dynamic json)\r
         {\r
-            if (AllAirCorps == null)\r
+            if (AllBase == null)\r
                 return;\r
             var values = HttpUtility.ParseQueryString(request);\r
             var airCorps = GetBaseInfo(values).AirCorps[int.Parse(values["api_base_id"]) - 1];\r
@@ -195,7 +196,7 @@ namespace KancolleSniffer.Model
 \r
         public void InspectSetAction(string request)\r
         {\r
-            if (AllAirCorps == null)\r
+            if (AllBase == null)\r
                 return;\r
             var values = HttpUtility.ParseQueryString(request);\r
             var airCorps = GetBaseInfo(values).AirCorps;\r
@@ -224,7 +225,7 @@ namespace KancolleSniffer.Model
         private BaseInfo GetBaseInfo(NameValueCollection values)\r
         {\r
             var areaId = int.Parse(values["api_area_id"] ?? "0"); // 古いAPIに対応するため\r
-            return AllAirCorps.First(b => b.AreaId == areaId);\r
+            return AllBase.First(b => b.AreaId == areaId);\r
         }\r
 \r
         public void InspectPlaneInfo(dynamic json)\r
@@ -241,10 +242,10 @@ namespace KancolleSniffer.Model
 \r
         public void SetItemHolder()\r
         {\r
-            if (AllAirCorps == null)\r
+            if (AllBase == null)\r
                 return;\r
             var name = new[] {"第一", "第二", "第三"};\r
-            foreach (var baseInfo in AllAirCorps.Select((data, i) => new {data, i}))\r
+            foreach (var baseInfo in AllBase.Select((data, i) => new {data, i}))\r
             {\r
                 var areaName = baseInfo.data.AreaName;\r
                 foreach (var airCorps in baseInfo.data.AirCorps.Select((data, i) => new {data, i}))\r
diff --git a/KancolleSniffer/Model/AirBaseParams.cs b/KancolleSniffer/Model/AirBaseParams.cs
deleted file mode 100644 (file)
index 01871f7..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-// 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 KancolleSniffer.Util;\r
-\r
-namespace KancolleSniffer.Model\r
-{\r
-    public struct AirBaseParams\r
-    {\r
-        public double AirCombat { get; }\r
-        public double Interception { get; }\r
-\r
-        public AirBaseParams(double airCombat, double interception)\r
-        {\r
-            AirCombat = airCombat;\r
-            Interception = interception;\r
-        }\r
-\r
-        public static AirBaseParams Max(AirBaseParams value1, AirBaseParams value2)\r
-        {\r
-            return new AirBaseParams(Math.Max(value1.AirCombat, value2.AirCombat),\r
-                Math.Max(value1.Interception, value2.Interception));\r
-        }\r
-\r
-        public static AirBaseParams operator +(AirBaseParams lhs, AirBaseParams rhs)\r
-        {\r
-            return new AirBaseParams(lhs.AirCombat + rhs.AirCombat, lhs.Interception + rhs.Interception);\r
-        }\r
-\r
-        public static AirBaseParams operator +(AirBaseParams lhs, double rhs)\r
-        {\r
-            return new AirBaseParams(lhs.AirCombat + rhs, lhs.Interception + rhs);\r
-        }\r
-\r
-        public static AirBaseParams operator *(AirBaseParams lhs, AirBaseParams rhs)\r
-        {\r
-            return new AirBaseParams(lhs.AirCombat * rhs.AirCombat, lhs.Interception * rhs.Interception);\r
-        }\r
-\r
-        public static AirBaseParams operator *(AirBaseParams lhs, double rhs)\r
-        {\r
-            return new AirBaseParams(lhs.AirCombat * rhs, lhs.Interception * rhs);\r
-        }\r
-\r
-        public AirBaseParams Floor()\r
-        {\r
-            return new AirBaseParams((int)AirCombat, (int)Interception);\r
-        }\r
-\r
-        public struct Range\r
-        {\r
-            public AirBaseParams Min { get; }\r
-            public AirBaseParams Max { get; }\r
-\r
-            public Range(AirBaseParams min, AirBaseParams max)\r
-            {\r
-                Min = min;\r
-                Max = max;\r
-            }\r
-\r
-            public Range(AirBaseParams base_, RangeD range)\r
-            {\r
-                Min = (base_ + range.Min).Floor();\r
-                Max = (base_ + range.Max).Floor();\r
-            }\r
-\r
-            public static Range operator +(Range lhs, Range rhs)\r
-            {\r
-                return new Range(lhs.Min + rhs.Min, lhs.Max + rhs.Max);\r
-            }\r
-\r
-            public static Range operator *(Range lhs, AirBaseParams rhs)\r
-            {\r
-                return new Range(lhs.Min * rhs, lhs.Max * rhs);\r
-            }\r
-\r
-            public Range Floor()\r
-            {\r
-                return new Range(Min.Floor(), Max.Floor());\r
-            }\r
-        }\r
-    }\r
-}
\ No newline at end of file
diff --git a/KancolleSniffer/Model/AirCorpsFighterPower.cs b/KancolleSniffer/Model/AirCorpsFighterPower.cs
new file mode 100644 (file)
index 0000000..297fce0
--- /dev/null
@@ -0,0 +1,108 @@
+// 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
+\r
+namespace KancolleSniffer.Model\r
+{\r
+    public class AirCorpsFighterPower\r
+    {\r
+        public Model.Range AirCombat;\r
+        public Model.Range Interception;\r
+        public bool Difference;\r
+\r
+        public AirCorpsFighterPower(Range fighterPower)\r
+        {\r
+            AirCombat = new Model.Range(fighterPower.Min.AirCombat, fighterPower.Max.AirCombat);\r
+            Interception = new Model.Range(fighterPower.Min.Interception, fighterPower.Max.Interception);\r
+            Difference = Interception.Min != AirCombat.Min;\r
+        }\r
+\r
+        public struct Pair\r
+        {\r
+            public double AirCombat { get; }\r
+            public double Interception { get; }\r
+\r
+            public Pair(double airCombat, double interception)\r
+            {\r
+                AirCombat = airCombat;\r
+                Interception = interception;\r
+            }\r
+\r
+            public static Pair Max(Pair value1, Pair value2)\r
+            {\r
+                return new Pair(Math.Max(value1.AirCombat, value2.AirCombat),\r
+                    Math.Max(value1.Interception, value2.Interception));\r
+            }\r
+\r
+            public static Pair operator +(Pair lhs, Pair rhs)\r
+            {\r
+                return new Pair(lhs.AirCombat + rhs.AirCombat, lhs.Interception + rhs.Interception);\r
+            }\r
+\r
+            public static Pair operator +(Pair lhs, double rhs)\r
+            {\r
+                return new Pair(lhs.AirCombat + rhs, lhs.Interception + rhs);\r
+            }\r
+\r
+            public static Pair operator *(Pair lhs, Pair rhs)\r
+            {\r
+                return new Pair(lhs.AirCombat * rhs.AirCombat, lhs.Interception * rhs.Interception);\r
+            }\r
+\r
+            public static Pair operator *(Pair lhs, double rhs)\r
+            {\r
+                return new Pair(lhs.AirCombat * rhs, lhs.Interception * rhs);\r
+            }\r
+\r
+            public Pair Floor()\r
+            {\r
+                return new Pair((int)AirCombat, (int)Interception);\r
+            }\r
+        }\r
+\r
+        public struct Range\r
+        {\r
+            public Pair Min { get; }\r
+            public Pair Max { get; }\r
+\r
+            public Range(Pair min, Pair max)\r
+            {\r
+                Min = min;\r
+                Max = max;\r
+            }\r
+\r
+            public Range(Pair base_, RangeD range)\r
+            {\r
+                Min = (base_ + range.Min).Floor();\r
+                Max = (base_ + range.Max).Floor();\r
+            }\r
+\r
+            public static Range operator +(Range lhs, Range rhs)\r
+            {\r
+                return new Range(lhs.Min + rhs.Min, lhs.Max + rhs.Max);\r
+            }\r
+\r
+            public static Range operator *(Range lhs, Pair rhs)\r
+            {\r
+                return new Range(lhs.Min * rhs, lhs.Max * rhs);\r
+            }\r
+\r
+            public Range Floor()\r
+            {\r
+                return new Range(Min.Floor(), Max.Floor());\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
index efbace6..d91b626 100644 (file)
@@ -204,21 +204,21 @@ namespace KancolleSniffer.Model
             }\r
         }\r
 \r
-        public AirBaseParams ReconPlaneAirBaseBonus\r
+        public AirCorpsFighterPower.Pair ReconPlaneAirBaseBonus\r
         {\r
             get\r
             {\r
                 switch (Type)\r
                 {\r
                     case 9:\r
-                        return new AirBaseParams(1.0, LoS <= 7 ? 1.2 : 1.3);\r
+                        return new AirCorpsFighterPower.Pair(1.0, LoS <= 7 ? 1.2 : 1.3);\r
                     case 10:\r
                     case 41:\r
-                        return new AirBaseParams(1.0, LoS <= 7 ? 1.1 : LoS <= 8 ? 1.13 : 1.16);\r
+                        return new AirCorpsFighterPower.Pair(1.0, LoS <= 7 ? 1.1 : LoS <= 8 ? 1.13 : 1.16);\r
                     case 49:\r
-                        return new AirBaseParams(LoS <= 8 ? 1.15 : 1.18, LoS <= 8 ? 1.18 : 1.24);\r
+                        return new AirCorpsFighterPower.Pair(LoS <= 8 ? 1.15 : 1.18, LoS <= 8 ? 1.18 : 1.24);\r
                 }\r
-                return new AirBaseParams(1.0, 1.0);\r
+                return new AirCorpsFighterPower.Pair(1.0, 1.0);\r
             }\r
         }\r
 \r
index 37a45cd..eb28c32 100644 (file)
@@ -56,14 +56,14 @@ namespace KancolleSniffer.Model
             }\r
         }\r
 \r
-        public AirBaseParams.Range CalcFighterPowerInBase(int slot)\r
+        public AirCorpsFighterPower.Range CalcFighterPowerInBase(int slot)\r
         {\r
             if (!Spec.IsAircraft || slot == 0)\r
-                return new AirBaseParams.Range();\r
+                return new AirCorpsFighterPower.Range();\r
             var withoutAlv =\r
-                (new AirBaseParams(Spec.Interception * 1.5, Spec.AntiBomber * 2 + Spec.Interception) +\r
+                (new AirCorpsFighterPower.Pair(Spec.Interception * 1.5, Spec.AntiBomber * 2 + Spec.Interception) +\r
                  Spec.AntiAir + FighterPowerLevelBonus) * Math.Sqrt(slot);\r
-            return new AirBaseParams.Range(withoutAlv, AlvBonusInBase);\r
+            return new AirCorpsFighterPower.Range(withoutAlv, AlvBonusInBase);\r
         }\r
 \r
         private RangeD AlvBonusInBase\r
index a0d5628..1d42b58 100644 (file)
@@ -657,7 +657,7 @@ namespace KancolleSniffer
 \r
         public string MiscText => _miscTextInfo.Text;\r
 \r
-        public AirBase.BaseInfo[] AirBase => _airBase.AllAirCorps;\r
+        public AirBase.BaseInfo[] AirBase => _airBase.AllBase;\r
 \r
         public CellInfo CellInfo => _cellInfo;\r
 \r
index f2ce39c..2069b72 100644 (file)
@@ -246,7 +246,7 @@ namespace KancolleSniffer.View
             {\r
                 public AirCorpsRecord(AirBase.AirCorpsInfo airCorps, int number)\r
                 {\r
-                    var corpsFp = new AirCorpsFp(airCorps.CalcFighterPower());\r
+                    var corpsFp = airCorps.CalcFighterPower();\r
                     string spec;\r
                     string spec2;\r
                     if (airCorps.Action == 2)\r
@@ -276,7 +276,7 @@ namespace KancolleSniffer.View
             {\r
                 public CorpsPlaneRecord(AirBase.PlaneInfo plane)\r
                 {\r
-                    var planeFp = new AirCorpsFp(plane.FighterPower);\r
+                    var planeFp = plane.FighterPower;\r
                     Equip = plane.State != 1 ? plane.StateName : GenEquipString(plane.Slot);\r
                     Spec = plane.State != 1 ? "" : $"+{plane.Slot.Alv} {plane.Count}/{plane.MaxCount}";\r
                     AircraftSpec =\r
@@ -286,20 +286,6 @@ namespace KancolleSniffer.View
                 }\r
             }\r
 \r
-            private class AirCorpsFp\r
-            {\r
-                public readonly Range AirCombat;\r
-                public readonly Range Interception;\r
-                public readonly bool Difference;\r
-\r
-                public AirCorpsFp(AirBaseParams.Range fighterPower)\r
-                {\r
-                    AirCombat = new Range(fighterPower.Min.AirCombat, fighterPower.Max.AirCombat);\r
-                    Interception = new Range(fighterPower.Min.Interception, fighterPower.Min.Interception);\r
-                    Difference = Interception.Min != AirCombat.Min;\r
-                }\r
-            }\r
-\r
             private static string RangeString(Range range) => range.Diff ? range.RangeString : range.Min.ToString();\r
         }\r
     }\r