OSDN Git Service

FleetPanelのリファクタリング
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Tue, 15 May 2018 10:53:12 +0000 (19:53 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Tue, 15 May 2018 10:53:12 +0000 (19:53 +0900)
KancolleSniffer/FleetPanel.cs
KancolleSniffer/ShipStatus.cs

index 562fd53..3a9c3a4 100644 (file)
@@ -59,25 +59,43 @@ namespace KancolleSniffer
             ResumeLayout();\r
         }\r
 \r
+        private class Total\r
+        {\r
+            public int Drum;\r
+            public int DrumShips;\r
+            public int Level;\r
+            public int FirePower;\r
+            public int AntiSubmarine;\r
+            public int AntiAir;\r
+            public int LoS;\r
+            public int Fuel;\r
+            public int Bull;\r
+\r
+            public void Add(ShipStatus s)\r
+            {\r
+                var drum = s.Slot.Count(item => item.Spec.Name == "ドラム缶(輸送用)");\r
+                DrumShips += drum != 0 ? 1 : 0;\r
+                Drum += drum;\r
+                Level += s.Level;\r
+                FirePower += s.Firepower;\r
+                AntiSubmarine += s.MissionAntiSubmarine;\r
+                AntiAir += s.AntiAir;\r
+                LoS += s.LoS;\r
+                Fuel += s.EffectiveFuelMax;\r
+                Bull += s.EffectiveBullMax;\r
+            }\r
+        }\r
+\r
         private void CreateTable(Sniffer sniffer)\r
         {\r
             var list = new List<Record>();\r
             var fn = new[] {"第一", "第二", "第三", "第四"};\r
             for (var f = 0; f < fn.Length; f++)\r
             {\r
-                var drumTotal = 0;\r
-                var drumShips = 0;\r
-                var levelTotal = 0;\r
-                var fpTotal = 0;\r
-                var aswTotal = 0;\r
-                var antiAirTotal = 0;\r
-                var fuelTotal = 0;\r
-                var bullTotal = 0;\r
-                var losTotal = 0;\r
+                var total = new Total();\r
                 var ships = new List<Record>();\r
                 foreach (var s in sniffer.GetShipStatuses(f))\r
                 {\r
-                    var drum = 0;\r
                     var equips = new List<Record>();\r
                     for (var i = 0; i < s.Slot.Length; i++)\r
                     {\r
@@ -86,8 +104,6 @@ namespace KancolleSniffer
                         var max = s.Spec.MaxEq[i];\r
                         if (item.Id == -1)\r
                             continue;\r
-                        if (item.Spec.Name == "ドラム缶(輸送用)")\r
-                            drum++;\r
                         var airspec = "";\r
                         if (item.Spec.IsDiveBomber) // 爆撃\r
                         {\r
@@ -99,7 +115,6 @@ namespace KancolleSniffer
                             var normal = 25 + item.Spec.Torpedo * Math.Sqrt(onslot);\r
                             airspec = "航空戦 " + (int)(normal * 0.8) + "/" + (int)(normal * 1.5);\r
                         }\r
-\r
                         equips.Add(new Record\r
                         {\r
                             Equip = GenEquipString(item),\r
@@ -113,16 +128,7 @@ namespace KancolleSniffer
                         var item = s.SlotEx;\r
                         equips.Add(new Record {Equip = GenEquipString(item), Color = item.Spec.Color});\r
                     }\r
-                    if (drum != 0)\r
-                        drumShips++;\r
-                    drumTotal += drum;\r
-                    levelTotal += s.Level;\r
-                    fpTotal += s.Firepower;\r
-                    aswTotal += s.MissionAntiSubmarine;\r
-                    antiAirTotal += s.AntiAir;\r
-                    losTotal += s.LoS;\r
-                    fuelTotal += Math.Max((int)(s.Spec.FuelMax * (s.Level >= 100 ? 0.85 : 1.0)), 1);\r
-                    bullTotal += Math.Max((int)(s.Spec.BullMax * (s.Level >= 100 ? 0.85 : 1.0)), 1);\r
+                    total.Add(s);\r
                     var fire = s.EffectiveFirepower;\r
                     var subm = s.EffectiveAntiSubmarine;\r
                     var torp = s.EffectiveTorpedo;\r
@@ -133,10 +139,8 @@ namespace KancolleSniffer
                         Ship = (s.Escaped ? "[避]" : "") + s.Name + " Lv" + s.Level,\r
                         Ship2 = "",\r
                         Id = s.Id,\r
-                        // ReSharper disable CompareOfFloatsByEqualityOperator\r
-                        Spec = (fire == 0 ? "" : $"砲{fire:f1}") + (subm == 0 ? "" : $" 潜{subm:f1}{oasa}"),\r
-                        Spec2 = (torp == 0 ? "" : $"雷{torp:f1}") + (night == 0 ? "" : $" 夜{night:f1}")\r
-                        // ReSharper restore CompareOfFloatsByEqualityOperator\r
+                        Spec = HideIfZero("砲", fire) + HideIfZero(" 潜", subm) + oasa,\r
+                        Spec2 = HideIfZero("雷", torp) + HideIfZero(" 夜", night)\r
                     };\r
                     if (ship.Spec == "")\r
                     {\r
@@ -152,15 +156,15 @@ namespace KancolleSniffer
                     tp += sniffer.GetTransportPoint(1);\r
                 list.Add(new Record\r
                 {\r
-                    Fleet = fn[f] + (levelTotal == 0 ? "" : " Lv" + levelTotal) +\r
-                            (drumTotal == 0 ? "" : " ドラム缶" + drumTotal + "(" + drumShips + "隻)") +\r
-                            (daihatsu > 0 ? $" 大発{daihatsu * 100:f1}%" : ""),\r
+                    Fleet = fn[f] + HideIfZero(" Lv", total.Level) +\r
+                            HideIfZero(" ドラム缶", total.Drum) + HideIfZero("(", total.DrumShips, "隻)") +\r
+                            HideIfZero(" 大発", daihatsu * 100, "%"),\r
                     Fleet2 = "計:" +\r
-                             "火" + CutOverFlow(fpTotal) +\r
-                             " 空" + CutOverFlow(antiAirTotal) +\r
-                             " 潜" + CutOverFlow(aswTotal) +\r
-                             " 索" + CutOverFlow(losTotal) + "\r\n" +\r
-                             $"戦闘:燃{fuelTotal / 5}弾{bullTotal / 5} 支援:燃{fuelTotal / 2}弾{(int)(bullTotal * 0.8)}" +\r
+                             "火" + CutOverFlow(total.FirePower) +\r
+                             " 空" + CutOverFlow(total.AntiAir) +\r
+                             " 潜" + CutOverFlow(total.AntiSubmarine) +\r
+                             " 索" + CutOverFlow(total.LoS) + "\r\n" +\r
+                             $"戦闘:燃{total.Fuel / 5}弾{total.Bull / 5} 支援:燃{total.Fuel / 2}弾{(int)(total.Bull * 0.8)}" +\r
                              (sniffer.CombinedFleetType != 0 && f == 1 ? "" : $"\r\nTP:S{(int)tp} A{(int)(tp * 0.7)}")\r
                 });\r
                 list.AddRange(ships);\r
@@ -220,6 +224,16 @@ namespace KancolleSniffer
 \r
         private int CutOverFlow(int value) => value > 999 ? 999 : value;\r
 \r
+        private string HideIfZero(string name, double value, string suffix = "")\r
+        {\r
+            return value > 0 ? name + value.ToString("f1") + suffix : "";\r
+        }\r
+\r
+        private string HideIfZero(string name, int value, string suffix = "")\r
+        {\r
+            return value > 0 ? name + value + suffix : "";\r
+        }\r
+\r
         private string GenEquipString(ItemStatus item)\r
         {\r
             var name = item.Spec.Name;\r
index 42fc0bc..bd5a4ec 100644 (file)
@@ -320,6 +320,10 @@ namespace KancolleSniffer
 \r
         public int EffectiveAntiAirForFleet => (int)AllSlot.Sum(item => item.EffectiveAntiAirForFleet);\r
 \r
+        public int EffectiveFuelMax => Max((int)(Spec.FuelMax * (Level >= 100 ? 0.85 : 1.0)), 1);\r
+\r
+        public int EffectiveBullMax => Max((int)(Spec.BullMax * (Level >= 100 ? 0.85 : 1.0)), 1);\r
+\r
         public object Clone()\r
         {\r
             var r = (ShipStatus)MemberwiseClone();\r