OSDN Git Service

集中開発に対応する
[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         public AlarmCounter Counter { get; }\r
26 \r
27         public ItemInfo(ItemMaster itemMaster, ItemInventory itemInventory)\r
28         {\r
29             _itemMaster = itemMaster;\r
30             _itemInventory = itemInventory;\r
31             Counter = new AlarmCounter(() => _itemInventory.Count) {Margin = 5};\r
32         }\r
33 \r
34         public void InspectBasic(dynamic json)\r
35         {\r
36             Counter.Max = (int)json.api_max_slotitem;\r
37         }\r
38 \r
39         public void InspectMaster(dynamic json)\r
40         {\r
41             _itemMaster.InspectMaster(json);\r
42         }\r
43 \r
44         public void InspectSlotItem(dynamic json, bool full = false)\r
45         {\r
46             if (!json.IsArray)\r
47                 json = new[] {json};\r
48             if (full)\r
49                 _itemInventory.Clear();\r
50             foreach (var entry in json)\r
51             {\r
52                 var id = (int)entry.api_id;\r
53                 if (id == -1)\r
54                     continue;\r
55                 _itemInventory[id] = new ItemStatus(id)\r
56                 {\r
57                     Spec = _itemMaster[(int)entry.api_slotitem_id],\r
58                     Level = entry.api_level() ? (int)entry.api_level : 0,\r
59                     Alv = entry.api_alv() ? (int)entry.api_alv : 0\r
60                 };\r
61             }\r
62         }\r
63 \r
64         public void InspectCreateItem(dynamic json)\r
65         {\r
66 \r
67             if (json.api_slot_item())\r
68             {\r
69                 InspectSlotItem(json.api_slot_item);\r
70             }\r
71             else if (json.api_get_items())\r
72             {\r
73                 InspectSlotItem(json.api_get_items);\r
74             }\r
75         }\r
76 \r
77         public void InspectGetShip(dynamic json)\r
78         {\r
79             if (json.api_slotitem == null) // まるゆにはスロットがない\r
80                 return;\r
81             InspectSlotItem(json.api_slotitem);\r
82         }\r
83 \r
84         public void InspectDestroyItem(string request, dynamic json)\r
85         {\r
86             var values = HttpUtility.ParseQueryString(request);\r
87             DeleteItems(values["api_slotitem_ids"].Split(',').Select(int.Parse).ToArray());\r
88         }\r
89 \r
90         public void InspectRemodelSlot(dynamic json)\r
91         {\r
92             if (json.api_after_slot())\r
93                 InspectSlotItem(json.api_after_slot);\r
94             if (!json.api_use_slot_id())\r
95                 return;\r
96             DeleteItems((int[])json.api_use_slot_id);\r
97         }\r
98 \r
99         private void DeleteItems(IEnumerable<int> ids)\r
100         {\r
101             _itemInventory.Remove(ids);\r
102         }\r
103 \r
104         public ItemSpec GetSpecByItemId(int id) => _itemMaster[id];\r
105 \r
106         public string GetName(int id) => GetStatus(id).Spec.Name;\r
107 \r
108         public ItemStatus GetStatus(int id)\r
109         {\r
110             return _itemInventory[id];\r
111         }\r
112 \r
113         public void ClearHolder()\r
114         {\r
115             foreach (var item in _itemInventory.AllItems)\r
116                 item.Holder = new ShipStatus();\r
117         }\r
118 \r
119         public ItemStatus[] ItemList => _itemInventory.AllItems.ToArray();\r
120 \r
121         public string GetUseItemName(int id) => _itemMaster.GetUseItemName(id);\r
122 \r
123         public void InjectItemSpec(IEnumerable<ItemSpec> specs)\r
124         {\r
125             foreach (var spec in specs)\r
126                 _itemMaster[spec.Id] = spec;\r
127         }\r
128 \r
129         public ItemStatus[] InjectItems(IEnumerable<int> itemIds)\r
130         {\r
131             var id = _itemInventory.MaxId + 1;\r
132             return itemIds.Select(itemId =>\r
133             {\r
134                 var spec = _itemMaster[itemId];\r
135                 if (spec.Empty)\r
136                 {\r
137                     spec = new ItemSpec {Id = itemId};\r
138                     _itemMaster[itemId] = spec;\r
139                 }\r
140                 var item = new ItemStatus {Id = id++, Spec = spec};\r
141                 _itemInventory.Add(item);\r
142                 return item;\r
143             }).ToArray();\r
144         }\r
145     }\r
146 }