OSDN Git Service

ship_deckでShipStatusを更新するときにフラグを引き継げるようにする
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Mon, 15 Oct 2018 14:16:10 +0000 (23:16 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 26 Oct 2018 14:12:52 +0000 (23:12 +0900)
KancolleSniffer/Model/ShipInfo.cs
KancolleSniffer/Sniffer.cs

index 91e8cc3..a33b597 100644 (file)
@@ -27,7 +27,6 @@ namespace KancolleSniffer.Model
         private readonly ShipMaster _shipMaster;\r
         private readonly ShipInventory _shipInventory;\r
         private readonly ItemInventory _itemInventory;\r
-        private readonly List<int> _escapedShips = new List<int>();\r
         private ShipStatus[] _battleResult = new ShipStatus[0];\r
         private readonly NumEquipsChecker _numEquipsChecker = new NumEquipsChecker();\r
         private int _hqLevel;\r
@@ -77,44 +76,101 @@ namespace KancolleSniffer.Model
             _shipInventory.Clear();\r
         }\r
 \r
-        public void InspectShip(dynamic json)\r
+        public void InspectShip(string url, dynamic json)\r
         {\r
-            if (json.api_deck_port()) // port\r
+            if (url.Contains("port"))\r
             {\r
-                _shipInventory.Clear();\r
-                _escapedShips.Clear();\r
-                for (var i = 0; i < FleetCount; i++)\r
-                    _fleets[i].State = FleetState.Port;\r
-                InspectShipDataAndDeck(json.api_ship, json.api_deck_port);\r
-                InspectBasic(json.api_basic);\r
-                if (json.api_combined_flag())\r
-                    _fleets[0].CombinedType = _fleets[1].CombinedType = (CombinedType)(int)json.api_combined_flag;\r
-                VerifyBattleResult();\r
+                HandlePort(json);\r
             }\r
-            else if (json.api_data()) // ship2\r
+            else if (url.Contains("ship2"))\r
             {\r
-                InspectShipDataAndDeck(json.api_data, json.api_data_deck);\r
+                FillShipData(json.api_data, json.api_data_deck);\r
             }\r
-            else if (json.api_ship_data()) // ship3とship_deck\r
+            else if (url.Contains("ship3"))\r
             {\r
-                InspectShipDataAndDeck(json.api_ship_data, json.api_deck_data);\r
-                VerifyBattleResult();\r
-                // ship_deckでドロップ艦を反映する\r
-                if (DropShipId != -1)\r
-                {\r
-                    _shipInventory.InflateCount(1);\r
-                    var num = _shipMaster.GetSpec(DropShipId).NumEquips;\r
-                    if (num > 0)\r
-                        _itemInventory.InflateCount(num);\r
-                }\r
+                FillShipData(json.api_ship_data, json.api_deck_data);\r
             }\r
-            else if (json.api_ship()) // getship\r
+            else if (url.Contains("ship_deck"))\r
             {\r
-                InspectShipData(new[] {json.api_ship});\r
+                HandleShipDeck(json);\r
+            }\r
+            else if (url.Contains("getship")) // getship\r
+            {\r
+                HandleGetShip(json);\r
             }\r
             DropShipId = -1;\r
         }\r
 \r
+        private void HandlePort(dynamic json)\r
+        {\r
+            _shipInventory.Clear();\r
+            for (var i = 0; i < FleetCount; i++)\r
+                _fleets[i].State = FleetState.Port;\r
+            FillPortShipData(json);\r
+            InspectBasic(json.api_basic);\r
+            if (json.api_combined_flag())\r
+                _fleets[0].CombinedType = _fleets[1].CombinedType = (CombinedType)(int)json.api_combined_flag;\r
+            VerifyBattleResult();\r
+        }\r
+\r
+        private void FillPortShipData(dynamic json)\r
+        {\r
+            foreach (var entry in json.api_ship)\r
+            {\r
+                var ship = (ShipStatus)CreateShipStatus(entry);\r
+                _shipInventory.Add(ship);\r
+                _numEquipsChecker.Check(ship);\r
+            }\r
+            _numEquipsChecker.MaxId = _shipInventory.MaxId;\r
+            InspectDeck(json.api_deck_port);\r
+        }\r
+\r
+        private void HandleShipDeck(dynamic json)\r
+        {\r
+            FillShipDeckShipData(json);\r
+            VerifyBattleResult();\r
+            // ドロップ艦を反映する\r
+            if (DropShipId != -1)\r
+            {\r
+                _shipInventory.InflateCount(1);\r
+                var num = _shipMaster.GetSpec(DropShipId).NumEquips;\r
+                if (num > 0)\r
+                    _itemInventory.InflateCount(num);\r
+            }\r
+        }\r
+\r
+        private void FillShipDeckShipData(dynamic json)\r
+        {\r
+            foreach (var entry in json.api_ship_data)\r
+            {\r
+                var ship = (ShipStatus)CreateShipStatus(entry);\r
+                var org = _shipInventory[ship.Id];\r
+                ship.Escaped = org.Escaped; // 出撃中は継続する\r
+                _shipInventory.Add(ship);\r
+            }\r
+            InspectDeck(json.api_deck_data);\r
+        }\r
+\r
+        private void FillShipData(dynamic ship, dynamic deck)\r
+        {\r
+            FillShips(ship);\r
+            InspectDeck(deck); // FleetのDeckを設定した時点でShipStatusを取得するので必ずdeckが後\r
+        }\r
+\r
+        private void HandleGetShip(dynamic json)\r
+        {\r
+            var ship = CreateShipStatus(json.api_ship);\r
+            _shipInventory.Add(ship);\r
+            _numEquipsChecker.Check(ship);\r
+            _numEquipsChecker.MaxId = _shipInventory.MaxId;\r
+        }\r
+\r
+        private void FillShips(dynamic json)\r
+        {\r
+            foreach (var entry in json)\r
+                _shipInventory.Add(CreateShipStatus(entry));\r
+        }\r
+\r
         public void SaveBattleResult()\r
         {\r
             _battleResult = _fleets.Where(fleet =>\r
@@ -142,12 +198,6 @@ namespace KancolleSniffer.Model
                 .SelectMany(fleet => fleet.Ships.Select(ship => (ShipStatus)ship.Clone())).ToArray();\r
         }\r
 \r
-        private void InspectShipDataAndDeck(dynamic ship, dynamic deck)\r
-        {\r
-            InspectShipData(ship);\r
-            InspectDeck(deck); // FleetのDeckを設定した時点でShipStatusを取得するので必ずdeckが後\r
-        }\r
-\r
         public void InspectDeck(dynamic json)\r
         {\r
             foreach (var entry in json)\r
@@ -159,41 +209,33 @@ namespace KancolleSniffer.Model
             }\r
         }\r
 \r
-        private void InspectShipData(dynamic json)\r
+        private ShipStatus CreateShipStatus(dynamic entry)\r
         {\r
-            foreach (var entry in json)\r
+            return new ShipStatus\r
             {\r
-                var id = (int)entry.api_id;\r
-                var ship = new ShipStatus\r
-                {\r
-                    Id = id,\r
-                    Spec = _shipMaster.GetSpec((int)entry.api_ship_id),\r
-                    Level = (int)entry.api_lv,\r
-                    ExpToNext = (int)entry.api_exp[1],\r
-                    MaxHp = (int)entry.api_maxhp,\r
-                    NowHp = (int)entry.api_nowhp,\r
-                    Cond = (int)entry.api_cond,\r
-                    Fuel = (int)entry.api_fuel,\r
-                    Bull = (int)entry.api_bull,\r
-                    OnSlot = (int[])entry.api_onslot,\r
-                    GetItem = item => _itemInventory[item.Id],\r
-                    Slot = ((int[])entry.api_slot).Select(item => new ItemStatus(item)).ToArray(),\r
-                    SlotEx = entry.api_slot_ex() ? new ItemStatus((int)entry.api_slot_ex) : new ItemStatus(0),\r
-                    NdockTime = (int)entry.api_ndock_time,\r
-                    NdockItem = (int[])entry.api_ndock_item,\r
-                    LoS = (int)entry.api_sakuteki[0],\r
-                    Firepower = (int)entry.api_karyoku[0],\r
-                    Torpedo = (int)entry.api_raisou[0],\r
-                    AntiSubmarine = (int)entry.api_taisen[0],\r
-                    AntiAir = (int)entry.api_taiku[0],\r
-                    Lucky = (int)entry.api_lucky[0],\r
-                    Locked = entry.api_locked() && entry.api_locked == 1,\r
-                    Escaped = _escapedShips.Contains(id)\r
-                };\r
-                _shipInventory.Add(ship);\r
-                _numEquipsChecker.Check(ship);\r
-            }\r
-            _numEquipsChecker.MaxId = _shipInventory.MaxId;\r
+                Id = (int)entry.api_id,\r
+                Spec = _shipMaster.GetSpec((int)entry.api_ship_id),\r
+                Level = (int)entry.api_lv,\r
+                ExpToNext = (int)entry.api_exp[1],\r
+                MaxHp = (int)entry.api_maxhp,\r
+                NowHp = (int)entry.api_nowhp,\r
+                Cond = (int)entry.api_cond,\r
+                Fuel = (int)entry.api_fuel,\r
+                Bull = (int)entry.api_bull,\r
+                OnSlot = (int[])entry.api_onslot,\r
+                GetItem = item => _itemInventory[item.Id],\r
+                Slot = ((int[])entry.api_slot).Select(item => new ItemStatus(item)).ToArray(),\r
+                SlotEx = entry.api_slot_ex() ? new ItemStatus((int)entry.api_slot_ex) : new ItemStatus(0),\r
+                NdockTime = (int)entry.api_ndock_time,\r
+                NdockItem = (int[])entry.api_ndock_item,\r
+                LoS = (int)entry.api_sakuteki[0],\r
+                Firepower = (int)entry.api_karyoku[0],\r
+                Torpedo = (int)entry.api_raisou[0],\r
+                AntiSubmarine = (int)entry.api_taisen[0],\r
+                AntiAir = (int)entry.api_taiku[0],\r
+                Lucky = (int)entry.api_lucky[0],\r
+                Locked = entry.api_locked() && entry.api_locked == 1,\r
+            };\r
         }\r
 \r
         private void InspectBasic(dynamic json)\r
@@ -261,7 +303,7 @@ namespace KancolleSniffer.Model
                 return;\r
             _itemInventory.Remove(ships.SelectMany(id => _shipInventory[id].Slot));\r
             _shipInventory.Remove(ships);\r
-            InspectShipDataAndDeck(new[]{json.api_ship}, json.api_deck);\r
+            FillShipData(new[]{json.api_ship}, json.api_deck);\r
         }\r
 \r
         public void InspectSlotExchange(string request, dynamic json)\r
@@ -273,14 +315,14 @@ namespace KancolleSniffer.Model
 \r
         public void InspectSlotDeprive(dynamic json)\r
         {\r
-            InspectShipData(new[] {json.api_ship_data.api_set_ship, json.api_ship_data.api_unset_ship});\r
+            FillShips(new[] {json.api_ship_data.api_set_ship, json.api_ship_data.api_unset_ship});\r
             foreach (var fleet in _fleets)\r
                 fleet.SetDeck(); // ShipStatusの差し替え\r
         }\r
 \r
         public void InspectMarriage(dynamic json)\r
         {\r
-            InspectShipData(new[]{json});\r
+            FillShips(new[]{json});\r
             foreach (var fleet in _fleets)\r
                 fleet.SetDeck(); // ShipStatusの差し替え\r
         }\r
@@ -371,7 +413,6 @@ namespace KancolleSniffer.Model
 \r
         public void SetEscapedShips(List<int> ids)\r
         {\r
-            _escapedShips.AddRange(ids);\r
             foreach (var id in ids)\r
                 _shipInventory[id].Escaped = true;\r
         }\r
index 9077157..58fb04e 100644 (file)
@@ -148,7 +148,7 @@ namespace KancolleSniffer
                 return Update.None;\r
 \r
             if (url.EndsWith("api_port/port"))\r
-                return ApiPort(data);\r
+                return ApiPort(url, data);\r
             if (url.Contains("member"))\r
                 return ApiMember(url, json);\r
             if (url.Contains("kousyou"))\r
@@ -183,13 +183,13 @@ namespace KancolleSniffer
                 MapDictionary[map.api_name] = $"{map.api_maparea_id}-{map.api_no}";\r
         }\r
 \r
-        private Update ApiPort(dynamic data)\r
+        private Update ApiPort(string url, dynamic data)\r
         {\r
             _itemInfo.InspectBasic(data.api_basic);\r
             _materialInfo.InspectMaterialPort(data.api_material);\r
             _logger.InspectBasic(data.api_basic);\r
             _logger.InspectMaterial(data.api_material);\r
-            _shipInfo.InspectShip(data);\r
+            _shipInfo.InspectShip(url, data);\r
             _shipInfo.ClearBadlyDamagedShips();\r
             _conditionTimer.CalcRegainTime();\r
             _missionInfo.InspectDeck(data.api_deck_port);\r
@@ -265,21 +265,21 @@ namespace KancolleSniffer
             if (url.EndsWith("api_get_member/ship2"))\r
             {\r
                 // ここだけjsonなので注意\r
-                _shipInfo.InspectShip(json);\r
+                _shipInfo.InspectShip(url, json);\r
                 _akashiTimer.CheckFleet();\r
                 _battleInfo.BattleState = BattleState.None;\r
                 return Update.Item | Update.Ship | Update.Battle;\r
             }\r
             if (url.EndsWith("api_get_member/ship_deck"))\r
             {\r
-                _shipInfo.InspectShip(data);\r
+                _shipInfo.InspectShip(url, data);\r
                 _akashiTimer.CheckFleet();\r
                 _battleInfo.BattleState = BattleState.None;\r
                 return Update.Ship | Update.Battle | Update.Item;\r
             }\r
             if (url.EndsWith("api_get_member/ship3"))\r
             {\r
-                _shipInfo.InspectShip(data);\r
+                _shipInfo.InspectShip(url, data);\r
                 _akashiTimer.CheckFleet();\r
                 _conditionTimer.CheckCond();\r
                 return Update.Ship;\r
@@ -328,7 +328,7 @@ namespace KancolleSniffer
             if (url.EndsWith("api_req_kousyou/getship"))\r
             {\r
                 _itemInfo.InspectGetShip(data);\r
-                _shipInfo.InspectShip(data);\r
+                _shipInfo.InspectShip(url, data);\r
                 _dockInfo.InspectKDock(data.api_kdock);\r
                 _conditionTimer.CheckCond();\r
                 RepeatingTimerController?.Stop("建造完了");\r