1 // Copyright (C) 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>
\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
7 // http://www.apache.org/licenses/LICENSE-2.0
\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
15 using System.Collections.Generic;
\r
18 using System.Net.Sockets;
\r
20 using KancolleSniffer.Model;
\r
22 namespace KancolleSniffer
\r
24 public static class TextGenerator
\r
26 public static string GenerateShipList(IEnumerable<ShipStatus> shipList)
\r
27 => "ID,艦種,艦名,レベル,ExpToNext,cond,素対潜\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
33 public static string GenerateKantaiSarashiData(IEnumerable<ShipStatus> shipList)
\r
36 string.Join("|", from ship in shipList
\r
38 group ship by ship.Spec.Remodel.Base
\r
41 select grp.Key + ":" + string.Join(",", from ship in grp
\r
44 (ship.Level >= ship.Spec.Remodel.Level && ship.Spec.Remodel.Step != 0
\r
45 ? "." + ship.Spec.Remodel.Step
\r
49 public static string GenerateItemList(IEnumerable<ItemStatus> itemList)
\r
50 => "区分,装備名,熟練度,改修,個数\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
56 $"{item.Spec.TypeName},{item.Spec.Name},{item.Alv},{item.Level}"
\r
58 select grp.Key + $",{grp.Count()}"));
\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
65 public static string GenerateFleetData(Sniffer sniffer)
\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
75 public static string GenerateFleetData(Sniffer sniffer, int fleet)
\r
77 return GenerateFleetData(sniffer, fleet, new ItemName()).ToString();
\r
80 private static StringBuilder GenerateFleetData(Sniffer sniffer, int fleet, ItemName dict)
\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
89 from item in s.AllSlot
\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
97 private static StringBuilder GenerateAirBase(Sniffer sniffer, ItemName dict)
\r
99 var sb = new StringBuilder();
\r
100 if (sniffer.AirBase == null)
\r
102 foreach (var baseInfo in sniffer.AirBase)
\r
104 sb.Append(baseInfo.AreaName + " 基地航空隊\r\n");
\r
106 var name = new[] {"第一 ", "第二 ", "第三 "};
\r
107 foreach (var airCorps in baseInfo.AirCorps)
\r
109 sb.Append(name[i++]);
\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
121 private static string ItemStatusString(ItemStatus item)
\r
122 => (item.Alv == 0 ? "" : "+" + item.Alv) + (item.Level == 0 ? "" : "★" + item.Level);
\r
124 private class ItemName
\r
126 private readonly Dictionary<string, string> _dict = new Dictionary<string, string>();
\r
132 foreach (var line in File.ReadLines("ItemName.csv"))
\r
134 var cols = line.Split(',');
\r
135 _dict[cols[0]] = cols[1];
\r
138 catch (IOException)
\r
143 public string this[string name] => _dict.TryGetValue(name, out var shortName) ? shortName : name;
\r
146 public static string GenerateDeckBuilderData(Sniffer sniffer)
\r
148 var sb = new StringBuilder("{\"version\": 4,");
\r
149 foreach (var fleet in sniffer.Fleets)
\r
151 if (fleet.Number != 0)
\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
159 var ship = ships[s];
\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
165 var item = items[i];
\r
170 sb.Append($"\"i{i + 1}\":{{\"id\":{item.Spec.Id},\"rf\":{item.Level},\"mas\":{item.Alv}}}");
\r
172 if (!ship.SlotEx.Unimplemented && !ship.SlotEx.Empty)
\r
174 if (ship.Slot.Any(item => !item.Empty))
\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
184 return sb.ToString();
\r