OSDN Git Service

資材グラフの描画を高速化する
[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.Text;\r
19 \r
20 namespace KancolleSniffer\r
21 {\r
22     public static class TextGenerator\r
23     {\r
24         public static string GenerateShipList(IEnumerable<ShipStatus> shipList)\r
25             => "ID,艦種,艦名,レベル,cond\r\n" +\r
26                string.Join("\r\n",\r
27                    from ship in shipList\r
28                    orderby ship.Spec.ShipType, -ship.Level, ship.ExpToNext\r
29                    select $"{ship.Id},{ship.Spec.ShipTypeName},{ship.Name},{ship.Level},{ship.Cond}");\r
30 \r
31         public static string GenerateKantaiSarashiData(IEnumerable<ShipStatus> shipList)\r
32         {\r
33             return ".2|" +\r
34                    string.Join("|", from ship in shipList\r
35                        where ship.Locked\r
36                        group ship by ship.Spec.Remodel.Base\r
37                        into grp\r
38                        orderby grp.Key\r
39                        select grp.Key + ":" + string.Join(",", from ship in grp\r
40                            orderby -ship.Level\r
41                            select ship.Level +\r
42                                   (ship.Level >= ship.Spec.Remodel.Level && ship.Spec.Remodel.Step != 0\r
43                                       ? "." + ship.Spec.Remodel.Step\r
44                                       : "")));\r
45         }\r
46 \r
47         public static string GenerateItemList(IEnumerable<ItemStatus> itemList)\r
48             => "区分,装備名,熟練度,改修,個数\r\n" +\r
49                string.Join("\r\n",\r
50                    (from item in itemList\r
51                        where item.Spec.Id != -1\r
52                        orderby item.Spec.Type, item.Spec.Id, item.Alv, item.Level\r
53                        group item by\r
54                            $"{item.Spec.TypeName},{item.Spec.Name},{item.Alv},{item.Level}"\r
55                        into grp\r
56                        select grp.Key + $",{grp.Count()}"));\r
57 \r
58         public static string GenerateFleetData(Sniffer sniffer)\r
59         {\r
60             var dict = new ItemName();\r
61             var sb = new StringBuilder();\r
62             var fn = new[] {"第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊"};\r
63             for (var f = 0; f < fn.Length; f++)\r
64             {\r
65                 sb.Append(fn[f] + "\r\n");\r
66                 sb.Append(string.Concat(from s in sniffer.GetShipStatuses(f)\r
67                     select ($"{s.Name} Lv{s.Level} " +\r
68                             string.Join(",",\r
69                                 from item in s.AllSlot\r
70                                 where item.Id != -1\r
71                                 select dict[item.Spec.Name] + ItemStatusString(item))).TrimEnd(' ') + "\r\n"));\r
72                 var fp = sniffer.GetFighterPower(f);\r
73                 sb.Append($"制空: {(fp[0] == fp[1] ? fp[0].ToString() : fp[0] + "~" + fp[1])} " +\r
74                           $"索敵: {sniffer.GetFleetLineOfSights(f, 1):F1}\r\n");\r
75             }\r
76             if (sniffer.BaseAirCorps != null)\r
77             {\r
78                 foreach (var baseInfo in sniffer.BaseAirCorps)\r
79                 {\r
80                     sb.Append(baseInfo.AreaName + " 基地航空隊\r\n");\r
81                     var i = 0;\r
82                     var name = new[] {"第一 ", "第二 ", "第三 "};\r
83                     foreach (var airCorps in baseInfo.AirCorps)\r
84                     {\r
85                         sb.Append(name[i++]);\r
86                         sb.Append(\r
87                             string.Join(",",\r
88                                 from plane in airCorps.Planes\r
89                                 select plane.State == 1\r
90                                     ? dict[plane.Slot.Spec.Name] + ItemStatusString(plane.Slot)\r
91                                     : plane.StateName) + "\r\n");\r
92                     }\r
93                 }\r
94             }\r
95             return sb.ToString();\r
96         }\r
97 \r
98         private static string ItemStatusString(ItemStatus item)\r
99             => (item.Alv == 0 ? "" : "+" + item.Alv) + (item.Level == 0 ? "" : "★" + item.Level);\r
100 \r
101         private class ItemName\r
102         {\r
103             private readonly Dictionary<string, string> _dict = new Dictionary<string, string>();\r
104 \r
105             public ItemName()\r
106             {\r
107                 try\r
108                 {\r
109                     foreach (var line in File.ReadLines("ItemName.csv"))\r
110                     {\r
111                         var cols = line.Split(',');\r
112                         _dict[cols[0]] = cols[1];\r
113                     }\r
114                 }\r
115                 catch (IOException)\r
116                 {\r
117                 }\r
118             }\r
119 \r
120             public string this[string name]\r
121             {\r
122                 get\r
123                 {\r
124                     string shortName;\r
125                     return _dict.TryGetValue(name, out shortName) ? shortName : name;\r
126                 }\r
127             }\r
128         }\r
129 \r
130         public static string GenerateDeckBuilderData(Sniffer sniffer)\r
131         {\r
132             var sb = new StringBuilder("{\"version\": 4,");\r
133             for (var f = 0; f < ShipInfo.FleetCount; f++)\r
134             {\r
135                 if (f != 0)\r
136                     sb.Append(",");\r
137                 sb.Append($"\"f{f + 1}\":{{");\r
138                 var ships = sniffer.GetShipStatuses(f);\r
139                 for (var s = 0; s < ships.Length; s++)\r
140                 {\r
141                     if (s != 0)\r
142                         sb.Append(",");\r
143                     var ship = ships[s];\r
144                     sb.Append(\r
145                         $"\"s{s + 1}\":{{\"id\":\"{ship.Spec.Id}\",\"lv\":{ship.Level},\"luck\":{ship.Lucky},\"items\":{{");\r
146                     var items = ship.Slot;\r
147                     for (var i = 0; i < items.Length; i++)\r
148                     {\r
149                         var item = items[i];\r
150                         if (item.Id == -1)\r
151                             continue;\r
152                         if (i != 0)\r
153                             sb.Append(",");\r
154                         sb.Append($"\"i{i + 1}\":{{\"id\":{item.Spec.Id},\"rf\":{item.Level},\"mas\":{item.Alv}}}");\r
155                     }\r
156                     if (ship.SlotEx.Id != 0 && ship.SlotEx.Id != -1)\r
157                     {\r
158                         if (ship.Slot.Any(item => item.Id != -1))\r
159                             sb.Append(",");\r
160                         var name = ship.Spec.SlotNum == 4 ? "ix" : $"i{ship.Spec.SlotNum + 1}";\r
161                         sb.Append($"\"{name}\":{{\"id\":{ship.SlotEx.Spec.Id},\"rf\":{ship.SlotEx.Level}}}");\r
162                     }\r
163                     sb.Append("}}");\r
164                 }\r
165                 sb.Append("}");\r
166             }\r
167             sb.Append("}");\r
168             return sb.ToString();\r
169         }\r
170     }\r
171 }