OSDN Git Service

ItemInfoから資材関連をMaterialInfoに分離する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Thu, 8 Oct 2015 13:09:37 +0000 (22:09 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 17 Oct 2015 06:18:05 +0000 (15:18 +0900)
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer/DockInfo.cs
KancolleSniffer/ItemInfo.cs
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/Logger.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/MaterialInfo.cs [new file with mode: 0644]
KancolleSniffer/ShipInfo.cs
KancolleSniffer/Sniffer.cs

index feb5131..b0855b6 100644 (file)
@@ -379,7 +379,7 @@ namespace KancolleSniffer.Test
         {\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
@@ -404,7 +404,7 @@ namespace KancolleSniffer.Test
             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
@@ -436,7 +436,7 @@ namespace KancolleSniffer.Test
             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
index d7570a5..aed4133 100644 (file)
@@ -25,15 +25,15 @@ namespace KancolleSniffer
     {\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
@@ -59,12 +59,12 @@ namespace KancolleSniffer
             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
@@ -74,7 +74,7 @@ namespace KancolleSniffer
             _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
index e5e85ee..33621ea 100644 (file)
@@ -15,7 +15,6 @@
 // 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
@@ -199,14 +198,12 @@ namespace KancolleSniffer
         }\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
@@ -214,18 +211,6 @@ namespace KancolleSniffer
         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
@@ -261,11 +246,6 @@ namespace KancolleSniffer
 \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
@@ -276,54 +256,6 @@ namespace KancolleSniffer
             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
@@ -373,7 +305,6 @@ namespace KancolleSniffer
 \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
@@ -391,13 +322,10 @@ namespace KancolleSniffer
         {\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
@@ -423,16 +351,6 @@ namespace KancolleSniffer
             }\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
@@ -455,71 +373,5 @@ namespace KancolleSniffer
         }\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
index 1a4c479..4221159 100644 (file)
@@ -80,6 +80,7 @@
     </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
index 336549a..09d226c 100644 (file)
@@ -51,6 +51,7 @@ namespace KancolleSniffer
         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
@@ -316,6 +317,11 @@ namespace KancolleSniffer
                 "日付,燃料,弾薬,鋼材,ボーキ,高速建造材,高速修復材,開発資材,改修資材");\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
@@ -338,7 +344,7 @@ namespace KancolleSniffer
             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
index 502ba8d..cb605e7 100644 (file)
@@ -433,7 +433,7 @@ namespace KancolleSniffer
         {\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
@@ -475,7 +475,7 @@ namespace KancolleSniffer
 \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
@@ -491,8 +491,8 @@ namespace KancolleSniffer
             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
diff --git a/KancolleSniffer/MaterialInfo.cs b/KancolleSniffer/MaterialInfo.cs
new file mode 100644 (file)
index 0000000..df4b2c0
--- /dev/null
@@ -0,0 +1,201 @@
+// 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
index 498f754..bbce722 100644 (file)
@@ -303,8 +303,6 @@ namespace KancolleSniffer
                 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
@@ -380,9 +378,6 @@ namespace KancolleSniffer
             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
index bf5d7c2..5087d85 100644 (file)
@@ -25,6 +25,7 @@ namespace KancolleSniffer
     {\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
@@ -60,11 +61,11 @@ namespace KancolleSniffer
         {\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
@@ -106,7 +107,7 @@ namespace KancolleSniffer
             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
@@ -191,17 +192,19 @@ namespace KancolleSniffer
             }\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
@@ -216,6 +219,7 @@ namespace KancolleSniffer
             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
@@ -223,12 +227,15 @@ namespace KancolleSniffer
             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
@@ -324,7 +331,7 @@ namespace KancolleSniffer
             }\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
@@ -365,6 +372,8 @@ namespace KancolleSniffer
 \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