OSDN Git Service

769452198cdce96443e7cd1956e7210b5895bdc2
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Model / ItemInfo.cs
1 // Copyright (C) 2013, 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 using System.Linq;\r
17 using KancolleSniffer.Util;\r
18 \r
19 namespace KancolleSniffer.Model\r
20 {\r
21     public class ItemInfo\r
22     {\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
26 \r
27         public AlarmCounter Counter { get; }\r
28 \r
29         public ItemInfo(ItemMaster itemMaster, ItemInventory itemInventory)\r
30         {\r
31             _itemMaster = itemMaster;\r
32             _itemInventory = itemInventory;\r
33             Counter = new AlarmCounter(() => _itemInventory.Count) {Margin = 5};\r
34         }\r
35 \r
36         public void InspectBasic(dynamic json)\r
37         {\r
38             Counter.Max = (int)json.api_max_slotitem;\r
39         }\r
40 \r
41         public void InspectMaster(dynamic json)\r
42         {\r
43             _itemMaster.InspectMaster(json);\r
44         }\r
45 \r
46         public void InspectSlotItem(dynamic json, bool full = false)\r
47         {\r
48             if (!json.IsArray)\r
49                 json = new[] {json};\r
50             if (full)\r
51                 _itemInventory.Clear();\r
52             foreach (var entry in json)\r
53             {\r
54                 var id = (int)entry.api_id;\r
55                 if (id == -1)\r
56                     continue;\r
57                 _itemInventory[id] = new ItemStatus(id)\r
58                 {\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
63                 };\r
64             }\r
65         }\r
66 \r
67         public void InspectUseItem(dynamic json)\r
68         {\r
69             foreach (var entry in json)\r
70             {\r
71                 _useItem[(int)entry.api_id] = (int)entry.api_count;\r
72             }\r
73         }\r
74 \r
75         public void InspectCreateItem(dynamic json)\r
76         {\r
77 \r
78             if (json.api_slot_item())\r
79             {\r
80                 InspectSlotItem(json.api_slot_item);\r
81             }\r
82             else if (json.api_get_items())\r
83             {\r
84                 InspectSlotItem(json.api_get_items);\r
85             }\r
86         }\r
87 \r
88         public void InspectGetShip(dynamic json)\r
89         {\r
90             if (json.api_slotitem == null) // まるゆにはスロットがない\r
91                 return;\r
92             InspectSlotItem(json.api_slotitem);\r
93         }\r
94 \r
95         public void InspectDestroyItem(string request, dynamic json)\r
96         {\r
97             var values = HttpUtility.ParseQueryString(request);\r
98             DeleteItems(values["api_slotitem_ids"].Split(',').Select(int.Parse).ToArray());\r
99         }\r
100 \r
101         public void InspectRemodelSlot(dynamic json)\r
102         {\r
103             if (json.api_after_slot())\r
104                 InspectSlotItem(json.api_after_slot);\r
105             if (!json.api_use_slot_id())\r
106                 return;\r
107             DeleteItems((int[])json.api_use_slot_id);\r
108         }\r
109 \r
110         private void DeleteItems(IEnumerable<int> ids)\r
111         {\r
112             _itemInventory.Remove(ids);\r
113         }\r
114 \r
115         public ItemSpec GetSpecByItemId(int id) => _itemMaster[id];\r
116 \r
117         public string GetName(int id) => GetStatus(id).Spec.Name;\r
118 \r
119         public ItemStatus GetStatus(int id)\r
120         {\r
121             return _itemInventory[id];\r
122         }\r
123 \r
124         public void ClearHolder()\r
125         {\r
126             foreach (var item in _itemInventory.AllItems)\r
127                 item.Holder = new ShipStatus();\r
128         }\r
129 \r
130         public ItemStatus[] ItemList => _itemInventory.AllItems.Concat(UseItemList).ToArray();\r
131 \r
132         public string GetUseItemName(int id) => _itemMaster.GetUseItemName(id);\r
133 \r
134         private const int EmergencyRepairId = 91;\r
135 \r
136         private IEnumerable<ItemStatus> UseItemList =>\r
137             Enumerable.Repeat(new ItemStatus\r
138             {\r
139                 Spec = new ItemSpec\r
140                 {\r
141                     Type = 31,\r
142                     Id = 10000 + EmergencyRepairId,\r
143                     Name = _itemMaster.GetUseItemName(EmergencyRepairId)\r
144                 },\r
145                 Holder = new ShipStatus()\r
146             }, _useItem.TryGetValue(EmergencyRepairId, out var count) ? count : 0);\r
147 \r
148         public void InjectItemSpec(IEnumerable<ItemSpec> specs)\r
149         {\r
150             foreach (var spec in specs)\r
151                 _itemMaster[spec.Id] = spec;\r
152         }\r
153 \r
154         public ItemStatus[] InjectItems(IEnumerable<int> itemIds)\r
155         {\r
156             var id = _itemInventory.MaxId + 1;\r
157             return itemIds.Select(itemId =>\r
158             {\r
159                 var spec = _itemMaster[itemId];\r
160                 if (spec.Empty)\r
161                 {\r
162                     spec = new ItemSpec {Id = itemId};\r
163                     _itemMaster[itemId] = spec;\r
164                 }\r
165                 var item = new ItemStatus {Id = id++, Spec = spec};\r
166                 _itemInventory.Add(item);\r
167                 return item;\r
168             }).ToArray();\r
169         }\r
170     }\r
171 }