OSDN Git Service

バージョン11.9の準備
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / TextGenerator.cs
index bb2dcc3..a5a7c09 100644 (file)
@@ -16,26 +16,45 @@ using System.Collections.Generic;
 using System.IO;\r
 using System.Linq;\r
 using System.Text;\r
+using KancolleSniffer.Model;\r
 \r
 namespace KancolleSniffer\r
 {\r
     public static class TextGenerator\r
     {\r
         public static string GenerateShipList(IEnumerable<ShipStatus> shipList)\r
-            => "ID,艦種,艦名,レベル\r\n" +\r
+            => "ID,艦種,艦名,レベル,cond,素対潜\r\n" +\r
                string.Join("\r\n",\r
                    from ship in shipList\r
                    orderby ship.Spec.ShipType, -ship.Level, ship.ExpToNext\r
-                   select $"{ship.Id},{ship.Spec.ShipTypeName},{ship.Name},{ship.Level}");\r
+                   select $"{ship.Id},{ship.Spec.ShipTypeName},{ship.Name},{ship.Level},{ship.Cond},{ship.ShipAntiSubmarine}");\r
+\r
+        // ReSharper disable IdentifierTypo\r
+        public static string GenerateKantaiSarashiData(IEnumerable<ShipStatus> shipList)\r
+        {\r
+            return ".2|" +\r
+                   string.Join("|", from ship in shipList\r
+                       where ship.Locked\r
+                       group ship by ship.Spec.Remodel.Base\r
+                       into grp\r
+                       orderby grp.Key\r
+                       select grp.Key + ":" + string.Join(",", from ship in grp\r
+                           orderby -ship.Level\r
+                           select ship.Level +\r
+                                  (ship.Level >= ship.Spec.Remodel.Level && ship.Spec.Remodel.Step != 0\r
+                                      ? "." + ship.Spec.Remodel.Step\r
+                                      : "")));\r
+        }\r
+        // ReSharper restore IdentifierTypo\r
 \r
         public static string GenerateItemList(IEnumerable<ItemStatus> itemList)\r
-            => "区分,装備名,改修・熟練度,個数\r\n" +\r
+            => "区分,装備名,熟練度,改修,個数\r\n" +\r
                string.Join("\r\n",\r
                    (from item in itemList\r
-                       where item.Spec.Id != -1\r
+                       where !item.Spec.Empty\r
                        orderby item.Spec.Type, item.Spec.Id, item.Alv, item.Level\r
                        group item by\r
-                           $"{item.Spec.TypeName},{item.Spec.Name},{(item.Level == 0 ? item.Alv == 0 ? 0 : item.Alv : item.Level)}"\r
+                           $"{item.Spec.TypeName},{item.Spec.Name},{item.Alv},{item.Level}"\r
                        into grp\r
                        select grp.Key + $",{grp.Count()}"));\r
 \r
@@ -43,32 +62,62 @@ namespace KancolleSniffer
         {\r
             var dict = new ItemName();\r
             var sb = new StringBuilder();\r
+            for (var f = 0; f < ShipInfo.FleetCount; f++)\r
+                sb.Append(GenerateFleetData(sniffer, f, dict));\r
+            sb.Append(GenerateBaseAirCorps(sniffer, dict));\r
+            return sb.ToString();\r
+        }\r
+\r
+        public static string GenerateFleetData(Sniffer sniffer, int fleet)\r
+        {\r
+            return GenerateFleetData(sniffer, fleet, new ItemName()).ToString();\r
+        }\r
+\r
+        private static StringBuilder GenerateFleetData(Sniffer sniffer, int fleet, ItemName dict)\r
+        {\r
+            var target = sniffer.Fleets[fleet];\r
+            var sb = new StringBuilder();\r
             var fn = new[] {"第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊"};\r
-            for (var f = 0; f < fn.Length; f++)\r
+            sb.Append(fn[fleet] + "\r\n");\r
+            sb.Append(string.Concat(from s in target.ActualShips\r
+                select ($"{s.Name} Lv{s.Level} " +\r
+                        string.Join(",",\r
+                            from item in s.AllSlot\r
+                            where !item.Empty\r
+                            select dict[item.Spec.Name] + ItemStatusString(item))).TrimEnd(' ') + "\r\n"));\r
+            var fp = target.FighterPower;\r
+            sb.Append($"制空: {(fp[0] == fp[1] ? fp[0].ToString() : fp[0] + "~" + fp[1])} " +\r
+                      $"索敵: {target.GetLineOfSights(1):F1}\r\n");\r
+            return sb;\r
+        }\r
+\r
+        private static StringBuilder GenerateBaseAirCorps(Sniffer sniffer, ItemName dict)\r
+        {\r
+            var sb = new StringBuilder();\r
+            if (sniffer.BaseAirCorps == null)\r
+                return sb;\r
+            foreach (var baseInfo in sniffer.BaseAirCorps)\r
             {\r
-                sb.Append(fn[f] + "\r\n");\r
-                foreach (var s in sniffer.GetShipStatuses(f))\r
+                sb.Append(baseInfo.AreaName + " 基地航空隊\r\n");\r
+                var i = 0;\r
+                var name = new[] {"第一 ", "第二 ", "第三 "};\r
+                foreach (var airCorps in baseInfo.AirCorps)\r
                 {\r
-                    sb.Append($"{s.Name} Lv{s.Level}");\r
-                    foreach (var item in s.Slot.Where(item => item.Id != -1))\r
-                    {\r
-                        sb.Append(" " + dict[item.Spec.Name] +\r
-                                  (item.Alv == 0 ? "" : "+" + item.Alv) +\r
-                                  (item.Level == 0 ? "" : "★" + item.Level));\r
-                    }\r
-                    if (s.SlotEx.Id > 0)\r
-                    {\r
-                        var item = s.SlotEx;\r
-                        sb.Append(" " + dict[item.Spec.Name]);\r
-                    }\r
-                    sb.Append("\r\n");\r
+                    sb.Append(name[i++]);\r
+                    sb.Append(\r
+                        string.Join(",",\r
+                            from plane in airCorps.Planes\r
+                            select plane.State == 1\r
+                                ? dict[plane.Slot.Spec.Name] + ItemStatusString(plane.Slot)\r
+                                : plane.StateName) + "\r\n");\r
                 }\r
-                var fp = sniffer.GetFighterPower(f);\r
-                sb.Append($"制空: {fp[0]}~{fp[1]} 索敵: {sniffer.GetFleetLineOfSights(f):F1}\r\n");\r
             }\r
-            return sb.ToString();\r
+            return sb;\r
         }\r
 \r
+        private static string ItemStatusString(ItemStatus item)\r
+            => (item.Alv == 0 ? "" : "+" + item.Alv) + (item.Level == 0 ? "" : "★" + item.Level);\r
+\r
         private class ItemName\r
         {\r
             private readonly Dictionary<string, string> _dict = new Dictionary<string, string>();\r
@@ -88,40 +137,41 @@ namespace KancolleSniffer
                 }\r
             }\r
 \r
-            public string this[string name]\r
-            {\r
-                get\r
-                {\r
-                    string shortName;\r
-                    return _dict.TryGetValue(name, out shortName) ? shortName : name;\r
-                }\r
-            }\r
+            public string this[string name] => _dict.TryGetValue(name, out var shortName) ? shortName : name;\r
         }\r
 \r
         public static string GenerateDeckBuilderData(Sniffer sniffer)\r
         {\r
-            var sb = new StringBuilder("{\"version\": 3,");\r
-            for (var f = 0; f < ShipInfo.FleetCount; f++)\r
+            var sb = new StringBuilder("{\"version\": 4,");\r
+            foreach (var fleet in sniffer.Fleets)\r
             {\r
-                if (f != 0)\r
+                if (fleet.Number != 0)\r
                     sb.Append(",");\r
-                sb.Append($"\"f{f + 1}\":{{");\r
-                var ships = sniffer.GetShipStatuses(f);\r
-                for (var s = 0; s < ships.Length; s++)\r
+                sb.Append($"\"f{fleet.Number + 1}\":{{");\r
+                var ships = fleet.ActualShips;\r
+                for (var s = 0; s < ships.Count; s++)\r
                 {\r
                     if (s != 0)\r
                         sb.Append(",");\r
-                    var st = ships[s];\r
-                    sb.Append($"\"s{s + 1}\":{{\"id\":\"{st.Spec.Id}\",\"lv\":{st.Level},\"luck\":{st.Lucky},\"items\":{{");\r
-                    var items = st.Slot;\r
-                    for (var i = 0; i < items.Length; i++)\r
+                    var ship = ships[s];\r
+                    sb.Append(\r
+                        $"\"s{s + 1}\":{{\"id\":\"{ship.Spec.Id}\",\"lv\":{ship.Level},\"luck\":{ship.Lucky},\"items\":{{");\r
+                    var items = ship.Slot;\r
+                    for (var i = 0; i < items.Count; i++)\r
                     {\r
-                        var it = items[i];\r
-                        if (it.Id == -1)\r
+                        var item = items[i];\r
+                        if (item.Empty)\r
                             continue;\r
                         if (i != 0)\r
                             sb.Append(",");\r
-                        sb.Append($"\"i{i + 1}\":{{\"id\":{it.Spec.Id},\"rf\":{(it.Alv != 0 ? it.Alv : it.Level)}}}");\r
+                        sb.Append($"\"i{i + 1}\":{{\"id\":{item.Spec.Id},\"rf\":{item.Level},\"mas\":{item.Alv}}}");\r
+                    }\r
+                    if (!ship.SlotEx.Unimplemented && !ship.SlotEx.Empty)\r
+                    {\r
+                        if (ship.Slot.Any(item => !item.Empty))\r
+                            sb.Append(",");\r
+                        var name = ship.Spec.SlotNum == 5 ? "ix" : $"i{ship.Spec.SlotNum + 1}";\r
+                        sb.Append($"\"{name}\":{{\"id\":{ship.SlotEx.Spec.Id},\"rf\":{ship.SlotEx.Level}}}");\r
                     }\r
                     sb.Append("}}");\r
                 }\r