OSDN Git Service

deckとshipの分離をShipInfoで行う
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / ItemInfo.cs
1 // Copyright (C) 2013 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>\r
2 // \r
3 // This program is part of KancolleSniffer.\r
4 //\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
9 //\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
14 //\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
17 \r
18 using System.Collections.Generic;\r
19 using System.Web;\r
20 \r
21 namespace KancolleSniffer\r
22 {\r
23     public class ItemInfo\r
24     {\r
25         private int _nowShips;\r
26         private readonly Dictionary<int,int> _itemSpecs = new Dictionary<int, int>();\r
27         private readonly Dictionary<int, int> _itemIds = new Dictionary<int, int>();\r
28 \r
29         public int MaxShips { get; private set; }\r
30         public int MarginShips { get; set; }\r
31         public bool NeedRing { get; set; }\r
32         public int NowItems { get; set; }\r
33         public int MaxItems { get; private set; }\r
34         public int NumBuckets { get; set; }\r
35 \r
36         public int NowShips\r
37         {\r
38             get { return _nowShips; }\r
39             set\r
40             {\r
41                 if (MaxShips != 0)\r
42                 {\r
43                     var limit = MaxShips - MarginShips;\r
44                     NeedRing = _nowShips < limit && value >= limit;\r
45                 }\r
46                 _nowShips = value;\r
47             }\r
48         }\r
49 \r
50         public bool TooManyShips\r
51         {\r
52             get { return MaxShips != 0 && NowShips >= MaxShips - MarginShips; }\r
53         }\r
54 \r
55         public ItemInfo()\r
56         {\r
57             MarginShips = 4;\r
58         }\r
59 \r
60         public void InspectBasic(dynamic json)\r
61         {\r
62             MaxShips = (int)json.api_max_chara;\r
63             MaxItems = (int)json.api_max_slotitem;\r
64         }\r
65 \r
66         public void InspectMaterial(dynamic json)\r
67         {\r
68             foreach (var entry in json)\r
69             {\r
70                 if ((int)entry.api_id != 6)\r
71                     continue;\r
72                 NumBuckets = (int)entry.api_value;\r
73             }\r
74         }\r
75 \r
76         public void InspectMaster(dynamic json)\r
77         {\r
78             foreach (var entry in json)\r
79             {\r
80                 if ((int)entry.api_type[0] == 3) // 艦載機\r
81                     _itemSpecs[(int)entry.api_id] = (int)entry.api_tyku;                \r
82             }\r
83         }\r
84 \r
85         public void InspectSlotItem(dynamic json, bool full = false)\r
86         {\r
87             if (!json.IsArray)\r
88                 json = new[] {json};\r
89             if (full)\r
90                 NowItems = ((object[])json).Length;\r
91             foreach (var entry in json)\r
92                 _itemIds[(int)entry.api_id] = (int)entry.api_slotitem_id;\r
93         }\r
94 \r
95         public void InspectCreateItem(dynamic json)\r
96         {\r
97             if (!json.IsDefined("api_slot_item"))\r
98                 return;\r
99             InspectSlotItem(json.api_slot_item);\r
100             NowItems++;\r
101         }\r
102 \r
103         public void InspectGetShip(dynamic json)\r
104         {\r
105             InspectSlotItem(json.api_slotitem);\r
106             NowItems += ((object[])json.api_slotitem).Length;\r
107             NowShips += 1;\r
108         }\r
109 \r
110         public void InspectDestroyItem(string request)\r
111         {\r
112             var values = HttpUtility.ParseQueryString(request);\r
113             NowItems -= values["api_slotitem_ids"].Split(',').Length;\r
114         }\r
115 \r
116         public int GetTyKu(int id)\r
117         {\r
118             int item;\r
119             int tyku;\r
120             return _itemIds.TryGetValue(id, out item) ? _itemSpecs.TryGetValue(item, out tyku) ? tyku : 0 : 0;\r
121         }\r
122 \r
123     }\r
124 }