OSDN Git Service

bb2dcc30eb44721310334e602aa50fc02765cebe
[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,艦種,艦名,レベル\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}");\r
30 \r
31         public static string GenerateItemList(IEnumerable<ItemStatus> itemList)\r
32             => "区分,装備名,改修・熟練度,個数\r\n" +\r
33                string.Join("\r\n",\r
34                    (from item in itemList\r
35                        where item.Spec.Id != -1\r
36                        orderby item.Spec.Type, item.Spec.Id, item.Alv, item.Level\r
37                        group item by\r
38                            $"{item.Spec.TypeName},{item.Spec.Name},{(item.Level == 0 ? item.Alv == 0 ? 0 : item.Alv : item.Level)}"\r
39                        into grp\r
40                        select grp.Key + $",{grp.Count()}"));\r
41 \r
42         public static string GenerateFleetData(Sniffer sniffer)\r
43         {\r
44             var dict = new ItemName();\r
45             var sb = new StringBuilder();\r
46             var fn = new[] {"第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊"};\r
47             for (var f = 0; f < fn.Length; f++)\r
48             {\r
49                 sb.Append(fn[f] + "\r\n");\r
50                 foreach (var s in sniffer.GetShipStatuses(f))\r
51                 {\r
52                     sb.Append($"{s.Name} Lv{s.Level}");\r
53                     foreach (var item in s.Slot.Where(item => item.Id != -1))\r
54                     {\r
55                         sb.Append(" " + dict[item.Spec.Name] +\r
56                                   (item.Alv == 0 ? "" : "+" + item.Alv) +\r
57                                   (item.Level == 0 ? "" : "★" + item.Level));\r
58                     }\r
59                     if (s.SlotEx.Id > 0)\r
60                     {\r
61                         var item = s.SlotEx;\r
62                         sb.Append(" " + dict[item.Spec.Name]);\r
63                     }\r
64                     sb.Append("\r\n");\r
65                 }\r
66                 var fp = sniffer.GetFighterPower(f);\r
67                 sb.Append($"制空: {fp[0]}~{fp[1]} 索敵: {sniffer.GetFleetLineOfSights(f):F1}\r\n");\r
68             }\r
69             return sb.ToString();\r
70         }\r
71 \r
72         private class ItemName\r
73         {\r
74             private readonly Dictionary<string, string> _dict = new Dictionary<string, string>();\r
75 \r
76             public ItemName()\r
77             {\r
78                 try\r
79                 {\r
80                     foreach (var line in File.ReadLines("ItemName.csv"))\r
81                     {\r
82                         var cols = line.Split(',');\r
83                         _dict[cols[0]] = cols[1];\r
84                     }\r
85                 }\r
86                 catch (IOException)\r
87                 {\r
88                 }\r
89             }\r
90 \r
91             public string this[string name]\r
92             {\r
93                 get\r
94                 {\r
95                     string shortName;\r
96                     return _dict.TryGetValue(name, out shortName) ? shortName : name;\r
97                 }\r
98             }\r
99         }\r
100 \r
101         public static string GenerateDeckBuilderData(Sniffer sniffer)\r
102         {\r
103             var sb = new StringBuilder("{\"version\": 3,");\r
104             for (var f = 0; f < ShipInfo.FleetCount; f++)\r
105             {\r
106                 if (f != 0)\r
107                     sb.Append(",");\r
108                 sb.Append($"\"f{f + 1}\":{{");\r
109                 var ships = sniffer.GetShipStatuses(f);\r
110                 for (var s = 0; s < ships.Length; s++)\r
111                 {\r
112                     if (s != 0)\r
113                         sb.Append(",");\r
114                     var st = ships[s];\r
115                     sb.Append($"\"s{s + 1}\":{{\"id\":\"{st.Spec.Id}\",\"lv\":{st.Level},\"luck\":{st.Lucky},\"items\":{{");\r
116                     var items = st.Slot;\r
117                     for (var i = 0; i < items.Length; i++)\r
118                     {\r
119                         var it = items[i];\r
120                         if (it.Id == -1)\r
121                             continue;\r
122                         if (i != 0)\r
123                             sb.Append(",");\r
124                         sb.Append($"\"i{i + 1}\":{{\"id\":{it.Spec.Id},\"rf\":{(it.Alv != 0 ? it.Alv : it.Level)}}}");\r
125                     }\r
126                     sb.Append("}}");\r
127                 }\r
128                 sb.Append("}");\r
129             }\r
130             sb.Append("}");\r
131             return sb.ToString();\r
132         }\r
133     }\r
134 }