1 // Copyright (C) 2013 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>
\r
3 // This program is part of KancolleSniffer.
\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
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
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
19 using System.Collections.Generic;
\r
22 namespace KancolleSniffer
\r
24 public struct ItemSpec
\r
30 public class ItemInfo
\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
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
46 public int NumBuckets
\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
68 get { return _nowShips; }
\r
73 var limit = MaxShips - MarginShips;
\r
74 NeedRing = _nowShips < limit && value >= limit;
\r
80 public bool TooManyShips
\r
82 get { return MaxShips != 0 && NowShips >= MaxShips - MarginShips; }
\r
90 public void InspectBasic(dynamic json)
\r
92 MaxShips = (int)json.api_max_chara;
\r
93 MaxItems = (int)json.api_max_slotitem;
\r
96 public void InspectMaterial(dynamic json)
\r
98 foreach (var entry in json)
\r
100 if ((int)entry.api_id != 6)
\r
102 NumBuckets = (int)entry.api_value;
\r
106 public void InspectMaster(dynamic json)
\r
108 foreach (var entry in json)
\r
110 _itemSpecs[(int)entry.api_id] = new ItemSpec
\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
116 _itemSpecs[-1] = new ItemSpec();
\r
119 public void InspectSlotItem(dynamic json, bool full = false)
\r
122 json = new[] {json};
\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
130 public void InspectCreateItem(dynamic json)
\r
132 if (!json.IsDefined("api_slot_item"))
\r
134 InspectSlotItem(json.api_slot_item);
\r
138 public void InspectGetShip(dynamic json)
\r
141 if (json.api_slotitem == null) // まるゆにはスロットがない
\r
143 InspectSlotItem(json.api_slotitem);
\r
144 NowItems += ((object[])json.api_slotitem).Length;
\r
147 public void InspectDestroyItem(string request)
\r
149 var values = HttpUtility.ParseQueryString(request);
\r
150 NowItems -= values["api_slotitem_ids"].Split(',').Length;
\r
153 public ItemSpec this[int id]
\r
155 get { return GetSpecById(id); }
\r
158 public ItemSpec GetSpecById(int id)
\r
160 return _itemSpecs[_itemIds[id]];
\r
163 public ItemSpec GetSpecByItemId(int id)
\r
165 return _itemSpecs[id];
\r
168 public void SaveState(Status status)
\r
170 status.BucketsOnMonday = BucketsOnMonday;
\r
171 status.BucketsInMorning = BucketsInMorning;
\r
172 status.BacketsLastSetTime = _bucketsLastSetTime;
\r
175 public void LoadSate(Status status)
\r
177 BucketsOnMonday = status.BucketsOnMonday;
\r
178 BucketsInMorning = status.BucketsInMorning;
\r
179 _bucketsLastSetTime = status.BacketsLastSetTime;
\r