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
40 public bool NeedSave
\r
42 get { return MaterialHistory.Any(m => m.NeedSave); }
\r
45 foreach (var m in MaterialHistory)
\r
50 public void InspectMaterialPort(dynamic json)
\r
52 InspectMaterial(json);
\r
54 if (PrevPort[0] == -1)
\r
57 for (var i = 0; i < MaterialHistory.Length; i++)
\r
58 PrevPort[i] = MaterialHistory[i].Now;
\r
62 public void InspectMaterial(dynamic json)
\r
65 foreach (var entry in json)
\r
67 var i = (int)entry.api_id - 1;
\r
68 var v = (int)entry.api_value;
\r
69 MaterialHistory[i].Now = v;
\r
73 // 母港に戻ってから最初に資材に変化があったときに、母港の時点の資材を記録する
\r
74 private void UpdatePrevPort()
\r
78 for (var i = 0; i < MaterialHistory.Length; i++)
\r
79 PrevPort[i] = MaterialHistory[i].Now;
\r
83 public void InspectCharge(dynamic json)
\r
85 SetMaterials((int[])json.api_material);
\r
88 public void InspectMissionResult(dynamic json)
\r
90 if ((int)json.api_clear_result == 0) // 失敗
\r
92 // 連続して遠征が帰投したときに資材の増加を積算する
\r
93 if (DateTime.Now - _lastMission < TimeSpan.FromMinutes(1))
\r
95 _lastMission = DateTime.Now;
\r
96 AddMaterials((int[])json.api_get_material);
\r
99 public void InspectDestroyShip(dynamic json)
\r
101 SetMaterials((int[])json.api_material);
\r
104 public void InspectCreateIem(dynamic json)
\r
106 SetMaterials((int[])json.api_material);
\r
109 public void InspectDestroyItem(dynamic json)
\r
111 AddMaterials((int[])json.api_get_material);
\r
114 public void InspectRemodelSlot(dynamic json)
\r
116 SetMaterials((int[])json.api_after_material);
\r
119 public void InspectAirCorpsSupply(dynamic json)
\r
121 SetMaterial(Material.Fuel, (int)json.api_after_fuel);
\r
122 SetMaterial(Material.Bouxite, (int)json.api_after_bauxite);
\r
125 public void InspectAirCorpsSetPlane(dynamic json)
\r
127 if (json.api_after_bauxite())
\r
128 SetMaterial(Material.Bouxite, (int)json.api_after_bauxite);
\r
131 public void SetMaterials(int[] material)
\r
134 for (var i = 0; i < material.Length; i++)
\r
135 MaterialHistory[i].Now = material[i];
\r
138 public void SetMaterial(Material m, int v)
\r
141 MaterialHistory[(int)m].Now = v;
\r
144 public void AddMaterials(int[] v)
\r
147 for (var i = 0; i < v.Length; i++)
\r
148 MaterialHistory[i].Now += v[i];
\r
151 public void SubMaterial(Material m, int v)
\r
154 MaterialHistory[(int)m].Now -= v;
\r
157 public void SaveState(Status status)
\r
160 status.MaterialHistory = MaterialHistory.ToList();
\r
163 public void LoadState(Status status)
\r
165 status.MaterialHistory?.CopyTo(MaterialHistory, 0);
\r
170 public enum Material
\r
182 public class MaterialCount
\r
186 public int BegOfDay { get; set; }
\r
187 public int BegOfWeek { get; set; }
\r
188 public DateTime LastSet { get; set; }
\r
190 public bool NeedSave { get; set; }
\r
199 if (Status.Restoring) // JSONから値を復旧するときは履歴に触らない
\r
203 if (LastSet == DateTime.MinValue)
\r
205 BegOfDay = BegOfWeek = value;
\r
206 LastSet = DateTime.Now;
\r
209 UpdateHistory(prev);
\r
210 LastSet = DateTime.Now;
\r
214 private void UpdateHistory(int prev)
\r
216 var morning = DateTime.Today.AddHours(5);
\r
217 var dow = (int)morning.DayOfWeek;
\r
218 var monday = morning.AddDays(dow == 0 ? -6 : -dow + 1);
\r
219 if (DateTime.Now >= morning && LastSet < morning)
\r
221 if (DateTime.Now >= monday && LastSet < monday)
\r