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
_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
.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
}\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
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
\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
\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
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
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
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
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