OSDN Git Service

カウンタの実装を変更してShipInfoからItemInfoへの依存をなくす
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Mon, 30 Jul 2018 13:43:48 +0000 (22:43 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Mon, 30 Jul 2018 13:43:48 +0000 (22:43 +0900)
KancolleSniffer.Test/BattleTest.cs
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/MainForm.cs
KancolleSniffer/Model/AlarmCounter.cs [new file with mode: 0644]
KancolleSniffer/Model/Inventry.cs
KancolleSniffer/Model/ItemInfo.cs
KancolleSniffer/Model/ShipInfo.cs
KancolleSniffer/Sniffer.cs

index eb63b95..28b05b0 100644 (file)
@@ -13,6 +13,7 @@
 // limitations under the License.\r
 \r
 using System;\r
+using System.Linq;\r
 using ExpressionToCodeLib;\r
 using KancolleSniffer.Model;\r
 using KancolleSniffer.Util;\r
@@ -23,7 +24,11 @@ namespace KancolleSniffer.Test
     [TestClass]\r
     public class BattleTest\r
     {\r
+        private ItemMaster _itemMaster;\r
+        private ItemInventry _itemInventry;\r
         private ItemInfo _itemInfo;\r
+        private ShipMaster _shipMaster;\r
+        private ShipInventry _shipInventry;\r
         private ShipInfo _shipInfo;\r
         private BattleInfo _battleInfo;\r
 \r
@@ -33,11 +38,49 @@ namespace KancolleSniffer.Test
                 return logfile.ReadToEnd().Split(new [] {"\r\n"}, StringSplitOptions.None);\r
         }\r
 \r
+        public void InjectShips(dynamic battle, dynamic item)\r
+        {\r
+            var deck = (int)battle.api_deck_id - 1;\r
+            InjectShips(deck, (int[])battle.api_f_nowhps, (int[])battle.api_f_maxhps, (int[][])item[0]);\r
+            if (battle.api_f_nowhps_combined())\r
+                InjectShips(1, (int[])battle.api_f_nowhps_combined, (int[])battle.api_f_maxhps_combined,\r
+                    (int[][])item[1]);\r
+            foreach (var enemy in (int[])battle.api_ship_ke)\r
+                _shipMaster.InjectSpec(enemy);\r
+            if (battle.api_ship_ke_combined())\r
+            {\r
+                foreach (var enemy in (int[])battle.api_ship_ke_combined)\r
+                    _shipMaster.InjectSpec(enemy);\r
+            }\r
+            _itemInfo.InjectItems(((int[][])battle.api_eSlot).SelectMany(x => x));\r
+            if (battle.api_eSlot_combined())\r
+                _itemInfo.InjectItems(((int[][])battle.api_eSlot_combined).SelectMany(x => x));\r
+        }\r
+\r
+        private void InjectShips(int deck, int[] nowhps, int[] maxhps, int[][] slots)\r
+        {\r
+            var id = _shipInventry.MaxId + 1;\r
+            var ships = nowhps.Zip(maxhps,\r
+                (now, max) => new ShipStatus {Id = id++, NowHp = now, MaxHp = max}).ToArray();\r
+            _shipInfo.Fleets[deck].Deck = (from ship in ships select ship.Id).ToArray();\r
+            _shipInventry.Add(ships);\r
+            foreach (var entry in ships.Zip(slots, (ship, slot) => new {ship, slot}))\r
+            {\r
+                entry.ship.Slot = _itemInfo.InjectItems(entry.slot.Take(5));\r
+                if (entry.slot.Length >= 6)\r
+                    entry.ship.SlotEx = _itemInfo.InjectItems(entry.slot.Skip(5)).First();\r
+            }\r
+        }\r
+\r
         [TestInitialize]\r
         public void Initialize()\r
         {\r
-            _itemInfo = new ItemInfo(new ItemMaster(), new ItemInventry());\r
-            _shipInfo = new ShipInfo(new ShipMaster(), new ShipInventry(), _itemInfo);\r
+            _itemMaster = new ItemMaster();\r
+            _itemInventry = new ItemInventry();\r
+            _itemInfo = new ItemInfo(_itemMaster, _itemInventry);\r
+            _shipInventry = new ShipInventry();\r
+            _shipMaster = new ShipMaster();\r
+            _shipInfo = new ShipInfo(_shipMaster, _shipInventry, _itemInventry);\r
             _battleInfo = new BattleInfo(_shipInfo, _itemInfo);\r
         }\r
 \r
@@ -50,7 +93,7 @@ namespace KancolleSniffer.Test
             var logs = ReadAllLines("damecon_001");\r
             var items = JsonParser.Parse("[[[],[],[],[],[43]]]");\r
             dynamic battle = JsonParser.Parse(logs[2]);\r
-            _shipInfo.InjectShips(battle, items);\r
+            InjectShips(battle, items);\r
             _battleInfo.InspectBattle(logs[0], logs[1], battle);\r
             dynamic result = JsonParser.Parse(logs[5]);\r
             _battleInfo.InspectBattleResult(result);\r
@@ -65,7 +108,7 @@ namespace KancolleSniffer.Test
         {\r
             var logs = ReadAllLines("midnight_002");\r
             var battle = JsonParser.Parse(logs[3]);\r
-            _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+            InjectShips(battle, JsonParser.Parse(logs[0]));\r
             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
             _battleInfo.InspectBattleResult(JsonParser.Parse(logs[6]));\r
             PAssert.That(() => _shipInfo.Fleets[0].Ships[3].NowHp == 12);\r
@@ -81,7 +124,7 @@ namespace KancolleSniffer.Test
         {\r
             var logs = ReadAllLines("friendfleet_001");\r
             var battle = Data(logs[3]);\r
-            _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+            InjectShips(battle, JsonParser.Parse(logs[0]));\r
             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
             _battleInfo.InspectBattle(logs[4], logs[5], Data(logs[6]));\r
             _battleInfo.InspectBattleResult(Data(logs[9]));\r
@@ -96,7 +139,7 @@ namespace KancolleSniffer.Test
         {\r
             var logs = ReadAllLines("ld_airbattle_001");\r
             var battle = Data(logs[3]);\r
-            _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+            InjectShips(battle, JsonParser.Parse(logs[0]));\r
             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
             _battleInfo.InspectBattleResult(Data(logs[6]));\r
             PAssert.That(() => !_battleInfo.DisplayedResultRank.IsError);\r
@@ -110,7 +153,7 @@ namespace KancolleSniffer.Test
         {\r
             var logs = ReadAllLines("ld_airbattle_002");\r
             var battle = Data(logs[3]);\r
-            _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+            InjectShips(battle, JsonParser.Parse(logs[0]));\r
             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
             _battleInfo.InspectBattleResult(Data(logs[6]));\r
             PAssert.That(() => !_battleInfo.DisplayedResultRank.IsError);\r
@@ -124,7 +167,7 @@ namespace KancolleSniffer.Test
         {\r
             var logs = ReadAllLines("damecon_002");\r
             var battle = Data(logs[3]);\r
-            _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+            InjectShips(battle, JsonParser.Parse(logs[0]));\r
             _battleInfo.InspectBattle(logs[1], logs[2], battle);\r
             _battleInfo.InspectBattle(logs[4], logs[5], Data(logs[6]));\r
             _battleInfo.InspectBattleResult(Data(logs[9]));\r
index babbb21..ec9098a 100644 (file)
@@ -566,7 +566,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "powerup_002");\r
-            PAssert.That(() => sniffer.Item.NowShips == 218);\r
+            PAssert.That(() => sniffer.ShipCounter.Now == 218);\r
         }\r
 \r
         /// <summary>\r
@@ -589,10 +589,10 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer1 = new Sniffer();\r
             SniffLogFile(sniffer1, "createitem_001");\r
-            PAssert.That(() => sniffer1.Item.NowEquips == 900);\r
+            PAssert.That(() => sniffer1.ItemCounter.Now == 900);\r
             var sniffer2 = new Sniffer();\r
             SniffLogFile(sniffer2, "createship_001");\r
-            PAssert.That(() => sniffer2.Item.NowEquips == 904);\r
+            PAssert.That(() => sniffer2.ItemCounter.Now == 904);\r
         }\r
 \r
         /// <summary>\r
@@ -601,12 +601,15 @@ namespace KancolleSniffer.Test
         [TestMethod]\r
         public void WarnItemCount()\r
         {\r
+            Action<int> func = i => { };\r
             var sniffer1 = new Sniffer();\r
             SniffLogFile(sniffer1, "item_count_001");\r
-            PAssert.That(() => sniffer1.Item.AlarmEquips, "出撃から母港に戻ったとき");\r
+            func.Invoke(sniffer1.ItemCounter.Now); // Nowを読まないとAlarmが立たない\r
+            PAssert.That(() => sniffer1.ItemCounter.Alarm, "出撃から母港に戻ったとき");\r
             var sniffer2 = new Sniffer();\r
             SniffLogFile(sniffer2, "item_count_002");\r
-            PAssert.That(() => sniffer2.Item.AlarmEquips, "ログインしたとき");\r
+            func.Invoke(sniffer2.ItemCounter.Now);\r
+            PAssert.That(() => sniffer2.ItemCounter.Alarm, "ログインしたとき");\r
         }\r
 \r
         /// <summary>\r
@@ -768,8 +771,8 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "destroyship_001");\r
-            PAssert.That(() => sniffer.Item.NowShips == 250);\r
-            PAssert.That(() => sniffer.Item.NowEquips == 1118);\r
+            PAssert.That(() => sniffer.ShipCounter.Now == 250);\r
+            PAssert.That(() => sniffer.ItemCounter.Now == 1118);\r
             PAssert.That(() => sniffer.Material.Current.Take(4).SequenceEqual(new[] {285615, 286250, 291010, 284744}));\r
         }\r
 \r
@@ -793,7 +796,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "ship2_001");\r
-            PAssert.That(() => sniffer.Item.NowShips == 243);\r
+            PAssert.That(() => sniffer.ShipCounter.Now == 243);\r
         }\r
 \r
         /// <summary>\r
@@ -880,8 +883,8 @@ namespace KancolleSniffer.Test
             var sniffer = new Sniffer();\r
             sniffer.AdditionalData.RecordNumEquips(11, "", 1);\r
             SniffLogFile(sniffer, "dropship_002");\r
-            PAssert.That(() => sniffer.Item.NowShips == 250);\r
-            PAssert.That(() => sniffer.Item.NowEquips == 1159);\r
+            PAssert.That(() => sniffer.ShipCounter.Now == 250);\r
+            PAssert.That(() => sniffer.ItemCounter.Now == 1159);\r
         }\r
     }\r
 }
\ No newline at end of file
index 915081c..e9bddfc 100644 (file)
@@ -56,6 +56,7 @@
   <ItemGroup>\r
     <Compile Include="Model\Achievement.cs" />\r
     <Compile Include="Model\AkashiTimer.cs" />\r
+    <Compile Include="Model\AlarmCounter.cs" />\r
     <Compile Include="Model\AlarmTimer.cs" />\r
     <Compile Include="Model\ItemMaster.cs" />\r
     <Compile Include="Model\Inventry.cs" />\r
index d2063fb..e65597c 100644 (file)
@@ -434,9 +434,9 @@ namespace KancolleSniffer
         private void ApplyConfig()\r
         {\r
             _listForm.TopMost = TopMost = _config.TopMost;\r
-            _sniffer.Item.MarginShips = _config.MarginShips;\r
+            _sniffer.ShipCounter.Margin = _config.MarginShips;\r
             UpdateNumOfShips();\r
-            _sniffer.Item.MarginEquips = _config.MarginEquips;\r
+            _sniffer.ItemCounter.Margin = _config.MarginEquips;\r
             UpdateNumOfEquips();\r
             _sniffer.Achievement.ResetHours = _config.ResetHours;\r
             labelAkashiRepair.Visible = labelAkashiRepairTimer.Visible =\r
@@ -551,27 +551,27 @@ namespace KancolleSniffer
 \r
         private void UpdateNumOfShips()\r
         {\r
-            var item = _sniffer.Item;\r
-            labelNumOfShips.Text = $"{item.NowShips:D}/{item.MaxShips:D}";\r
-            labelNumOfShips.ForeColor = item.TooManyShips ? CUDColor.Red : Color.Black;\r
-            if (item.AlarmShips)\r
+            var ship = _sniffer.ShipCounter;\r
+            labelNumOfShips.Text = $"{ship.Now:D}/{ship.Max:D}";\r
+            labelNumOfShips.ForeColor = ship.TooMany ? CUDColor.Red : Color.Black;\r
+            if (ship.Alarm)\r
             {\r
-                var message = $"残り{_sniffer.Item.MaxShips - _sniffer.Item.NowShips:D}隻";\r
+                var message = $"残り{ship.Rest:D}隻";\r
                 _notificationManager.Enqueue("艦娘数超過", message);\r
-                item.AlarmShips = false;\r
+                ship.Alarm = false;\r
             }\r
         }\r
 \r
         private void UpdateNumOfEquips()\r
         {\r
-            var item = _sniffer.Item;\r
-            labelNumOfEquips.Text = $"{item.NowEquips:D}/{item.MaxEquips:D}";\r
-            labelNumOfEquips.ForeColor = item.TooManyEquips ? CUDColor.Red : Color.Black;\r
-            if (item.AlarmEquips)\r
+            var item = _sniffer.ItemCounter;\r
+            labelNumOfEquips.Text = $"{item.Now:D}/{item.Max:D}";\r
+            labelNumOfEquips.ForeColor = item.TooMany ? CUDColor.Red : Color.Black;\r
+            if (item.Alarm)\r
             {\r
-                var message = $"残り{_sniffer.Item.MaxEquips - _sniffer.Item.NowEquips:D}個";\r
+                var message = $"残り{item.Rest:D}個";\r
                 _notificationManager.Enqueue("装備数超過", message);\r
-                item.AlarmEquips = false;\r
+                item.Alarm = false;\r
             }\r
         }\r
 \r
diff --git a/KancolleSniffer/Model/AlarmCounter.cs b/KancolleSniffer/Model/AlarmCounter.cs
new file mode 100644 (file)
index 0000000..c9828be
--- /dev/null
@@ -0,0 +1,49 @@
+// Copyright (C) 2018 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+//    http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+using System;\r
+\r
+namespace KancolleSniffer.Model\r
+{\r
+    public class AlarmCounter\r
+    {\r
+        private readonly Func<int> _getCount;\r
+        private int _now;\r
+\r
+        public AlarmCounter(Func<int> getCount)\r
+        {\r
+            _getCount = getCount;\r
+        }\r
+\r
+        public int Max { get; set; }\r
+        public int Margin { private get; set; }\r
+        public bool Alarm { get; set; }\r
+        public bool TooMany => Max != 0 && Now >= Max - Margin;\r
+        public int Rest => Max == 0 ? 0 : Max - Now;\r
+\r
+        public int Now\r
+        {\r
+            get\r
+            {\r
+                var prev = _now;\r
+                _now = _getCount();\r
+                if (Max == 0)\r
+                    return _now;\r
+                var limit = Max - Margin;\r
+                Alarm = Alarm || prev < limit && _now >= limit;\r
+                return _now;\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
index 85c8e42..90d79b1 100644 (file)
@@ -45,6 +45,7 @@ namespace KancolleSniffer.Model
     public abstract class Inventry<T>\r
     {\r
         private readonly Dictionary<int, T> _dict = new Dictionary<int, T>();\r
+        private int _inflated;\r
 \r
         protected abstract T CreateDummy(int id);\r
 \r
@@ -57,6 +58,7 @@ namespace KancolleSniffer.Model
         {\r
             _dict.Clear();\r
             _dict[-1] = CreateDummy(-1);\r
+            _inflated = 0;\r
         }\r
 \r
         public virtual T this[int id]\r
@@ -108,7 +110,9 @@ namespace KancolleSniffer.Model
         public IEnumerable<T> AllItems =>\r
             from kv in _dict where kv.Key != -1 select kv.Value;\r
 \r
-        public int Count => _dict.Count - 1;\r
+        public void InflateCount(int count) => _inflated += count;\r
+\r
+        public int Count => _dict.Count + _inflated - 1;\r
 \r
         public int MaxId => Math.Max(_dict.Keys.Max(), 0);\r
     }\r
index 5e05d47..e62905c 100644 (file)
@@ -20,63 +20,20 @@ namespace KancolleSniffer.Model
 {\r
     public class ItemInfo\r
     {\r
-        private int _nowShips, _nowEquips;\r
         private readonly ItemMaster _itemMaster;\r
         private readonly ItemInventry _itemInventry;\r
-        public int MaxShips { get; private set; }\r
-        public int MarginShips { get; set; }\r
-        public bool AlarmShips { get; set; }\r
-        public int MaxEquips { get; private set; }\r
-        public int MarginEquips { get; set; }\r
-        public bool AlarmEquips { get; set; }\r
-\r
-        public int NowShips\r
-        {\r
-            get => _nowShips;\r
-            set\r
-            {\r
-                if (MaxShips != 0)\r
-                {\r
-                    var limit = MaxShips - MarginShips;\r
-                    AlarmShips = AlarmShips || _nowShips < limit && value >= limit;\r
-                }\r
-                _nowShips = value;\r
-            }\r
-        }\r
-\r
-        public bool TooManyShips => MaxShips != 0 && NowShips >= MaxShips - MarginShips;\r
-\r
-        public int NowEquips\r
-        {\r
-            get => _nowEquips;\r
-            set\r
-            {\r
-                if (MaxEquips != 0)\r
-                {\r
-                    var limit = MaxEquips - MarginEquips;\r
-                    AlarmEquips = AlarmEquips || _nowEquips < limit && value >= limit;\r
-                }\r
-                _nowEquips = value;\r
-            }\r
-        }\r
-\r
-        public bool TooManyEquips => MaxEquips != 0 && NowEquips >= MaxEquips - MarginEquips;\r
+        public AlarmCounter Counter { get; }\r
 \r
         public ItemInfo(ItemMaster itemMaster, ItemInventry itemInventry)\r
         {\r
             _itemMaster = itemMaster;\r
             _itemInventry = itemInventry;\r
-            MarginShips = 4;\r
-            MarginEquips = 10;\r
+            Counter = new AlarmCounter(() => _itemInventry.Count) {Margin = 10};\r
         }\r
 \r
         public void InspectBasic(dynamic json)\r
         {\r
-            MaxShips = (int)json.api_max_chara;\r
-            var check = MaxEquips == 0;\r
-            MaxEquips = (int)json.api_max_slotitem;\r
-            if (check)\r
-                AlarmEquips = NowEquips >= MaxEquips - MarginEquips;\r
+            Counter.Max = (int)json.api_max_slotitem;\r
         }\r
 \r
         public void InspectMaster(dynamic json)\r
@@ -100,7 +57,6 @@ namespace KancolleSniffer.Model
                     Alv = entry.api_alv() ? (int)entry.api_alv : 0\r
                 };\r
             }\r
-            NowEquips = _itemInventry.Count;\r
         }\r
 \r
         public void InspectCreateItem(dynamic json)\r
@@ -112,7 +68,6 @@ namespace KancolleSniffer.Model
 \r
         public void InspectGetShip(dynamic json)\r
         {\r
-            NowShips += 1;\r
             if (json.api_slotitem == null) // まるゆにはスロットがない\r
                 return;\r
             InspectSlotItem(json.api_slotitem);\r
@@ -141,7 +96,6 @@ namespace KancolleSniffer.Model
         private void DeleteItems(IEnumerable<int> ids)\r
         {\r
             _itemInventry.Remove(ids);\r
-            NowEquips = _itemInventry.Count;\r
         }\r
 \r
         public ItemSpec GetSpecByItemId(int id) => _itemMaster[id];\r
index 37e30b0..2219ebe 100644 (file)
@@ -28,10 +28,11 @@ namespace KancolleSniffer.Model
         private readonly Fleet[] _fleets;\r
         private readonly ShipMaster _shipMaster;\r
         private readonly ShipInventry _shipInventry;\r
-        private readonly ItemInfo _itemInfo;\r
+        private readonly ItemInventry _itemInventry;\r
         private readonly List<int> _escapedShips = new List<int>();\r
         private ShipStatus[] _battleResult = new ShipStatus[0];\r
         private readonly NumEquipsChecker _numEquipsChecker = new NumEquipsChecker();\r
+        public AlarmCounter Counter { get; }\r
         public int HqLevel { get; private set; }\r
         public ShipStatusPair[] BattleResultDiff { get; private set; } = new ShipStatusPair[0];\r
         public bool IsBattleResultError => BattleResultDiff.Length > 0;\r
@@ -63,12 +64,13 @@ namespace KancolleSniffer.Model
             }\r
         }\r
 \r
-        public ShipInfo(ShipMaster shipMaster, ShipInventry shipInventry, ItemInfo itemInfo)\r
+        public ShipInfo(ShipMaster shipMaster, ShipInventry shipInventry, ItemInventry itemInventry)\r
         {\r
             _shipMaster = shipMaster;\r
             _shipInventry = shipInventry;\r
             _fleets = Enumerable.Range(0, FleetCount).Select((x, i) => new Fleet(this, i)).ToArray();\r
-            _itemInfo = itemInfo;\r
+            _itemInventry = itemInventry;\r
+            Counter = new AlarmCounter(() => _shipInventry.Count){Margin = 4};\r
         }\r
 \r
         public void InspectMaster(dynamic json)\r
@@ -89,7 +91,6 @@ namespace KancolleSniffer.Model
                 InspectBasic(json.api_basic);\r
                 if (json.api_combined_flag())\r
                     _fleets[0].CombinedType = _fleets[1].CombinedType = (CombinedType)(int)json.api_combined_flag;\r
-                _itemInfo.NowShips = ((object[])json.api_ship).Length;\r
                 VerifyBattleResult();\r
             }\r
             else if (json.api_data()) // ship2\r
@@ -105,10 +106,10 @@ namespace KancolleSniffer.Model
                 // ship_deckでドロップ艦を反映する\r
                 if (DropShipId != -1)\r
                 {\r
-                    _itemInfo.NowShips++;\r
+                    _shipInventry.InflateCount(1);\r
                     var num = _shipMaster.GetSpec(DropShipId).NumEquips;\r
                     if (num > 0)\r
-                        _itemInfo.NowEquips += num;\r
+                        _itemInventry.InflateCount(num);\r
                 }\r
             }\r
             else if (json.api_ship()) // getshipとpowerup\r
@@ -189,6 +190,7 @@ namespace KancolleSniffer.Model
         private void InspectBasic(dynamic json)\r
         {\r
             HqLevel = (int)json.api_level;\r
+            Counter.Max = (int)json.api_max_chara;\r
         }\r
 \r
         public void InspectCharge(dynamic json)\r
@@ -263,8 +265,7 @@ namespace KancolleSniffer.Model
             var ships = values["api_id_items"].Split(',').Select(int.Parse).ToArray();\r
             if (!_shipInventry.Contains(ships[0])) // 二重に実行された場合\r
                 return;\r
-            _itemInfo.NowShips -= ships.Length;\r
-            _itemInfo.DeleteItems(ships.SelectMany(id => _shipInventry[id].Slot).ToArray());\r
+            _itemInventry.Remove(ships.SelectMany(id => _shipInventry[id].Slot));\r
             _shipInventry.Remove(ships);\r
             InspectDeck(json.api_deck);\r
             InspectShip(json);\r
@@ -288,9 +289,8 @@ namespace KancolleSniffer.Model
             var delitem = int.Parse(values["api_slot_dest_flag"] ?? "0") == 1;\r
             foreach (var id in values["api_ship_id"].Split(',').Select(int.Parse))\r
             {\r
-                _itemInfo.NowShips--;\r
                 if (delitem)\r
-                    _itemInfo.DeleteItems(_shipInventry[id].AllSlot);\r
+                    _itemInventry.Remove(_shipInventry[id].AllSlot);\r
                 var of = FindFleet(id, out var oi);\r
                 if (of != null)\r
                     WithdrowShip(of, oi);\r
@@ -341,8 +341,8 @@ namespace KancolleSniffer.Model
         {\r
             if (ship.Empty)\r
                 return ship;\r
-            ship.Slot = ship.Slot.Select(item => _itemInfo.GetStatus(item.Id)).ToArray();\r
-            ship.SlotEx = _itemInfo.GetStatus(ship.SlotEx.Id);\r
+            ship.Slot = ship.Slot.Select(item => _itemInventry[item.Id]).ToArray();\r
+            ship.SlotEx = _itemInventry[ship.SlotEx.Id];\r
             ship.Escaped = _escapedShips.Contains(ship.Id);\r
             ship.Fleet = FindFleet(ship.Id, out var idx);\r
             ship.DeckIndex = idx;\r
@@ -354,8 +354,8 @@ namespace KancolleSniffer.Model
             foreach (var ship in _shipInventry.AllShips)\r
             {\r
                 foreach (var item in ship.Slot)\r
-                    _itemInfo.GetStatus(item.Id).Holder = ship;\r
-                _itemInfo.GetStatus(ship.SlotEx.Id).Holder = ship;\r
+                    _itemInventry[item.Id].Holder = ship;\r
+                _itemInventry[ship.SlotEx.Id].Holder = ship;\r
             }\r
         }\r
 \r
@@ -395,39 +395,5 @@ namespace KancolleSniffer.Model
         {\r
             _escapedShips.Clear();\r
         }\r
-\r
-        public void InjectShips(dynamic battle, dynamic item)\r
-        {\r
-            var deck = (int)battle.api_deck_id - 1;\r
-            InjectShips(deck, (int[])battle.api_f_nowhps, (int[])battle.api_f_maxhps, (int[][])item[0]);\r
-            if (battle.api_f_nowhps_combined())\r
-                InjectShips(1, (int[])battle.api_f_nowhps_combined, (int[])battle.api_f_maxhps_combined,\r
-                    (int[][])item[1]);\r
-            foreach (var enemy in (int[])battle.api_ship_ke)\r
-                _shipMaster.InjectSpec(enemy);\r
-            if (battle.api_ship_ke_combined())\r
-            {\r
-                foreach (var enemy in (int[])battle.api_ship_ke_combined)\r
-                    _shipMaster.InjectSpec(enemy);\r
-            }\r
-            _itemInfo.InjectItems(((int[][])battle.api_eSlot).SelectMany(x => x));\r
-            if (battle.api_eSlot_combined())\r
-                _itemInfo.InjectItems(((int[][])battle.api_eSlot_combined).SelectMany(x => x));\r
-        }\r
-\r
-        private void InjectShips(int deck, int[] nowhps, int[] maxhps, int[][] slots)\r
-        {\r
-            var id = _shipInventry.MaxId + 1;\r
-            var ships = nowhps.Zip(maxhps,\r
-                (now, max) => new ShipStatus {Id = id++, NowHp = now, MaxHp = max}).ToArray();\r
-            _fleets[deck].Deck = (from ship in ships select ship.Id).ToArray();\r
-            _shipInventry.Add(ships);\r
-            foreach (var entry in ships.Zip(slots, (ship, slot) => new {ship, slot}))\r
-            {\r
-                entry.ship.Slot = _itemInfo.InjectItems(entry.slot.Take(5));\r
-                if (entry.slot.Length >= 6)\r
-                    entry.ship.SlotEx = _itemInfo.InjectItems(entry.slot.Skip(5)).First();\r
-            }\r
-        }\r
     }\r
 }
\ No newline at end of file
index 02b55cf..e781363 100644 (file)
@@ -80,7 +80,7 @@ namespace KancolleSniffer
         {\r
             _start = start;\r
             _itemInfo = new ItemInfo(_itemMaster, _itemInventry);\r
-            _shipInfo = new ShipInfo(_shipMaster, _shipInventry, _itemInfo);\r
+            _shipInfo = new ShipInfo(_shipMaster, _shipInventry, _itemInventry);\r
             _conditionTimer = new ConditionTimer(_shipInfo);\r
             _dockInfo = new DockInfo(_shipInfo, _materialInfo);\r
             _akashiTimer = new AkashiTimer(_shipInfo, _dockInfo, _presetDeck);\r
@@ -583,6 +583,8 @@ namespace KancolleSniffer
 \r
         public AlarmTimer[] KDock => _dockInfo.KDock;\r
 \r
+        public AlarmCounter ItemCounter => _itemInfo.Counter;\r
+\r
         public ItemInfo Item => _itemInfo;\r
 \r
         public MaterialInfo Material => _materialInfo;\r
@@ -597,6 +599,8 @@ namespace KancolleSniffer
 \r
         public int[] GetConditionNotice(DateTime prev, DateTime now) => _conditionTimer.GetNotice(prev, now);\r
 \r
+        public AlarmCounter ShipCounter => _shipInfo.Counter;\r
+\r
         public Fleet[] Fleets => _shipInfo.Fleets;\r
 \r
         public ShipInfo.ShipStatusPair[] BattleResultStatusDiff => _shipInfo.BattleResultDiff;\r