OSDN Git Service

5e05d47ccc618a01a0ac8957c01da999f842eae1
[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 int _nowShips, _nowEquips;\r
24         private readonly ItemMaster _itemMaster;\r
25         private readonly ItemInventry _itemInventry;\r
26         public int MaxShips { get; private set; }\r
27         public int MarginShips { get; set; }\r
28         public bool AlarmShips { get; set; }\r
29         public int MaxEquips { get; private set; }\r
30         public int MarginEquips { get; set; }\r
31         public bool AlarmEquips { get; set; }\r
32 \r
33         public int NowShips\r
34         {\r
35             get => _nowShips;\r
36             set\r
37             {\r
38                 if (MaxShips != 0)\r
39                 {\r
40                     var limit = MaxShips - MarginShips;\r
41                     AlarmShips = AlarmShips || _nowShips < limit && value >= limit;\r
42                 }\r
43                 _nowShips = value;\r
44             }\r
45         }\r
46 \r
47         public bool TooManyShips => MaxShips != 0 && NowShips >= MaxShips - MarginShips;\r
48 \r
49         public int NowEquips\r
50         {\r
51             get => _nowEquips;\r
52             set\r
53             {\r
54                 if (MaxEquips != 0)\r
55                 {\r
56                     var limit = MaxEquips - MarginEquips;\r
57                     AlarmEquips = AlarmEquips || _nowEquips < limit && value >= limit;\r
58                 }\r
59                 _nowEquips = value;\r
60             }\r
61         }\r
62 \r
63         public bool TooManyEquips => MaxEquips != 0 && NowEquips >= MaxEquips - MarginEquips;\r
64 \r
65         public ItemInfo(ItemMaster itemMaster, ItemInventry itemInventry)\r
66         {\r
67             _itemMaster = itemMaster;\r
68             _itemInventry = itemInventry;\r
69             MarginShips = 4;\r
70             MarginEquips = 10;\r
71         }\r
72 \r
73         public void InspectBasic(dynamic json)\r
74         {\r
75             MaxShips = (int)json.api_max_chara;\r
76             var check = MaxEquips == 0;\r
77             MaxEquips = (int)json.api_max_slotitem;\r
78             if (check)\r
79                 AlarmEquips = NowEquips >= MaxEquips - MarginEquips;\r
80         }\r
81 \r
82         public void InspectMaster(dynamic json)\r
83         {\r
84             _itemMaster.InspectMaster(json);\r
85         }\r
86 \r
87         public void InspectSlotItem(dynamic json, bool full = false)\r
88         {\r
89             if (!json.IsArray)\r
90                 json = new[] {json};\r
91             if (full)\r
92                 _itemInventry.Clear();\r
93             foreach (var entry in json)\r
94             {\r
95                 var id = (int)entry.api_id;\r
96                 _itemInventry[id] = new ItemStatus(id)\r
97                 {\r
98                     Spec = _itemMaster[(int)entry.api_slotitem_id],\r
99                     Level = entry.api_level() ? (int)entry.api_level : 0,\r
100                     Alv = entry.api_alv() ? (int)entry.api_alv : 0\r
101                 };\r
102             }\r
103             NowEquips = _itemInventry.Count;\r
104         }\r
105 \r
106         public void InspectCreateItem(dynamic json)\r
107         {\r
108             if (!json.IsDefined("api_slot_item"))\r
109                 return;\r
110             InspectSlotItem(json.api_slot_item);\r
111         }\r
112 \r
113         public void InspectGetShip(dynamic json)\r
114         {\r
115             NowShips += 1;\r
116             if (json.api_slotitem == null) // まるゆにはスロットがない\r
117                 return;\r
118             InspectSlotItem(json.api_slotitem);\r
119         }\r
120 \r
121         public void InspectDestroyItem(string request, dynamic json)\r
122         {\r
123             var values = HttpUtility.ParseQueryString(request);\r
124             DeleteItems(values["api_slotitem_ids"].Split(',').Select(int.Parse).ToArray());\r
125         }\r
126 \r
127         public void InspectRemodelSlot(dynamic json)\r
128         {\r
129             if (json.api_after_slot())\r
130                 InspectSlotItem(json.api_after_slot);\r
131             if (!json.api_use_slot_id())\r
132                 return;\r
133             DeleteItems((int[])json.api_use_slot_id);\r
134         }\r
135 \r
136         public void DeleteItems(IEnumerable<ItemStatus> items)\r
137         {\r
138             DeleteItems(items.Select(item => item.Id));\r
139         }\r
140 \r
141         private void DeleteItems(IEnumerable<int> ids)\r
142         {\r
143             _itemInventry.Remove(ids);\r
144             NowEquips = _itemInventry.Count;\r
145         }\r
146 \r
147         public ItemSpec GetSpecByItemId(int id) => _itemMaster[id];\r
148 \r
149         public string GetName(int id) => GetStatus(id).Spec.Name;\r
150 \r
151         public ItemStatus GetStatus(int id)\r
152         {\r
153             return _itemInventry[id];\r
154         }\r
155 \r
156         public void ClearHolder()\r
157         {\r
158             foreach (var item in _itemInventry.AllItems)\r
159                 item.Holder = new ShipStatus();\r
160         }\r
161 \r
162         public ItemStatus[] ItemList => _itemInventry.AllItems.ToArray();\r
163 \r
164         public string GetUseItemName(int id) => _itemMaster.GetUseItemName(id);\r
165 \r
166         public void InjectItemSpec(IEnumerable<ItemSpec> specs)\r
167         {\r
168             foreach (var spec in specs)\r
169                 _itemMaster[spec.Id] = spec;\r
170         }\r
171 \r
172         public ItemStatus[] InjectItems(IEnumerable<int> itemIds)\r
173         {\r
174             var id = _itemInventry.MaxId + 1;\r
175             return itemIds.Select(itemId =>\r
176             {\r
177                 var spec = _itemMaster[itemId];\r
178                 if (spec.Empty)\r
179                 {\r
180                     spec = new ItemSpec {Id = itemId};\r
181                     _itemMaster[itemId] = spec;\r
182                 }\r
183                 var item = new ItemStatus {Id = id++, Spec = spec};\r
184                 _itemInventry.Add(item);\r
185                 return item;\r
186             }).ToArray();\r
187         }\r
188     }\r
189 }