1 // Copyright (C) 2013, 2014, 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
17 using KancolleSniffer.Util;
\r
19 namespace KancolleSniffer.Model
\r
21 public class ItemInfo
\r
23 private readonly ItemMaster _itemMaster;
\r
24 private readonly ItemInventory _itemInventory;
\r
25 private readonly Dictionary<int, int> _useItem = new Dictionary<int, int>();
\r
27 public AlarmCounter Counter { get; }
\r
29 public ItemInfo(ItemMaster itemMaster, ItemInventory itemInventory)
\r
31 _itemMaster = itemMaster;
\r
32 _itemInventory = itemInventory;
\r
33 Counter = new AlarmCounter(() => _itemInventory.Count) {Margin = 5};
\r
36 public void InspectBasic(dynamic json)
\r
38 Counter.Max = (int)json.api_max_slotitem;
\r
41 public void InspectMaster(dynamic json)
\r
43 _itemMaster.InspectMaster(json);
\r
46 public void InspectSlotItem(dynamic json, bool full = false)
\r
49 json = new[] {json};
\r
51 _itemInventory.Clear();
\r
52 foreach (var entry in json)
\r
54 var id = (int)entry.api_id;
\r
57 _itemInventory[id] = new ItemStatus(id)
\r
59 Spec = _itemMaster[(int)entry.api_slotitem_id],
\r
60 Level = entry.api_level() ? (int)entry.api_level : 0,
\r
61 Alv = entry.api_alv() ? (int)entry.api_alv : 0,
\r
62 Locked = entry.api_locked() && (int)entry.api_locked == 1
\r
67 public void InspectUseItem(dynamic json)
\r
69 foreach (var entry in json)
\r
71 _useItem[(int)entry.api_id] = (int)entry.api_count;
\r
75 public void InspectCreateItem(dynamic json)
\r
78 if (json.api_slot_item())
\r
80 InspectSlotItem(json.api_slot_item);
\r
82 else if (json.api_get_items())
\r
84 InspectSlotItem(json.api_get_items);
\r
88 public void InspectGetShip(dynamic json)
\r
90 if (json.api_slotitem == null) // まるゆにはスロットがない
\r
92 InspectSlotItem(json.api_slotitem);
\r
95 public void InspectDestroyItem(string request, dynamic json)
\r
97 var values = HttpUtility.ParseQueryString(request);
\r
98 DeleteItems(values["api_slotitem_ids"].Split(',').Select(int.Parse).ToArray());
\r
101 public void InspectRemodelSlot(dynamic json)
\r
103 if (json.api_after_slot())
\r
104 InspectSlotItem(json.api_after_slot);
\r
105 if (!json.api_use_slot_id())
\r
107 DeleteItems((int[])json.api_use_slot_id);
\r
110 private void DeleteItems(IEnumerable<int> ids)
\r
112 _itemInventory.Remove(ids);
\r
115 public ItemSpec GetSpecByItemId(int id) => _itemMaster[id];
\r
117 public string GetName(int id) => GetStatus(id).Spec.Name;
\r
119 public ItemStatus GetStatus(int id)
\r
121 return _itemInventory[id];
\r
124 public void ClearHolder()
\r
126 foreach (var item in _itemInventory.AllItems)
\r
127 item.Holder = new ShipStatus();
\r
130 public ItemStatus[] ItemList => _itemInventory.AllItems.Concat(UseItemList).ToArray();
\r
132 public string GetUseItemName(int id) => _itemMaster.GetUseItemName(id);
\r
134 private const int EmergencyRepairId = 91;
\r
136 private IEnumerable<ItemStatus> UseItemList =>
\r
137 Enumerable.Repeat(new ItemStatus
\r
139 Spec = new ItemSpec
\r
142 Id = 10000 + EmergencyRepairId,
\r
143 Name = _itemMaster.GetUseItemName(EmergencyRepairId)
\r
145 Holder = new ShipStatus()
\r
146 }, _useItem.TryGetValue(EmergencyRepairId, out var count) ? count : 0);
\r
148 public void InjectItemSpec(IEnumerable<ItemSpec> specs)
\r
150 foreach (var spec in specs)
\r
151 _itemMaster[spec.Id] = spec;
\r
154 public ItemStatus[] InjectItems(IEnumerable<int> itemIds)
\r
156 var id = _itemInventory.MaxId + 1;
\r
157 return itemIds.Select(itemId =>
\r
159 var spec = _itemMaster[itemId];
\r
162 spec = new ItemSpec {Id = itemId};
\r
163 _itemMaster[itemId] = spec;
\r
165 var item = new ItemStatus {Id = id++, Spec = spec};
\r
166 _itemInventory.Add(item);
\r