1 // Copyright (C) 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
17 using System.Xml.Serialization;
\r
19 namespace KancolleSniffer
\r
21 public class MaterialInfo : IHaveState
\r
23 private bool _inPort;
\r
24 private DateTime _lastMission;
\r
26 public MaterialCount[] MaterialHistory { get; }
\r
27 public int[] PrevPort { get; }
\r
28 public int[] Current => MaterialHistory.Select(h => h.Now).ToArray();
\r
30 public MaterialInfo()
\r
32 var n = Enum.GetValues(typeof(Material)).Length;
\r
33 MaterialHistory = new MaterialCount[n];
\r
34 for (var i = 0; i < n; i++)
\r
35 MaterialHistory[i] = new MaterialCount();
\r
36 PrevPort = new int[n];
\r
39 public bool NeedSave
\r
41 get { return MaterialHistory.Any(m => m.NeedSave); }
\r
44 foreach (var m in MaterialHistory)
\r
49 public void InspectMaterial(dynamic json, bool port = false)
\r
53 foreach (var entry in json)
\r
55 var i = (int)entry.api_id - 1;
\r
56 var v = (int)entry.api_value;
\r
57 MaterialHistory[i].Now = v;
\r
62 if (PrevPort[0] != 0)
\r
64 for (var i = 0; i < MaterialHistory.Length; i++)
\r
65 PrevPort[i] = MaterialHistory[i].Now;
\r
68 private void UpdatePrevPort()
\r
72 for (var i = 0; i < MaterialHistory.Length; i++)
\r
73 PrevPort[i] = MaterialHistory[i].Now;
\r
77 public void InspectCharge(dynamic json)
\r
79 SetMaterials((int[])json.api_material);
\r
82 public void InspectMissionResult(dynamic json)
\r
84 if ((int)json.api_clear_result == 0) // 失敗
\r
86 if (DateTime.Now - _lastMission < TimeSpan.FromMinutes(1))
\r
88 _lastMission = DateTime.Now;
\r
89 AddMaterials((int[])json.api_get_material);
\r
92 public void InspectDestroyShip(dynamic json)
\r
94 SetMaterials((int[])json.api_material);
\r
97 public void InspectCreateIem(dynamic json)
\r
99 SetMaterials((int[])json.api_material);
\r
102 public void InspectDestroyItem(dynamic json)
\r
104 AddMaterials((int[])json.api_get_material);
\r
107 public void InspectRemodelSlot(dynamic json)
\r
109 SetMaterials((int[])json.api_after_material);
\r
112 public void InspectAirCorpsSupply(dynamic json)
\r
114 SetMaterial(Material.Fuel, (int)json.api_after_fuel);
\r
115 SetMaterial(Material.Bouxite, (int)json.api_after_bauxite);
\r
118 public void InspectAirCorpsSetPlane(dynamic json)
\r
120 if (json.api_after_bauxite())
\r
121 SetMaterial(Material.Bouxite, (int)json.api_after_bauxite);
\r
124 public void SetMaterials(int[] material)
\r
127 for (var i = 0; i < material.Length; i++)
\r
128 MaterialHistory[i].Now = material[i];
\r
131 public void SetMaterial(Material m, int v)
\r
134 MaterialHistory[(int)m].Now = v;
\r
137 public void AddMaterials(int[] v)
\r
140 for (var i = 0; i < v.Length; i++)
\r
141 MaterialHistory[i].Now += v[i];
\r
144 public void SubMaterial(Material m, int v)
\r
147 MaterialHistory[(int)m].Now -= v;
\r
150 public void SaveState(Status status)
\r
153 status.MaterialHistory = MaterialHistory.ToList();
\r
156 public void LoadState(Status status)
\r
158 status.MaterialHistory?.CopyTo(MaterialHistory, 0);
\r
163 public enum Material
\r
175 public class MaterialCount
\r
179 public int BegOfDay { get; set; }
\r
180 public int BegOfWeek { get; set; }
\r
181 public DateTime LastSet { get; set; }
\r
183 public bool NeedSave { get; set; }
\r
187 get { return _now; }
\r
192 if (Status.Restoring) // JSONから値を復旧するときは履歴に触らない
\r
196 if (LastSet == DateTime.MinValue)
\r
198 BegOfDay = BegOfWeek = value;
\r
199 LastSet = DateTime.Now;
\r
202 UpdateHistory(prev);
\r
203 LastSet = DateTime.Now;
\r
207 private void UpdateHistory(int prev)
\r
209 var morning = DateTime.Today.AddHours(5);
\r
210 var dow = (int)morning.DayOfWeek;
\r
211 var monday = morning.AddDays(dow == 0 ? -6 : -dow + 1);
\r
212 if (DateTime.Now >= morning && LastSet < morning)
\r
214 if (DateTime.Now >= monday && LastSet < monday)
\r