OSDN Git Service

艦隊ごとの装備一覧に砲撃火力と対潜火力を表示する
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Tue, 21 Apr 2015 10:31:52 +0000 (19:31 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Wed, 22 Apr 2015 12:48:45 +0000 (21:48 +0900)
KancolleSniffer/EquipPanel.cs
KancolleSniffer/ItemInfo.cs
KancolleSniffer/ShipInfo.cs
KancolleSniffer/ShipMaster.cs

index cbc893c..b218250 100644 (file)
@@ -37,6 +37,7 @@ namespace KancolleSniffer
             public int Id { get; set; }\r
             public string Equip { get; set; }\r
             public Color Color { get; set; }\r
+            public string Spec { get; set; }\r
 \r
             public EquipColumn()\r
             {\r
@@ -57,7 +58,7 @@ namespace KancolleSniffer
         private void CreateEquipList(Sniffer sniffer)\r
         {\r
             var list = new List<EquipColumn>();\r
-            var fn = new[] { "第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊" };\r
+            var fn = new[] {"第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊"};\r
             for (var f = 0; f < fn.Length; f++)\r
             {\r
                 var drumTotal = 0;\r
@@ -87,7 +88,14 @@ namespace KancolleSniffer
                     if (drum != 0)\r
                         drumShips++;\r
                     drumTotal += drum;\r
-                    ships.Add(new EquipColumn { Ship = s.Name, Id = s.Id });\r
+                    var rfp = s.RealFirepower;\r
+                    var ras = s.RealAntiSubmarine;\r
+                    ships.Add(new EquipColumn\r
+                    {\r
+                        Ship = s.Name,\r
+                        Id = s.Id,\r
+                        Spec = (rfp == 0 ? "" : "砲" + rfp) + (ras == 0 ? "" : " 潜" + ras)\r
+                    });\r
                     ships.AddRange(equips);\r
                 }\r
                 list.Add(new EquipColumn\r
@@ -122,7 +130,8 @@ namespace KancolleSniffer
                 new ShipLabel {Location = new Point(1, 2), AutoSize = true},\r
                 new ShipLabel {Location = new Point(10, 2), AutoSize = true},\r
                 new ShipLabel {Location = new Point(40, 2), AutoSize = true},\r
-                new ShipLabel {Location = new Point(37, 2), Size = new Size(4, LabelHeight - 2)}\r
+                new ShipLabel {Location = new Point(37, 2), Size = new Size(4, LabelHeight - 2)},\r
+                new ShipLabel {Location = new Point(217, 2), AutoSize = true, AnchorRight = true}\r
             };\r
             _labelList.Add(labels);\r
             _panelList.Add(lbp);\r
@@ -157,6 +166,7 @@ namespace KancolleSniffer
             labels[2].Text = e.Equip;\r
             labels[3].Visible = e.Equip != "";\r
             labels[3].BackColor = e.Color;\r
+            labels[4].Text = e.Spec;\r
             lbp.Visible = true;\r
         }\r
 \r
index e134f70..c7e0aa1 100644 (file)
@@ -32,6 +32,9 @@ namespace KancolleSniffer
         public int IconType;\r
         public int AntiAir;\r
         public int LoS;\r
+        public int AntiSubmarine;\r
+        public int Torpedo;\r
+        public int Bomber;\r
 \r
         public ItemSpec()\r
         {\r
@@ -100,6 +103,25 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
+        public bool IsSonar\r
+        {\r
+            get\r
+            {\r
+                return Type == 14 || // ソナー\r
+                       Type == 40; // 大型ソナー\r
+            }\r
+        }\r
+\r
+        public bool IsDepthCharge\r
+        {\r
+            get { return Type == 15; }\r
+        }\r
+\r
+        public bool IsReconSeaplane\r
+        {\r
+            get { return Type == 10; }\r
+        }\r
+\r
         public Color Color\r
         {\r
             get\r
@@ -282,7 +304,10 @@ namespace KancolleSniffer
                     TypeName = dict[(int)entry.api_type[2]],\r
                     IconType = (int)entry.api_type[3],\r
                     AntiAir = (int)entry.api_tyku,\r
-                    LoS = (int)entry.api_saku\r
+                    LoS = (int)entry.api_saku,\r
+                    AntiSubmarine = (int)entry.api_tais,\r
+                    Torpedo = (int)entry.api_raig,\r
+                    Bomber = (int)entry.api_baku\r
                 };\r
             }\r
             _itemSpecs[-1] = new ItemSpec();\r
index 95d17d2..3e8d328 100644 (file)
@@ -24,6 +24,7 @@ namespace KancolleSniffer
 {\r
     public class ShipStatus\r
     {\r
+        private readonly ItemInfo _itemInfo;\r
         public int Id { get; set; }\r
         public int Fleet { get; set; } // ShipListだけで使う\r
         public ShipSpec Spec { get; set; }\r
@@ -43,14 +44,17 @@ namespace KancolleSniffer
         public int[] OnSlot { get; set; }\r
         public int[] Slot { get; set; }\r
         public int LoS { get; set; }\r
+        public int Firepower { get; set; }\r
+        public int AntiSubmarine { get; set; }\r
 \r
         public Damage DamageLevel\r
         {\r
             get { return CalcDamage(NowHp, MaxHp); }\r
         }\r
 \r
-        public ShipStatus()\r
+        public ShipStatus(ItemInfo itemInfo = null)\r
         {\r
+            _itemInfo = itemInfo;\r
             Id = -1;\r
             Spec = new ShipSpec();\r
             OnSlot = new int[0];\r
@@ -97,6 +101,59 @@ namespace KancolleSniffer
             fuel = (int)(Spec.FuelMax * 0.2 * 0.16 * damage);\r
             steal = (int)(Spec.FuelMax * 0.2 * 0.3 * damage);\r
         }\r
+\r
+        public int RealFirepower\r
+        {\r
+            get\r
+            {\r
+                if (Spec.IsSubmarine)\r
+                    return 0;\r
+                if (!Spec.IsAircraftCarrier)\r
+                    return Firepower + 5;\r
+                var specs = (from id in Slot\r
+                    let spec = _itemInfo.ItemDict[id].Spec\r
+                    where spec.IsAircraft\r
+                    select new {torpedo = spec.Torpedo, bomber = spec.Bomber}).ToArray();\r
+                var torpedo = specs.Sum(s => s.torpedo);\r
+                var bomber = specs.Sum(s => s.bomber);\r
+                if (torpedo == 0 && bomber == 0)\r
+                    return 0;\r
+                return (int)((Firepower + torpedo) * 1.5 + bomber * 2 + 55);\r
+            }\r
+        }\r
+\r
+        public int RealAntiSubmarine\r
+        {\r
+            get\r
+            {\r
+                if (!Spec.IsAntiSubmarine)\r
+                    return 0;\r
+                if (Spec.IsAircraftCarrier && RealFirepower == 0) // 砲撃戦に参加しない\r
+                    return 0;\r
+                var sonar = 0;\r
+                var dc = 0;\r
+                var aircraft = 0;\r
+                var all = 0;\r
+                var vanilla = AntiSubmarine;\r
+                foreach (var spec in Slot.Select(id => _itemInfo.ItemDict[id].Spec))\r
+                {\r
+                    vanilla -= spec.AntiSubmarine;\r
+                    if (spec.IsReconSeaplane) // 水偵は除外\r
+                        continue;\r
+                    if (spec.IsSonar)\r
+                        sonar += spec.AntiSubmarine;\r
+                    else if (spec.IsDepthCharge)\r
+                        dc += spec.AntiSubmarine;\r
+                    else if (spec.IsAircraft)\r
+                        aircraft += spec.AntiSubmarine;\r
+                    all += spec.AntiSubmarine;\r
+                }\r
+                if (vanilla == 0 && aircraft == 0) // 素対潜0で航空機なしは対潜攻撃なし\r
+                    return 0;\r
+                var bonus = sonar > 0 && dc > 0 ? 1.15 : 1.0;\r
+                return (int)(bonus * (vanilla / 5 + all * 2 + (aircraft > 0 ? 10 : 25)));\r
+            }\r
+        }\r
     }\r
 \r
     public struct ChargeStatus\r
@@ -215,7 +272,7 @@ namespace KancolleSniffer
         {\r
             foreach (var entry in json)\r
             {\r
-                _shipInfo[(int)entry.api_id] = new ShipStatus\r
+                _shipInfo[(int)entry.api_id] = new ShipStatus(_itemInfo)\r
                 {\r
                     Id = (int)entry.api_id,\r
                     Spec = _shipMaster[(int)entry.api_ship_id],\r
@@ -228,7 +285,9 @@ namespace KancolleSniffer
                     Bull = (int)entry.api_bull,\r
                     OnSlot = (int[])entry.api_onslot,\r
                     Slot = (int[])entry.api_slot,\r
-                    LoS = (int)entry.api_sakuteki[0]\r
+                    LoS = (int)entry.api_sakuteki[0],\r
+                    Firepower = (int)entry.api_karyoku[0],\r
+                    AntiSubmarine = (int)entry.api_taisen[0]\r
                 };\r
                 _itemInfo.CountNewItems((int[])entry.api_slot);\r
             }\r
@@ -356,7 +415,8 @@ namespace KancolleSniffer
         public ShipStatus[] GetShipStatuses(int fleet)\r
         {\r
             return\r
-                (from id in _decks[fleet] where id != -1\r
+                (from id in _decks[fleet]\r
+                    where id != -1\r
                     select _escapedShips.Contains(id) ? new ShipStatus() : _shipInfo[id]).ToArray();\r
         }\r
 \r
index c1b00bf..832134d 100644 (file)
@@ -76,9 +76,11 @@ namespace KancolleSniffer
         public int ShipType { get; set; }\r
         public string ShipTypeName { get; set; }\r
 \r
-        public bool IsSubmarine\r
+        public ShipSpec()\r
         {\r
-            get { return ShipType == 13 || ShipType == 14; }\r
+            Id = -1;\r
+            Name = "";\r
+            MaxEq = new int[0];\r
         }\r
 \r
         public double RepairWeight\r
@@ -101,6 +103,7 @@ namespace KancolleSniffer
                     case 7: // 軽空母\r
                     case 8: // 高速戦艦\r
                     case 20: // 潜水母艦\r
+                    case 21: // 練習巡洋艦\r
                         return 1.5;\r
                     case 9: // 低速戦艦\r
                     case 10: // 航空戦艦\r
@@ -113,11 +116,35 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        public ShipSpec()\r
+        public bool IsSubmarine\r
         {\r
-            Id = -1;\r
-            Name = "";\r
-            MaxEq = new int[0];\r
+            get { return ShipType == 13 || ShipType == 14; }\r
+        }\r
+\r
+        public bool IsAircraftCarrier\r
+        {\r
+            get { return ShipType == 7 || ShipType == 11 || ShipType == 18; }\r
+        }\r
+\r
+        public bool IsAntiSubmarine\r
+        {\r
+            get\r
+            {\r
+                switch (ShipType)\r
+                {\r
+                    case 2: // 駆逐\r
+                    case 3: // 軽巡\r
+                    case 4: // 雷巡\r
+                    case 6: // 航巡\r
+                    case 7: // 軽空\r
+                    case 10: // 航戦\r
+                    case 16: // 水母\r
+                    case 17: // 揚陸艦\r
+                    case 21: // 練巡\r
+                        return true;\r
+                }\r
+                return false;\r
+            }\r
         }\r
     }\r
 }
\ No newline at end of file