OSDN Git Service

4月23日に行われたプロトコル変更に対応する
[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 \r
20 namespace KancolleSniffer\r
21 {\r
22     public class ItemInfo\r
23     {\r
24         private int _nowShips;\r
25         private readonly Dictionary<int,int> _itemSpecs = new Dictionary<int, int>();\r
26         private readonly Dictionary<int, int> _itemIds = new Dictionary<int, int>();\r
27 \r
28         public int MaxShips { get; private set; }\r
29         public int MarginShips { get; set; }\r
30         public bool NeedRing { get; set; }\r
31         public int NowItems { get; set; }\r
32         public int MaxItems { get; private set; }\r
33         public int NumBuckets { get; private set; }\r
34 \r
35         public int NowShips\r
36         {\r
37             get { return _nowShips; }\r
38             set\r
39             {\r
40                 if (MaxShips != 0)\r
41                 {\r
42                     var limit = MaxShips - MarginShips;\r
43                     NeedRing = _nowShips < limit && value >= limit;\r
44                 }\r
45                 _nowShips = value;\r
46 \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 InspectShip(dynamic json)\r
96         {\r
97             NowShips = ((object[])json).Length;\r
98         }\r
99 \r
100         public void InspectCreateItem(dynamic json)\r
101         {\r
102             if (!json.IsDefined("api_slot_item"))\r
103                 return;\r
104             InspectSlotItem(json.api_slot_item);\r
105             NowItems++;\r
106 \r
107         }\r
108 \r
109         public void InspectGetShip(dynamic json)\r
110         {\r
111             InspectSlotItem(json.api_slotitem);\r
112             NowItems += ((object[])json.api_slotitem).Length;\r
113             NowShips += 1;\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 }