{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "remodel_slot_001");\r
- PAssert.That(() => sniffer.Item.MaterialHistory.Select(m => m.Now)\r
+ PAssert.That(() => sniffer.Material.Current\r
.SequenceEqual(new[] {25292, 25570, 25244, 41113, 1405, 1525, 2137, 8}));\r
}\r
\r
var result1 = new List<int[]>();\r
SniffLogFile(sniffer1, "material_001", sn =>\r
{\r
- var cur = sn.Item.MaterialHistory.Select(h => h.Now).ToArray();\r
+ var cur = sn.Material.Current;\r
if (result1.Count == 0)\r
{\r
result1.Add(cur);\r
var result2 = new List<int[]>();\r
SniffLogFile(sniffer2, "material_002", sn =>\r
{\r
- var cur = sn.Item.MaterialHistory.Select(h => h.Now).ToArray();\r
+ var cur = sn.Material.Current;\r
if (result2.Count == 0)\r
{\r
result2.Add(cur);\r
{\r
public const int DockCount = 4;\r
private readonly ShipInfo _shipInfo;\r
- private readonly ItemInfo _itemInfo;\r
+ private readonly MaterialInfo _materialInfo;\r
private readonly int[] _ndoc = new int[DockCount];\r
private readonly RingTimer[] _ndocTimers = new RingTimer[DockCount];\r
private readonly RingTimer[] _kdocTimers = new RingTimer[DockCount];\r
\r
- public DockInfo(ShipInfo shipInfo, ItemInfo itemInfo)\r
+ public DockInfo(ShipInfo ship, MaterialInfo material)\r
{\r
- _shipInfo = shipInfo;\r
- _itemInfo = itemInfo;\r
+ _shipInfo = ship;\r
+ _materialInfo = material;\r
for (var i = 0; i < _ndocTimers.Length; i++)\r
_ndocTimers[i] = new RingTimer();\r
for (var i = 0; i < _kdocTimers.Length; i++)\r
var id = int.Parse(values["api_ship_id"]);\r
int fuel, steal;\r
_shipInfo[id].CalcMaterialsToRepair(out fuel, out steal);\r
- _itemInfo.SubMaterial(Material.Fuel, fuel);\r
- _itemInfo.SubMaterial(Material.Steal, steal);\r
+ _materialInfo.SubMaterial(Material.Fuel, fuel);\r
+ _materialInfo.SubMaterial(Material.Steal, steal);\r
if (int.Parse(values["api_highspeed"]) == 0)\r
return;\r
_shipInfo.RepairShip(id);\r
- _itemInfo.SubMaterial(Material.Bucket, 1);\r
+ _materialInfo.SubMaterial(Material.Bucket, 1);\r
}\r
\r
public void InspectSpeedChange(string request)\r
_shipInfo.RepairShip(_ndoc[dock]);\r
_ndoc[dock] = 0;\r
_ndocTimers[dock].SetEndTime(0);\r
- _itemInfo.SubMaterial(Material.Bucket, 1);\r
+ _materialInfo.SubMaterial(Material.Bucket, 1);\r
}\r
\r
public NameAndTimer[] NDock\r
// You should have received a copy of the GNU General Public License\r
// along with this program; if not, see <http://www.gnu.org/licenses/>.\r
\r
-using System;\r
using System.Collections.Generic;\r
using System.Drawing;\r
using System.Linq;\r
}\r
}\r
\r
- public class ItemInfo : IHaveState\r
+ public class ItemInfo\r
{\r
private int _nowShips, _nowEquips;\r
private readonly Dictionary<int, ItemSpec> _itemSpecs = new Dictionary<int, ItemSpec>();\r
private readonly Dictionary<int, ItemStatus> _itemInfo = new Dictionary<int, ItemStatus>();\r
private readonly Dictionary<int, string> _useItemName = new Dictionary<int, string>();\r
- private bool _inPort;\r
- private DateTime _lastMission;\r
\r
public int MaxShips { get; private set; }\r
public int MarginShips { get; set; }\r
public int MaxEquips { get; private set; }\r
public int MarginEquips { get; set; }\r
public bool RingEquips { get; set; }\r
- public MaterialCount[] MaterialHistory { get; }\r
- public int[] PrevPort { get; }\r
-\r
- public bool NeedSave\r
- {\r
- get { return MaterialHistory.Any(m => m.NeedSave); }\r
- private set\r
- {\r
- foreach (var m in MaterialHistory)\r
- m.NeedSave = value;\r
- }\r
- }\r
\r
public int NowShips\r
{\r
\r
public ItemInfo()\r
{\r
- var n = Enum.GetValues(typeof(Material)).Length;\r
- MaterialHistory = new MaterialCount[n];\r
- for (var i = 0; i < n; i++)\r
- MaterialHistory[i] = new MaterialCount();\r
- PrevPort = new int[n];\r
MarginShips = 4;\r
MarginEquips = 10;\r
}\r
MaxEquips = (int)json.api_max_slotitem;\r
}\r
\r
- public void InspectMaterial(dynamic json, bool port = false)\r
- {\r
- if (!port)\r
- UpdatePrevPort();\r
- foreach (var entry in json)\r
- {\r
- var i = (int)entry.api_id - 1;\r
- var v = (int)entry.api_value;\r
- MaterialHistory[i].Now = v;\r
- }\r
- if (!port)\r
- return;\r
- _inPort = true;\r
- if (PrevPort[0] != 0)\r
- return;\r
- for (var i = 0; i < MaterialHistory.Length; i++)\r
- PrevPort[i] = MaterialHistory[i].Now;\r
- }\r
-\r
- private void UpdatePrevPort()\r
- {\r
- if (!_inPort)\r
- return;\r
- for (var i = 0; i < MaterialHistory.Length; i++)\r
- PrevPort[i] = MaterialHistory[i].Now;\r
- _inPort = false;\r
- }\r
-\r
- public void SetMaterials(int[] material)\r
- {\r
- UpdatePrevPort();\r
- for (var i = 0; i < material.Length; i++)\r
- MaterialHistory[i].Now = material[i];\r
- }\r
-\r
- public void AddMaterials(int[] v)\r
- {\r
- UpdatePrevPort();\r
- for (var i = 0; i < v.Length; i++)\r
- MaterialHistory[i].Now += v[i];\r
- }\r
-\r
- public void SubMaterial(Material m, int v)\r
- {\r
- UpdatePrevPort();\r
- MaterialHistory[(int)m].Now -= v;\r
- }\r
-\r
public void InspectMaster(dynamic json)\r
{\r
var dict = new Dictionary<int, string>();\r
\r
public void InspectCreateItem(dynamic json)\r
{\r
- SetMaterials((int[])json.api_material);\r
if (!json.IsDefined("api_slot_item"))\r
return;\r
InspectSlotItem(json.api_slot_item);\r
{\r
var values = HttpUtility.ParseQueryString(request);\r
DeleteItems(values["api_slotitem_ids"].Split(',').Select(int.Parse).ToArray());\r
- AddMaterials((int[])json.api_get_material);\r
}\r
\r
public void InspectRemodelSlot(dynamic json)\r
{\r
- var after = (int[])json.api_after_material;\r
- SetMaterials(after);\r
if (json.api_after_slot())\r
InspectSlotItem(json.api_after_slot);\r
if (!json.api_use_slot_id())\r
}\r
}\r
\r
- public void InspectMissionResult(dynamic json)\r
- {\r
- if ((int)json.api_clear_result == 0) // 失敗\r
- return;\r
- if (DateTime.Now - _lastMission < TimeSpan.FromMinutes(1))\r
- _inPort = false;\r
- _lastMission = DateTime.Now;\r
- AddMaterials((int[])json.api_get_material);\r
- }\r
-\r
public ItemSpec this[int id] => GetSpecById(id);\r
\r
public ItemSpec GetSpecById(int id) => _itemInfo[id].Spec;\r
}\r
\r
public string GetUseItemName(int id) => _useItemName[id];\r
-\r
- public void SaveState(Status status)\r
- {\r
- NeedSave = false;\r
- status.MatreialHistory = MaterialHistory;\r
- }\r
-\r
- public void LoadState(Status status)\r
- {\r
- status.MatreialHistory?.CopyTo(MaterialHistory, 0);\r
- }\r
- }\r
-\r
- public enum Material\r
- {\r
- Fuel,\r
- Bullet,\r
- Steal,\r
- Bouxite,\r
- Burner,\r
- Bucket,\r
- Development,\r
- Screw,\r
- }\r
-\r
- public class MaterialCount\r
- {\r
- private int _now;\r
-\r
- public int BegOfDay { get; set; }\r
- public int BegOfWeek { get; set; }\r
- public DateTime LastSet { get; set; }\r
- public bool NeedSave { get; set; }\r
-\r
- public int Now\r
- {\r
- get { return _now; }\r
- set\r
- {\r
- var prev = _now;\r
- _now = value;\r
- if (Status.Restoring) // JSONから値を復旧するときは履歴に触らない\r
- return;\r
- if (_now != prev)\r
- NeedSave = true;\r
- if (LastSet == DateTime.MinValue)\r
- {\r
- BegOfDay = BegOfWeek = value;\r
- LastSet = DateTime.Now;\r
- return;\r
- }\r
- UpdateHistory(prev);\r
- LastSet = DateTime.Now;\r
- }\r
- }\r
-\r
- private void UpdateHistory(int prev)\r
- {\r
- var morning = DateTime.Today.AddHours(5);\r
- var dow = (int)morning.DayOfWeek;\r
- var monday = morning.AddDays(dow == 0 ? -6 : -dow + 1);\r
- if (DateTime.Now >= morning && LastSet < morning)\r
- BegOfDay = prev;\r
- if (DateTime.Now >= monday && LastSet < monday)\r
- BegOfWeek = prev;\r
- }\r
}\r
}
\ No newline at end of file
</Compile>\r
<Compile Include="Logger.cs" />\r
<Compile Include="LogServer.cs" />\r
+ <Compile Include="MaterialInfo.cs" />\r
<Compile Include="MiscTextInfo.cs" />\r
<Compile Include="MissingData.cs" />\r
<Compile Include="ShipLabels.cs" />\r
private dynamic _basic;\r
private int _kdockId;\r
private DateTime _prevTime;\r
+ private int[] _currentMaterial;\r
private int _materialLogInterval = 10;\r
private bool _start;\r
\r
"日付,燃料,弾薬,鋼材,ボーキ,高速建造材,高速修復材,開発資材,改修資材");\r
}\r
\r
+ public void SetCurrentMaterial(int[] material)\r
+ {\r
+ _currentMaterial = material;\r
+ }\r
+\r
public void InspectRemodelSlot(string request, dynamic json)\r
{\r
if ((_logType & LogType.RemodelSlot) == 0)\r
var after = (int[])json.api_after_material;\r
var diff = new int[after.Length];\r
for (var i = 0; i < after.Length; i++)\r
- diff[i] = _itemInfo.MaterialHistory[i].Now - after[i];\r
+ diff[i] = _currentMaterial[i] - after[i];\r
var ship1 = Secretary();\r
var ship2 = "";\r
var ships = _shipInfo.GetShipStatuses(0);\r
{\r
UpdateNumOfShips();\r
UpdateNumOfEquips();\r
- labelNumOfBuckets.Text = _sniffer.Item.MaterialHistory[(int)Material.Bucket].Now.ToString("D");\r
+ labelNumOfBuckets.Text = _sniffer.Material.MaterialHistory[(int)Material.Bucket].Now.ToString("D");\r
UpdateBucketHistory();\r
var ac = _sniffer.Achievement.Value;\r
if (ac >= 10000)\r
\r
private void UpdateBucketHistory()\r
{\r
- var count = _sniffer.Item.MaterialHistory[(int)Material.Bucket];\r
+ var count = _sniffer.Material.MaterialHistory[(int)Material.Bucket];\r
var day = count.Now - count.BegOfDay;\r
var week = count.Now - count.BegOfWeek;\r
if (day >= 1000)\r
var text = new[] {"燃料", "弾薬", "鋼材", "ボーキ"};\r
for (var i = 0; i < labels.Length; i++)\r
{\r
- var count = _sniffer.Item.MaterialHistory[i];\r
- var port = count.Now - _sniffer.Item.PrevPort[i];\r
+ var count = _sniffer.Material.MaterialHistory[i];\r
+ var port = count.Now - _sniffer.Material.PrevPort[i];\r
if (port >= 100000)\r
port = 99999;\r
var day = count.Now - count.BegOfDay;\r
--- /dev/null
+// Copyright (C) 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+// \r
+// This program is part of KancolleSniffer.\r
+//\r
+// KancolleSniffer is free software: you can redistribute it and/or modify\r
+// it under the terms of the GNU General Public License as published by\r
+// the Free Software Foundation, either version 3 of the License, or\r
+// (at your option) any later version.\r
+//\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+// GNU General Public License for more details.\r
+//\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, see <http://www.gnu.org/licenses/>.\r
+\r
+using System;\r
+using System.Linq;\r
+\r
+namespace KancolleSniffer\r
+{\r
+ public class MaterialInfo : IHaveState\r
+ {\r
+ private bool _inPort;\r
+ private DateTime _lastMission;\r
+\r
+ public MaterialCount[] MaterialHistory { get; }\r
+ public int[] PrevPort { get; }\r
+ public int[] Current => MaterialHistory.Select(h => h.Now).ToArray();\r
+\r
+ public MaterialInfo()\r
+ {\r
+ var n = Enum.GetValues(typeof(Material)).Length;\r
+ MaterialHistory = new MaterialCount[n];\r
+ for (var i = 0; i < n; i++)\r
+ MaterialHistory[i] = new MaterialCount();\r
+ PrevPort = new int[n];\r
+ }\r
+\r
+ public bool NeedSave\r
+ {\r
+ get { return MaterialHistory.Any(m => m.NeedSave); }\r
+ private set\r
+ {\r
+ foreach (var m in MaterialHistory)\r
+ m.NeedSave = value;\r
+ }\r
+ }\r
+\r
+ public void InspectMaterial(dynamic json, bool port = false)\r
+ {\r
+ if (!port)\r
+ UpdatePrevPort();\r
+ foreach (var entry in json)\r
+ {\r
+ var i = (int)entry.api_id - 1;\r
+ var v = (int)entry.api_value;\r
+ MaterialHistory[i].Now = v;\r
+ }\r
+ if (!port)\r
+ return;\r
+ _inPort = true;\r
+ if (PrevPort[0] != 0)\r
+ return;\r
+ for (var i = 0; i < MaterialHistory.Length; i++)\r
+ PrevPort[i] = MaterialHistory[i].Now;\r
+ }\r
+\r
+ private void UpdatePrevPort()\r
+ {\r
+ if (!_inPort)\r
+ return;\r
+ for (var i = 0; i < MaterialHistory.Length; i++)\r
+ PrevPort[i] = MaterialHistory[i].Now;\r
+ _inPort = false;\r
+ }\r
+\r
+ public void InspectCharge(dynamic json)\r
+ {\r
+ SetMaterials((int[])json.api_material);\r
+ }\r
+\r
+ public void InspectMissionResult(dynamic json)\r
+ {\r
+ if ((int)json.api_clear_result == 0) // 失敗\r
+ return;\r
+ if (DateTime.Now - _lastMission < TimeSpan.FromMinutes(1))\r
+ _inPort = false;\r
+ _lastMission = DateTime.Now;\r
+ AddMaterials((int[])json.api_get_material);\r
+ }\r
+\r
+ public void InspectDestroyShip(dynamic json)\r
+ {\r
+ SetMaterials((int[])json.api_material);\r
+ }\r
+\r
+ public void InspectCreateIem(dynamic json)\r
+ {\r
+ SetMaterials((int[])json.api_material);\r
+ }\r
+\r
+ public void InspectDestroyItem(dynamic json)\r
+ {\r
+ AddMaterials((int[])json.api_get_material);\r
+ }\r
+\r
+ public void InspectRemodelSlot(dynamic json)\r
+ {\r
+ SetMaterials((int[])json.api_after_material);\r
+ }\r
+\r
+ public void SetMaterials(int[] material)\r
+ {\r
+ UpdatePrevPort();\r
+ for (var i = 0; i < material.Length; i++)\r
+ MaterialHistory[i].Now = material[i];\r
+ }\r
+\r
+ public void AddMaterials(int[] v)\r
+ {\r
+ UpdatePrevPort();\r
+ for (var i = 0; i < v.Length; i++)\r
+ MaterialHistory[i].Now += v[i];\r
+ }\r
+\r
+ public void SubMaterial(Material m, int v)\r
+ {\r
+ UpdatePrevPort();\r
+ MaterialHistory[(int)m].Now -= v;\r
+ }\r
+\r
+ public void SaveState(Status status)\r
+ {\r
+ NeedSave = false;\r
+ status.MatreialHistory = MaterialHistory;\r
+ }\r
+\r
+ public void LoadState(Status status)\r
+ {\r
+ status.MatreialHistory?.CopyTo(MaterialHistory, 0);\r
+ }\r
+ }\r
+\r
+\r
+ public enum Material\r
+ {\r
+ Fuel,\r
+ Bullet,\r
+ Steal,\r
+ Bouxite,\r
+ Burner,\r
+ Bucket,\r
+ Development,\r
+ Screw,\r
+ }\r
+\r
+ public class MaterialCount\r
+ {\r
+ private int _now;\r
+\r
+ public int BegOfDay { get; set; }\r
+ public int BegOfWeek { get; set; }\r
+ public DateTime LastSet { get; set; }\r
+ public bool NeedSave { get; set; }\r
+\r
+ public int Now\r
+ {\r
+ get { return _now; }\r
+ set\r
+ {\r
+ var prev = _now;\r
+ _now = value;\r
+ if (Status.Restoring) // JSONから値を復旧するときは履歴に触らない\r
+ return;\r
+ if (_now != prev)\r
+ NeedSave = true;\r
+ if (LastSet == DateTime.MinValue)\r
+ {\r
+ BegOfDay = BegOfWeek = value;\r
+ LastSet = DateTime.Now;\r
+ return;\r
+ }\r
+ UpdateHistory(prev);\r
+ LastSet = DateTime.Now;\r
+ }\r
+ }\r
+\r
+ private void UpdateHistory(int prev)\r
+ {\r
+ var morning = DateTime.Today.AddHours(5);\r
+ var dow = (int)morning.DayOfWeek;\r
+ var monday = morning.AddDays(dow == 0 ? -6 : -dow + 1);\r
+ if (DateTime.Now >= morning && LastSet < morning)\r
+ BegOfDay = prev;\r
+ if (DateTime.Now >= monday && LastSet < monday)\r
+ BegOfWeek = prev;\r
+ }\r
+ }\r
+}
\ No newline at end of file
status.Fuel = (int)entry.api_fuel;\r
status.OnSlot = (from num in (dynamic[])entry.api_onslot select (int)num).ToArray();\r
}\r
- var material = (int[])json.api_material;\r
- _itemInfo.SetMaterials(material);\r
}\r
\r
public void InspectChange(string request)\r
if (of != -1)\r
WithdrowShip(of, oi);\r
_shipInfo.Remove(ship);\r
-\r
- var material = (int[])json.api_material;\r
- _itemInfo.SetMaterials(material);\r
}\r
\r
public void StartSortie(string request)\r
{\r
private bool _start;\r
private readonly ItemInfo _itemInfo = new ItemInfo();\r
+ private readonly MaterialInfo _materialInfo = new MaterialInfo();\r
private readonly QuestInfo _questInfo = new QuestInfo();\r
private readonly MissionInfo _missionInfo = new MissionInfo();\r
private readonly ShipInfo _shipInfo;\r
{\r
_shipInfo = new ShipInfo(_itemInfo);\r
_conditionTimer = new ConditionTimer(_shipInfo);\r
- _dockInfo = new DockInfo(_shipInfo, _itemInfo);\r
+ _dockInfo = new DockInfo(_shipInfo, _materialInfo);\r
_akashiTimer = new AkashiTimer(_shipInfo, _itemInfo, _dockInfo);\r
_battleInfo = new BattleInfo(_shipInfo, _itemInfo);\r
_logger = new Logger(_shipInfo, _itemInfo, _battleInfo);\r
- _haveState = new List<IHaveState> {_achievement, _itemInfo, _conditionTimer, _exMapInfo};\r
+ _haveState = new List<IHaveState> {_achievement, _materialInfo, _conditionTimer, _exMapInfo};\r
}\r
\r
private void SaveState()\r
if (url.EndsWith("api_port/port"))\r
{\r
_itemInfo.InspectBasic(data.api_basic);\r
- _itemInfo.InspectMaterial(data.api_material, true);\r
+ _materialInfo.InspectMaterial(data.api_material, true);\r
_logger.InspectBasic(data.api_basic);\r
_logger.InspectMaterial(data.api_material);\r
_shipInfo.InspectShip(data);\r
}\r
if (url.EndsWith("api_get_member/material"))\r
{\r
- _itemInfo.InspectMaterial(data);\r
+ _materialInfo.InspectMaterial(data);\r
return Update.Item;\r
}\r
if (url.EndsWith("api_req_hokyu/charge"))\r
{\r
_shipInfo.InspectCharge(data);\r
+ _materialInfo.InspectCharge(data);\r
return Update.Item | Update.Ship;\r
}\r
if (url.EndsWith("api_req_kousyou/createitem"))\r
{\r
_itemInfo.InspectCreateItem(data);\r
+ _materialInfo.InspectCreateIem(data);\r
_logger.InspectCreateItem(request, data);\r
return Update.Item;\r
}\r
if (url.EndsWith("api_req_kousyou/destroyship"))\r
{\r
_shipInfo.InspectDestroyShip(request, data);\r
+ _materialInfo.InspectDestroyShip(data);\r
_conditionTimer.CheckCond();\r
_akashiTimer.SetTimer();\r
return Update.Item | Update.Ship;\r
if (url.EndsWith("api_req_kousyou/destroyitem2"))\r
{\r
_itemInfo.InspectDestroyItem(request, data);\r
+ _materialInfo.InspectDestroyItem(data);\r
return Update.Item;\r
}\r
if (url.EndsWith("api_req_kousyou/remodel_slot"))\r
{\r
- _logger.InspectRemodelSlot(request, data); // 資材の差が必要なので_itemInfoより前\r
+ _logger.SetCurrentMaterial(_materialInfo.Current);\r
+ _logger.InspectRemodelSlot(request, data); // 資材の差が必要なので_materialInfoより前\r
_itemInfo.InspectRemodelSlot(data);\r
+ _materialInfo.InspectRemodelSlot(data);\r
return Update.Item;\r
}\r
if (url.EndsWith("api_req_kousyou/createship"))\r
}\r
if (url.EndsWith("api_req_mission/result"))\r
{\r
- _itemInfo.InspectMissionResult(data);\r
+ _materialInfo.InspectMissionResult(data);\r
_logger.InspectMissionResult(data);\r
return Update.Item;\r
}\r
\r
public ItemInfo Item => _itemInfo;\r
\r
+ public MaterialInfo Material => _materialInfo;\r
+\r
public QuestStatus[] Quests => _questInfo.Quests;\r
\r
public NameAndTimer[] Missions => _missionInfo.Missions;\r