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