OSDN Git Service

questlistがすべての任務を返す仕様変更に対応する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / TextGenerator.cs
1 // Copyright (C) 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 //\r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System.Collections.Generic;\r
16 using System.IO;\r
17 using System.Linq;\r
18 using System.Net.Sockets;\r
19 using System.Text;\r
20 using KancolleSniffer.Model;\r
21 \r
22 namespace KancolleSniffer\r
23 {\r
24     public static class TextGenerator\r
25     {\r
26         public static string GenerateShipList(IEnumerable<ShipStatus> shipList)\r
27             => "ID,艦種,艦名,レベル,ExpToNext,cond,素対潜\r\n" +\r
28                string.Join("\r\n",\r
29                    from ship in shipList\r
30                    orderby ship.Spec.ShipType, -ship.Level, ship.ExpToNext\r
31                    select $"{ship.Id},{ship.Spec.ShipTypeName},{ship.Name},{ship.Level},{ship.ExpToNext},{ship.Cond},{ship.ShipAntiSubmarine}");\r
32 \r
33         public static string GenerateKantaiSarashiData(IEnumerable<ShipStatus> shipList)\r
34         {\r
35             return ".2|" +\r
36                    string.Join("|", from ship in shipList\r
37                        where ship.Locked\r
38                        group ship by ship.Spec.Remodel.Base\r
39                        into grp\r
40                        orderby grp.Key\r
41                        select grp.Key + ":" + string.Join(",", from ship in grp\r
42                            orderby -ship.Level\r
43                            select ship.Level +\r
44                                   (ship.Level >= ship.Spec.Remodel.Level && ship.Spec.Remodel.Step != 0\r
45                                       ? "." + ship.Spec.Remodel.Step\r
46                                       : "")));\r
47         }\r
48 \r
49         public static string GenerateItemList(IEnumerable<ItemStatus> itemList)\r
50             => "区分,装備名,熟練度,改修,個数\r\n" +\r
51                string.Join("\r\n",\r
52                    (from item in itemList\r
53                        where !item.Spec.Empty\r
54                        orderby item.Spec.Type, item.Spec.Id, item.Alv, item.Level\r
55                        group item by\r
56                            $"{item.Spec.TypeName},{item.Spec.Name},{item.Alv},{item.Level}"\r
57                        into grp\r
58                        select grp.Key + $",{grp.Count()}"));\r
59 \r
60         public static string GenerateKantaiBunsekiItemList(IEnumerable<ItemStatus> itemList)\r
61             => "[" + string.Join(",",\r
62                    (from item in itemList where item.Locked\r
63                        select $"{{\"api_slotitem_id\":{item.Spec.Id},\"api_level\":{item.Level}}}")) + "]";\r
64 \r
65         public static string GenerateFleetData(Sniffer sniffer)\r
66         {\r
67             var dict = new ItemName();\r
68             var sb = new StringBuilder();\r
69             for (var f = 0; f < ShipInfo.FleetCount; f++)\r
70                 sb.Append(GenerateFleetData(sniffer, f, dict));\r
71             sb.Append(GenerateAirBase(sniffer, dict));\r
72             return sb.ToString();\r
73         }\r
74 \r
75         public static string GenerateFleetData(Sniffer sniffer, int fleet)\r
76         {\r
77             return GenerateFleetData(sniffer, fleet, new ItemName()).ToString();\r
78         }\r
79 \r
80         private static StringBuilder GenerateFleetData(Sniffer sniffer, int fleet, ItemName dict)\r
81         {\r
82             var target = sniffer.Fleets[fleet];\r
83             var sb = new StringBuilder();\r
84             var fn = new[] {"第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊"};\r
85             sb.Append(fn[fleet] + "\r\n");\r
86             sb.Append(string.Concat(from s in target.ActualShips\r
87                 select ($"{s.Name} Lv{s.Level} " +\r
88                         string.Join(",",\r
89                             from item in s.AllSlot\r
90                             where !item.Empty\r
91                             select dict[item.Spec.Name] + ItemStatusString(item))).TrimEnd(' ') + "\r\n"));\r
92             var fp = target.FighterPower;\r
93             sb.Append($"制空: {(fp.Diff ? fp.RangeString : fp.Min.ToString())} 索敵: {target.GetLineOfSights(1):F1}\r\n");\r
94             return sb;\r
95         }\r
96 \r
97         private static StringBuilder GenerateAirBase(Sniffer sniffer, ItemName dict)\r
98         {\r
99             var sb = new StringBuilder();\r
100             if (sniffer.AirBase == null)\r
101                 return sb;\r
102             foreach (var baseInfo in sniffer.AirBase)\r
103             {\r
104                 sb.Append(baseInfo.AreaName + " 基地航空隊\r\n");\r
105                 var i = 0;\r
106                 var name = new[] {"第一 ", "第二 ", "第三 "};\r
107                 foreach (var airCorps in baseInfo.AirCorps)\r
108                 {\r
109                     sb.Append(name[i++]);\r
110                     sb.Append(\r
111                         string.Join(",",\r
112                             from plane in airCorps.Planes\r
113                             select plane.State == 1\r
114                                 ? dict[plane.Slot.Spec.Name] + ItemStatusString(plane.Slot)\r
115                                 : plane.StateName) + "\r\n");\r
116                 }\r
117             }\r
118             return sb;\r
119         }\r
120 \r
121         private static string ItemStatusString(ItemStatus item)\r
122             => (item.Alv == 0 ? "" : "+" + item.Alv) + (item.Level == 0 ? "" : "★" + item.Level);\r
123 \r
124         private class ItemName\r
125         {\r
126             private readonly Dictionary<string, string> _dict = new Dictionary<string, string>();\r
127 \r
128             public ItemName()\r
129             {\r
130                 try\r
131                 {\r
132                     foreach (var line in File.ReadLines("ItemName.csv"))\r
133                     {\r
134                         var cols = line.Split(',');\r
135                         _dict[cols[0]] = cols[1];\r
136                     }\r
137                 }\r
138                 catch (IOException)\r
139                 {\r
140                 }\r
141             }\r
142 \r
143             public string this[string name] => _dict.TryGetValue(name, out var shortName) ? shortName : name;\r
144         }\r
145 \r
146         public static string GenerateDeckBuilderData(Sniffer sniffer)\r
147         {\r
148             var sb = new StringBuilder("{\"version\": 4,");\r
149             foreach (var fleet in sniffer.Fleets)\r
150             {\r
151                 if (fleet.Number != 0)\r
152                     sb.Append(",");\r
153                 sb.Append($"\"f{fleet.Number + 1}\":{{");\r
154                 var ships = fleet.ActualShips;\r
155                 for (var s = 0; s < ships.Count; s++)\r
156                 {\r
157                     if (s != 0)\r
158                         sb.Append(",");\r
159                     var ship = ships[s];\r
160                     sb.Append(\r
161                         $"\"s{s + 1}\":{{\"id\":\"{ship.Spec.Id}\",\"lv\":{ship.Level},\"luck\":{ship.Lucky},\"items\":{{");\r
162                     var items = ship.Slot;\r
163                     for (var i = 0; i < items.Count; i++)\r
164                     {\r
165                         var item = items[i];\r
166                         if (item.Empty)\r
167                             continue;\r
168                         if (i != 0)\r
169                             sb.Append(",");\r
170                         sb.Append($"\"i{i + 1}\":{{\"id\":{item.Spec.Id},\"rf\":{item.Level},\"mas\":{item.Alv}}}");\r
171                     }\r
172                     if (!ship.SlotEx.Unimplemented && !ship.SlotEx.Empty)\r
173                     {\r
174                         if (ship.Slot.Any(item => !item.Empty))\r
175                             sb.Append(",");\r
176                         var name = ship.Spec.SlotNum == 5 ? "ix" : $"i{ship.Spec.SlotNum + 1}";\r
177                         sb.Append($"\"{name}\":{{\"id\":{ship.SlotEx.Spec.Id},\"rf\":{ship.SlotEx.Level}}}");\r
178                     }\r
179                     sb.Append("}}");\r
180                 }\r
181                 sb.Append("}");\r
182             }\r
183             sb.Append("}");\r
184             return sb.ToString();\r
185         }\r
186     }\r
187 }