OSDN Git Service

艦娘の補給状況をパーセント表示する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Thu, 3 Oct 2019 14:21:22 +0000 (23:21 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Thu, 3 Oct 2019 14:29:36 +0000 (23:29 +0900)
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/Model/Fleet.cs

index 9832e54..ddc6f0f 100644 (file)
@@ -657,8 +657,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer(true);\r
             SniffLogFile(sniffer, "twofleets_001");\r
-            var expected = Enumerable.Repeat(new ChargeStatus(5, 5), ShipInfo.FleetCount);\r
-            PAssert.That(() => expected.SequenceEqual(sniffer.Fleets.Select(f => f.ChargeStatus)));\r
+            PAssert.That(() => new[]{5, 5, 5, 5}.SequenceEqual(sniffer.Fleets.Select(f => f.ChargeStatus.Fuel)));\r
         }\r
 \r
         /// <summary>\r
index 445512a..88b20bf 100644 (file)
@@ -892,6 +892,9 @@ namespace KancolleSniffer
                 var stat = Sniffer.Fleets[i].ChargeStatus;\r
                 fuelSq[i].ImageIndex = stat.Fuel;\r
                 bullSq[i].ImageIndex = stat.Bull;\r
+                var text = $"燃{stat.FuelRatio * 100:f1}% 弾{stat.BullRatio * 100:f1}%";\r
+                _toolTip.SetToolTip(fuelSq[i], text);\r
+                _toolTip.SetToolTip(bullSq[i], text);\r
             }\r
         }\r
 \r
index 0aa3fe8..736a9c1 100644 (file)
 using System;\r
 using System.Collections.Generic;\r
 using System.Linq;\r
-using KancolleSniffer.Util;\r
 using static System.Math;\r
 \r
 namespace KancolleSniffer.Model\r
 {\r
-    public struct ChargeStatus\r
+    public class ChargeStatus\r
     {\r
-        public int Fuel { get; set; }\r
-        public int Bull { get; set; }\r
+        public double FuelRatio { get; set; }\r
+        public int Fuel => CalcChargeState(FuelRatio) + (Others ? 5 : 0);\r
 \r
-        public ChargeStatus(ShipStatus status) : this()\r
+        public double BullRatio { get; set; }\r
+        public int Bull => CalcChargeState(BullRatio) + (Others ? 5 : 0);\r
+\r
+        public bool Others;\r
+\r
+        public ChargeStatus()\r
         {\r
-            Fuel = CalcChargeState(status.Fuel, status.Spec.FuelMax);\r
-            Bull = CalcChargeState(status.Bull, status.Spec.BullMax);\r
         }\r
 \r
-        public ChargeStatus(int fuel, int bull) : this()\r
+        public ChargeStatus(ShipStatus status)\r
         {\r
-            Fuel = fuel;\r
-            Bull = bull;\r
+            FuelRatio = status.Spec.FuelMax == 0 ? 0 : (double)status.Fuel / status.Spec.FuelMax;\r
+            BullRatio = status.Spec.BullMax == 0 ? 0 : (double)status.Bull / status.Spec.BullMax;\r
         }\r
 \r
-        private int CalcChargeState(int now, int full)\r
+        private int CalcChargeState(double ratio)\r
         {\r
-            if (full == 0 || now == full)\r
+            // ReSharper disable CompareOfFloatsByEqualityOperator\r
+            if (ratio == 0.0 || ratio == 1.0)\r
                 return 0;\r
-            var ratio = (double)now / full;\r
+            // ReSharper restore CompareOfFloatsByEqualityOperator\r
             if (ratio >= 7.0 / 9)\r
                 return 1;\r
             if (ratio >= 3.0 / 9)\r
@@ -50,6 +53,15 @@ namespace KancolleSniffer.Model
                 return 3;\r
             return 4;\r
         }\r
+\r
+        public static ChargeStatus Min(ChargeStatus a, ChargeStatus b)\r
+        {\r
+            return new ChargeStatus\r
+            {\r
+                FuelRatio = Math.Min(a.FuelRatio, b.FuelRatio),\r
+                BullRatio = Math.Min(a.BullRatio, b.BullRatio)\r
+            };\r
+        }\r
     }\r
 \r
     public enum FleetState\r
@@ -152,10 +164,9 @@ namespace KancolleSniffer.Model
             get\r
             {\r
                 var fs = new ChargeStatus(Ships[0]);\r
-                var others = (from ship in Ships.Skip(1) select new ChargeStatus(ship)).Aggregate(\r
-                    (result, next) => new ChargeStatus(Max(result.Fuel, next.Fuel), Max(result.Bull, next.Bull)));\r
-                return new ChargeStatus(fs.Fuel != 0 ? fs.Fuel : others.Fuel + 5,\r
-                    fs.Bull != 0 ? fs.Bull : others.Bull + 5);\r
+                var others = (from ship in Ships.Skip(1) select new ChargeStatus(ship)).Aggregate(ChargeStatus.Min);\r
+                others.Others = true;\r
+                return fs.Fuel != 0 ? fs : others;\r
             }\r
         }\r
 \r