OSDN Git Service

現時点で実装されているすべての敵の制空値を計算できるようにする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / ShipMaster.cs
1 // Copyright (C) 2014, 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 \r
17 namespace KancolleSniffer\r
18 {\r
19     public class ShipMaster\r
20     {\r
21         public const int NumSlots = 5;\r
22         private readonly Dictionary<int, ShipSpec> _shipSpecs = new Dictionary<int, ShipSpec>();\r
23 \r
24         public void Inspect(dynamic json)\r
25         {\r
26             var dict = new Dictionary<double, string>();\r
27             foreach (var entry in json.api_mst_stype)\r
28                 dict[entry.api_id] = entry.api_name;\r
29             dict[8] = "高速戦艦";\r
30             foreach (var entry in json.api_mst_ship)\r
31             {\r
32                 var shipSpec = _shipSpecs[(int)entry.api_id] = new ShipSpec\r
33                 {\r
34                     Id = (int)entry.api_id,\r
35                     SortNo = entry.api_sortno() ? (int)entry.api_sortno : 0,\r
36                     Name = ShipName(entry),\r
37                     FuelMax = entry.api_fuel_max() ? (int)entry.api_fuel_max : 0,\r
38                     BullMax = entry.api_bull_max() ? (int)entry.api_bull_max : 0,\r
39                     ShipType = (int)entry.api_stype,\r
40                     ShipTypeName = dict[entry.api_stype]\r
41                 };\r
42                 if (entry.api_afterlv())\r
43                 {\r
44                     shipSpec.Remodel.Level = (int)entry.api_afterlv;\r
45                     shipSpec.Remodel.After = int.Parse(entry.api_aftershipid);\r
46                 }\r
47                 int[] maxEq;\r
48                 shipSpec.MaxEq = entry.api_maxeq()\r
49                     ? entry.api_maxeq\r
50                     : MissingData.MaxEq.TryGetValue(shipSpec.Id, out maxEq) ? maxEq : null;\r
51             }\r
52             _shipSpecs[-1] = new ShipSpec();\r
53             SetRemodelBaseAndStep();\r
54         }\r
55 \r
56         // 深海棲艦の名前にelite/flagshipを付ける\r
57         private string ShipName(dynamic json)\r
58         {\r
59             var name = json.api_name;\r
60             var flagship = json.api_yomi;\r
61             if ((int)json.api_id <= 500 || flagship == "-" || flagship == "")\r
62                 return name;\r
63             return name + "(" + flagship + ")";\r
64         }\r
65 \r
66         public ShipSpec this[int id] => _shipSpecs[id];\r
67 \r
68         private void SetRemodelBaseAndStep()\r
69         {\r
70             // 改造後のデータをマーク\r
71             foreach (var spec in _shipSpecs.Values)\r
72             {\r
73                 if (spec.Remodel.After == 0)\r
74                     continue;\r
75                 _shipSpecs[spec.Remodel.After].Remodel.Base = 1;\r
76             }\r
77             foreach (var spec in _shipSpecs.Values)\r
78             {\r
79                 if (spec.Remodel.Base != 0)\r
80                     continue;\r
81                 var step = 0;\r
82                 var hash = new HashSet<int> {spec.Id};\r
83                 var s = spec;\r
84                 s.Remodel.Base = spec.Id;\r
85                 while (s.Remodel.After != 0)\r
86                 {\r
87                     s.Remodel.Step = ++step;\r
88                     if (!hash.Add(s.Remodel.After))\r
89                         break;\r
90                     s = _shipSpecs[s.Remodel.After];\r
91                     s.Remodel.Base = spec.Id;\r
92                 }\r
93             }\r
94         }\r
95     }\r
96 \r
97     public class ShipSpec\r
98     {\r
99         public int Id { get; set; }\r
100         public int SortNo { get; set; }\r
101         public string Name { get; set; }\r
102         public int FuelMax { get; set; }\r
103         public int BullMax { get; set; }\r
104         public int[] MaxEq { get; set; }\r
105         public int ShipType { get; set; }\r
106         public string ShipTypeName { get; set; }\r
107         public RemodelInfo Remodel { get; } = new RemodelInfo();\r
108 \r
109         public class RemodelInfo\r
110         {\r
111             public int Level { get; set; }\r
112             public int After { get; set; }\r
113             public int Base { get; set; } // 艦隊晒しページ用\r
114             public int Step { get; set; } // 同上\r
115         }\r
116 \r
117         public ShipSpec()\r
118         {\r
119             Id = -1;\r
120             Name = "";\r
121             MaxEq = new int[0];\r
122         }\r
123 \r
124         public double RepairWeight\r
125         {\r
126             get\r
127             {\r
128                 switch (ShipType)\r
129                 {\r
130                     case 13: // 潜水艦\r
131                         return 0.5;\r
132                     case 2: // 駆逐艦\r
133                     case 3: // 軽巡洋艦\r
134                     case 4: // 重雷装巡洋艦\r
135                     case 14: // 潜水空母\r
136                     case 16: // 水上機母艦\r
137                     case 17: // 揚陸艦\r
138                     case 21: // 練習巡洋艦\r
139                         return 1.0;\r
140                     case 5: // 重巡洋艦\r
141                     case 6: // 航空巡洋艦\r
142                     case 7: // 軽空母\r
143                     case 8: // 高速戦艦\r
144                     case 20: // 潜水母艦\r
145                         return 1.5;\r
146                     case 9: // 低速戦艦\r
147                     case 10: // 航空戦艦\r
148                     case 11: // 正規空母\r
149                     case 18: // 装甲空母\r
150                     case 19: // 工作艦\r
151                         return 2.0;\r
152                 }\r
153                 return 1.0;\r
154             }\r
155         }\r
156 \r
157         public double TransportPoint\r
158         {\r
159             get\r
160             {\r
161                 switch (ShipType)\r
162                 {\r
163                     case 2:\r
164                         return 5.0;\r
165                     case 3:\r
166                         return Id == 487 ? 10.0 : 2.0; // 鬼怒改二は大発分を加算\r
167                     case 6:\r
168                         return 4.0;\r
169                     case 10:\r
170                         return 7.0;\r
171                     case 15:\r
172                         return 15.0;\r
173                     case 16:\r
174                         return 9.0;\r
175                     case 17:\r
176                         return 12.0;\r
177                     case 20:\r
178                         return 7.0;\r
179                     case 21:\r
180                         return 6.0;\r
181                     default:\r
182                         return 0;\r
183                 }\r
184             }\r
185         }\r
186 \r
187         public bool IsSubmarine => ShipType == 13 || ShipType == 14;\r
188 \r
189         public bool IsAircraftCarrier => ShipType == 7 || ShipType == 11 || ShipType == 18;\r
190 \r
191         public bool IsAntiSubmarine\r
192         {\r
193             get\r
194             {\r
195                 switch (ShipType)\r
196                 {\r
197                     case 2: // 駆逐\r
198                     case 3: // 軽巡\r
199                     case 4: // 雷巡\r
200                     case 6: // 航巡\r
201                     case 7: // 軽空\r
202                     case 10: // 航戦\r
203                     case 16: // 水母\r
204                     case 17: // 揚陸艦\r
205                     case 21: // 練巡\r
206                     case 22: // 補給艦\r
207                         return true;\r
208                 }\r
209                 return false;\r
210             }\r
211         }\r
212 \r
213         public bool IsRepairShip => ShipType == 19;\r
214     }\r
215 }