1 // Copyright (C) 2013, 2014, 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>
\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
7 // http://www.apache.org/licenses/LICENSE-2.0
\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
15 using System.Collections.Generic;
\r
17 using KancolleSniffer.Util;
\r
19 namespace KancolleSniffer.Model
\r
21 public class ItemInfo
\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
40 var limit = MaxShips - MarginShips;
\r
41 AlarmShips = AlarmShips || _nowShips < limit && value >= limit;
\r
47 public bool TooManyShips => MaxShips != 0 && NowShips >= MaxShips - MarginShips;
\r
49 public int NowEquips
\r
56 var limit = MaxEquips - MarginEquips;
\r
57 AlarmEquips = AlarmEquips || _nowEquips < limit && value >= limit;
\r
63 public bool TooManyEquips => MaxEquips != 0 && NowEquips >= MaxEquips - MarginEquips;
\r
65 public ItemInfo(ItemMaster itemMaster, ItemInventry itemInventry)
\r
67 _itemMaster = itemMaster;
\r
68 _itemInventry = itemInventry;
\r
73 public void InspectBasic(dynamic json)
\r
75 MaxShips = (int)json.api_max_chara;
\r
76 var check = MaxEquips == 0;
\r
77 MaxEquips = (int)json.api_max_slotitem;
\r
79 AlarmEquips = NowEquips >= MaxEquips - MarginEquips;
\r
82 public void InspectMaster(dynamic json)
\r
84 _itemMaster.InspectMaster(json);
\r
87 public void InspectSlotItem(dynamic json, bool full = false)
\r
90 json = new[] {json};
\r
92 _itemInventry.Clear();
\r
93 foreach (var entry in json)
\r
95 var id = (int)entry.api_id;
\r
96 _itemInventry[id] = new ItemStatus(id)
\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
103 NowEquips = _itemInventry.Count;
\r
106 public void InspectCreateItem(dynamic json)
\r
108 if (!json.IsDefined("api_slot_item"))
\r
110 InspectSlotItem(json.api_slot_item);
\r
113 public void InspectGetShip(dynamic json)
\r
116 if (json.api_slotitem == null) // まるゆにはスロットがない
\r
118 InspectSlotItem(json.api_slotitem);
\r
121 public void InspectDestroyItem(string request, dynamic json)
\r
123 var values = HttpUtility.ParseQueryString(request);
\r
124 DeleteItems(values["api_slotitem_ids"].Split(',').Select(int.Parse).ToArray());
\r
127 public void InspectRemodelSlot(dynamic json)
\r
129 if (json.api_after_slot())
\r
130 InspectSlotItem(json.api_after_slot);
\r
131 if (!json.api_use_slot_id())
\r
133 DeleteItems((int[])json.api_use_slot_id);
\r
136 public void DeleteItems(IEnumerable<ItemStatus> items)
\r
138 DeleteItems(items.Select(item => item.Id));
\r
141 private void DeleteItems(IEnumerable<int> ids)
\r
143 _itemInventry.Remove(ids);
\r
144 NowEquips = _itemInventry.Count;
\r
147 public ItemSpec GetSpecByItemId(int id) => _itemMaster[id];
\r
149 public string GetName(int id) => GetStatus(id).Spec.Name;
\r
151 public ItemStatus GetStatus(int id)
\r
153 return _itemInventry[id];
\r
156 public void ClearHolder()
\r
158 foreach (var item in _itemInventry.AllItems)
\r
159 item.Holder = new ShipStatus();
\r
162 public ItemStatus[] ItemList => _itemInventry.AllItems.ToArray();
\r
164 public string GetUseItemName(int id) => _itemMaster.GetUseItemName(id);
\r
166 public void InjectItemSpec(IEnumerable<ItemSpec> specs)
\r
168 foreach (var spec in specs)
\r
169 _itemMaster[spec.Id] = spec;
\r
172 public ItemStatus[] InjectItems(IEnumerable<int> itemIds)
\r
174 var id = _itemInventry.MaxId + 1;
\r
175 return itemIds.Select(itemId =>
\r
177 var spec = _itemMaster[itemId];
\r
180 spec = new ItemSpec {Id = itemId};
\r
181 _itemMaster[itemId] = spec;
\r
183 var item = new ItemStatus {Id = id++, Spec = spec};
\r
184 _itemInventry.Add(item);
\r