OSDN Git Service

当日5時からと月曜5時からのバケツの増減を表示する
[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;\r
19 using System.Collections.Generic;\r
20 using System.Web;\r
21 \r
22 namespace KancolleSniffer\r
23 {\r
24     public struct ItemSpec\r
25     {\r
26         public string Name;\r
27         public int TyKu;\r
28     }\r
29 \r
30     public class ItemInfo\r
31     {\r
32         private int _nowShips;\r
33         private readonly Dictionary<int, ItemSpec> _itemSpecs = new Dictionary<int, ItemSpec>();\r
34         private readonly Dictionary<int, int> _itemIds = new Dictionary<int, int>();\r
35         private int _numBuckets;\r
36         private DateTime _bucketsLastSetTime;\r
37 \r
38         public int MaxShips { get; private set; }\r
39         public int MarginShips { get; set; }\r
40         public bool NeedRing { get; set; }\r
41         public int NowItems { get; set; }\r
42         public int MaxItems { get; private set; }\r
43         public int BucketsOnMonday { get; set; }\r
44         public int BucketsInMorning { get; set; }\r
45 \r
46         public int NumBuckets\r
47         {\r
48             get\r
49             {\r
50                 return _numBuckets;\r
51             }\r
52             set\r
53             {\r
54                 var morning = DateTime.Today.AddHours(5);\r
55                 var dow = (int)morning.DayOfWeek;\r
56                 var monday = morning.AddDays(dow == 0 ? -6 : -dow + 1);\r
57                 if (DateTime.Now >= monday && _bucketsLastSetTime < monday)\r
58                     BucketsOnMonday = _numBuckets;\r
59                 if (DateTime.Now >= morning && _bucketsLastSetTime < morning)\r
60                     BucketsInMorning = _numBuckets;\r
61                 _numBuckets = value;\r
62                 _bucketsLastSetTime = DateTime.Now;\r
63             }\r
64         }\r
65 \r
66         public int NowShips\r
67         {\r
68             get { return _nowShips; }\r
69             set\r
70             {\r
71                 if (MaxShips != 0)\r
72                 {\r
73                     var limit = MaxShips - MarginShips;\r
74                     NeedRing = _nowShips < limit && value >= limit;\r
75                 }\r
76                 _nowShips = value;\r
77             }\r
78         }\r
79 \r
80         public bool TooManyShips\r
81         {\r
82             get { return MaxShips != 0 && NowShips >= MaxShips - MarginShips; }\r
83         }\r
84 \r
85         public ItemInfo()\r
86         {\r
87             MarginShips = 4;\r
88         }\r
89 \r
90         public void InspectBasic(dynamic json)\r
91         {\r
92             MaxShips = (int)json.api_max_chara;\r
93             MaxItems = (int)json.api_max_slotitem;\r
94         }\r
95 \r
96         public void InspectMaterial(dynamic json)\r
97         {\r
98             foreach (var entry in json)\r
99             {\r
100                 if ((int)entry.api_id != 6)\r
101                     continue;\r
102                 NumBuckets = (int)entry.api_value;\r
103             }\r
104         }\r
105 \r
106         public void InspectMaster(dynamic json)\r
107         {\r
108             foreach (var entry in json)\r
109             {\r
110                 _itemSpecs[(int)entry.api_id] = new ItemSpec\r
111                 {\r
112                     Name = (string)entry.api_name,\r
113                     TyKu = (int)entry.api_type[0] == 3 || (int)entry.api_type[2] == 11 ? (int)entry.api_tyku : 0 // 艦載機と水上爆撃機のみ\r
114                 };\r
115             }\r
116             _itemSpecs[-1] = new ItemSpec();\r
117         }\r
118 \r
119         public void InspectSlotItem(dynamic json, bool full = false)\r
120         {\r
121             if (!json.IsArray)\r
122                 json = new[] {json};\r
123             if (full)\r
124                 NowItems = ((object[])json).Length;\r
125             foreach (var entry in json)\r
126                 _itemIds[(int)entry.api_id] = (int)entry.api_slotitem_id;\r
127             _itemIds[-1] = -1;\r
128         }\r
129 \r
130         public void InspectCreateItem(dynamic json)\r
131         {\r
132             if (!json.IsDefined("api_slot_item"))\r
133                 return;\r
134             InspectSlotItem(json.api_slot_item);\r
135             NowItems++;\r
136         }\r
137 \r
138         public void InspectGetShip(dynamic json)\r
139         {\r
140             NowShips += 1;\r
141             if (json.api_slotitem == null) // まるゆにはスロットがない\r
142                 return;\r
143             InspectSlotItem(json.api_slotitem);\r
144             NowItems += ((object[])json.api_slotitem).Length;\r
145         }\r
146 \r
147         public void InspectDestroyItem(string request)\r
148         {\r
149             var values = HttpUtility.ParseQueryString(request);\r
150             NowItems -= values["api_slotitem_ids"].Split(',').Length;\r
151         }\r
152 \r
153         public ItemSpec this[int id]\r
154         {\r
155             get { return GetSpecById(id); }\r
156         }\r
157 \r
158         public ItemSpec GetSpecById(int id)\r
159         {\r
160             return _itemSpecs[_itemIds[id]];\r
161         }\r
162 \r
163         public ItemSpec GetSpecByItemId(int id)\r
164         {\r
165             return _itemSpecs[id];\r
166         }\r
167 \r
168         public void SaveState(Status status)\r
169         {\r
170             status.BucketsOnMonday = BucketsOnMonday;\r
171             status.BucketsInMorning = BucketsInMorning;\r
172             status.BacketsLastSetTime = _bucketsLastSetTime;\r
173         }\r
174 \r
175         public void LoadSate(Status status)\r
176         {\r
177             BucketsOnMonday = status.BucketsOnMonday;\r
178             BucketsInMorning = status.BucketsInMorning;\r
179             _bucketsLastSetTime = status.BacketsLastSetTime;\r
180         }\r
181     }\r
182 }