1 // Copyright (C) 2013, 2014, 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>
\r
3 // This program is part of KancolleSniffer.
\r
5 // KancolleSniffer is free software: you can redistribute it and/or modify
\r
6 // it under the terms of the GNU General Public License as published by
\r
7 // the Free Software Foundation, either version 3 of the License, or
\r
8 // (at your option) any later version.
\r
10 // This program is distributed in the hope that it will be useful,
\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 // GNU General Public License for more details.
\r
15 // You should have received a copy of the GNU General Public License
\r
16 // along with this program; if not, see <http://www.gnu.org/licenses/>.
\r
18 using System.Collections.Generic;
\r
19 using System.Drawing;
\r
23 namespace KancolleSniffer
\r
25 public class ItemSpec
\r
30 public string TypeName;
\r
31 public int IconType;
\r
34 public int AntiSubmarine;
\r
44 public bool CanAirCombat
\r
60 // http://ch.nicovideo.jp/biikame/blomaga/ar663428
\r
61 public double LoSScaleFactor()
\r
85 public bool IsAircraft
\r
105 public bool IsSonar => Type == 14 || // ソナー
\r
106 Type == 40; // 大型ソナー
\r
108 public bool IsDepthCharge => Type == 15;
\r
110 public bool IsReconSeaplane => Type == 10;
\r
122 return Color.FromArgb(209, 89, 89);
\r
124 return Color.FromArgb(253, 233, 0);
\r
126 return Color.FromArgb(88, 134, 170);
\r
128 return Color.FromArgb(93, 179, 108);
\r
130 return Color.FromArgb(223, 102, 102);
\r
132 return Color.FromArgb(95, 173, 234);
\r
134 return Color.FromArgb(254, 191, 0);
\r
136 return Color.FromArgb(142, 203, 152);
\r
138 return Color.FromArgb(231, 153, 53);
\r
140 return Color.FromArgb(69, 175, 88);
\r
142 return Color.FromArgb(254, 254, 254);
\r
145 return Color.FromArgb(102, 204, 118);
\r
148 return Color.FromArgb(126, 203, 215);
\r
150 return Color.FromArgb(254, 195, 77);
\r
152 return Color.FromArgb(154, 163, 90);
\r
153 case 21: // オートジャイロ
\r
154 return Color.FromArgb(99, 203, 115);
\r
156 return Color.FromArgb(125, 205, 217);
\r
158 return Color.FromArgb(152, 124, 172);
\r
161 return Color.FromArgb(254, 155, 0);
\r
163 return Color.FromArgb(161, 161, 160);
\r
165 return Color.FromArgb(175, 156, 126);
\r
167 return Color.FromArgb(204, 172, 252);
\r
169 return Color.FromArgb(206, 166, 108);
\r
171 return Color.FromArgb(137, 153, 77);
\r
173 return Color.FromArgb(253, 49, 49);
\r
175 return Color.FromArgb(188, 238, 155);
\r
177 return Color.FromArgb(142, 203, 152);
\r
179 return Color.FromArgb(254, 254, 254);
\r
181 return SystemColors.Control;
\r
187 public class ItemStatus
\r
189 public ItemSpec Spec { get; set; }
\r
190 public int Level { get; set; }
\r
191 public int Alv { get; set; }
\r
192 public ShipStatus Ship { get; set; }
\r
194 public ItemStatus()
\r
196 Spec = new ItemSpec();
\r
197 Ship = new ShipStatus();
\r
201 public class ItemInfo
\r
203 private int _nowShips, _nowEquips;
\r
204 private readonly Dictionary<int, ItemSpec> _itemSpecs = new Dictionary<int, ItemSpec>();
\r
205 private readonly Dictionary<int, ItemStatus> _itemInfo = new Dictionary<int, ItemStatus>();
\r
206 private readonly Dictionary<int, string> _useItemName = new Dictionary<int, string>();
\r
208 public int MaxShips { get; private set; }
\r
209 public int MarginShips { get; set; }
\r
210 public bool RingShips { get; set; }
\r
211 public int MaxEquips { get; private set; }
\r
212 public int MarginEquips { get; set; }
\r
213 public bool RingEquips { get; set; }
\r
215 public int NowShips
\r
217 get { return _nowShips; }
\r
222 var limit = MaxShips - MarginShips;
\r
223 RingShips = _nowShips < limit && value >= limit;
\r
229 public bool TooManyShips => MaxShips != 0 && NowShips >= MaxShips - MarginShips;
\r
231 public int NowEquips
\r
233 get { return _nowEquips; }
\r
236 if (MaxEquips != 0)
\r
238 var limit = MaxEquips - MarginEquips;
\r
239 RingEquips = _nowEquips < limit && value >= limit;
\r
241 _nowEquips = value;
\r
245 public bool TooManyEquips => MaxEquips != 0 && NowEquips >= MaxEquips - MarginEquips;
\r
253 public void InspectBasic(dynamic json)
\r
255 MaxShips = (int)json.api_max_chara;
\r
256 MaxEquips = (int)json.api_max_slotitem;
\r
259 public void InspectMaster(dynamic json)
\r
261 var dict = new Dictionary<int, string>();
\r
262 foreach (var entry in json.api_mst_slotitem_equiptype)
\r
263 dict[(int)entry.api_id] = entry.api_name;
\r
264 foreach (var entry in json.api_mst_slotitem)
\r
266 _itemSpecs[(int)entry.api_id] = new ItemSpec
\r
268 Id = (int)entry.api_id,
\r
269 Name = (string)entry.api_name,
\r
270 Type = (int)entry.api_type[2],
\r
271 TypeName = dict[(int)entry.api_type[2]],
\r
272 IconType = (int)entry.api_type[3],
\r
273 AntiAir = (int)entry.api_tyku,
\r
274 LoS = (int)entry.api_saku,
\r
275 AntiSubmarine = (int)entry.api_tais,
\r
276 Torpedo = (int)entry.api_raig,
\r
277 Bomber = (int)entry.api_baku
\r
280 _itemSpecs[-1] = new ItemSpec();
\r
281 foreach (var entry in json.api_mst_useitem)
\r
282 _useItemName[(int)entry.api_id] = entry.api_name;
\r
285 public void InspectSlotItem(dynamic json, bool full = false)
\r
288 json = new[] {json};
\r
292 _itemInfo[-1] = new ItemStatus();
\r
294 foreach (var entry in json)
\r
296 _itemInfo[(int)entry.api_id] = new ItemStatus
\r
298 Spec = _itemSpecs[(int)entry.api_slotitem_id],
\r
299 Level = entry.api_level() ? (int)entry.api_level : 0,
\r
300 Alv = entry.api_alv() ? (int)entry.api_alv : 0
\r
303 NowEquips = _itemInfo.Count - 1;
\r
306 public void InspectCreateItem(dynamic json)
\r
308 if (!json.IsDefined("api_slot_item"))
\r
310 InspectSlotItem(json.api_slot_item);
\r
313 public void InspectGetShip(dynamic json)
\r
316 if (json.api_slotitem == null) // まるゆにはスロットがない
\r
318 InspectSlotItem(json.api_slotitem);
\r
321 public void InspectDestroyItem(string request, dynamic json)
\r
323 var values = HttpUtility.ParseQueryString(request);
\r
324 DeleteItems(values["api_slotitem_ids"].Split(',').Select(int.Parse).ToArray());
\r
327 public void InspectRemodelSlot(dynamic json)
\r
329 if (json.api_after_slot())
\r
330 InspectSlotItem(json.api_after_slot);
\r
331 if (!json.api_use_slot_id())
\r
333 DeleteItems(((int[])json.api_use_slot_id));
\r
336 public void DeleteItems(int[] ids)
\r
338 foreach (var id in ids.Where(id => id != -1))
\r
340 _itemInfo.Remove(id);
\r
345 public void CountNewItems(int[] ids)
\r
347 foreach (var id in ids.Where(id => id != -1 && !_itemInfo.ContainsKey(id)))
\r
349 _itemInfo[id] = new ItemStatus();
\r
354 public ItemSpec this[int id] => GetSpecById(id);
\r
356 public ItemSpec GetSpecById(int id) => _itemInfo[id].Spec;
\r
358 public ItemSpec GetSpecByItemId(int id) => _itemSpecs[id];
\r
360 public Dictionary<int, ItemStatus> ItemDict => _itemInfo;
\r
362 public void SetItemOwner(ShipStatus[] shipList)
\r
364 foreach (var e in _itemInfo)
\r
365 e.Value.Ship = new ShipStatus();
\r
366 foreach (var s in shipList)
\r
368 foreach (var id in s.Slot)
\r
369 _itemInfo[id].Ship = s;
\r
371 _itemInfo[s.SlotEx].Ship = s;
\r
375 public string GetUseItemName(int id) => _useItemName[id];
\r