OSDN Git Service

Model、View、Net、Utilの名前空間にクラスを分類する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Sniffer.cs
1 // Copyright (C) 2013, 2014, 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 // \r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System;\r
16 using KancolleSniffer.Util;\r
17 using KancolleSniffer.View;\r
18 using System.Collections.Generic;\r
19 using System.Linq;\r
20 using KancolleSniffer.Model;\r
21 \r
22 namespace KancolleSniffer\r
23 {\r
24     public class Sniffer\r
25     {\r
26         private bool _start;\r
27         private readonly ItemInfo _itemInfo = new ItemInfo();\r
28         private readonly MaterialInfo _materialInfo = new MaterialInfo();\r
29         private readonly QuestInfo _questInfo;\r
30         private readonly MissionInfo _missionInfo = new MissionInfo();\r
31         private readonly ShipMaster _shipMaster = new ShipMaster();\r
32         private readonly ShipInfo _shipInfo;\r
33         private readonly ConditionTimer _conditionTimer;\r
34         private readonly DockInfo _dockInfo;\r
35         private readonly AkashiTimer _akashiTimer;\r
36         private readonly Achievement _achievement = new Achievement();\r
37         private readonly BattleInfo _battleInfo;\r
38         private readonly Logger _logger;\r
39         private readonly ExMapInfo _exMapInfo = new ExMapInfo();\r
40         private readonly MiscTextInfo _miscTextInfo;\r
41         private readonly BaseAirCoprs _baseAirCoprs;\r
42         private readonly PresetDeck _presetDeck = new PresetDeck();\r
43         private readonly CellInfo _cellInfo = new CellInfo();\r
44         private readonly Status _status = new Status();\r
45         private bool _saveState;\r
46         private readonly List<IHaveState> _haveState;\r
47         private AdditionalData _additionalData;\r
48 \r
49         public interface IRepeatingTimerController\r
50         {\r
51             void Stop(string key);\r
52             void Stop(string key, int fleet);\r
53             void Suspend(string exception = null);\r
54             void Resume();\r
55         }\r
56 \r
57         public IRepeatingTimerController RepeatingTimerController { get; set; }\r
58 \r
59         [Flags]\r
60         public enum Update\r
61         {\r
62             None = 0,\r
63             Error = 1 << 0,\r
64             Start = 1 << 1,\r
65             Item = 1 << 2,\r
66             Ship = 1 << 3,\r
67             Timer = 1 << 4,\r
68             NDock = 1 << 5,\r
69             Mission = 1 << 6,\r
70             QuestList = 1 << 7,\r
71             Battle = 1 << 8,\r
72             Cell = 1 << 9,\r
73             All = (1 << 10) - 1\r
74         }\r
75 \r
76         public Sniffer(bool start = false)\r
77         {\r
78             _start = start;\r
79             _shipInfo = new ShipInfo(_shipMaster, _itemInfo);\r
80             _conditionTimer = new ConditionTimer(_shipInfo);\r
81             _dockInfo = new DockInfo(_shipInfo, _materialInfo);\r
82             _akashiTimer = new AkashiTimer(_shipInfo, _dockInfo, _presetDeck);\r
83             _battleInfo = new BattleInfo(_shipInfo, _itemInfo);\r
84             _logger = new Logger(_shipInfo, _itemInfo, _battleInfo);\r
85             _questInfo = new QuestInfo(_itemInfo, _battleInfo);\r
86             _baseAirCoprs = new BaseAirCoprs(_itemInfo);\r
87             _miscTextInfo = new MiscTextInfo(_shipInfo, _itemInfo);\r
88             _haveState = new List<IHaveState> {_achievement, _materialInfo, _conditionTimer, _exMapInfo, _questInfo};\r
89             AdditionalData = new AdditionalData();\r
90         }\r
91 \r
92         public AdditionalData AdditionalData\r
93         {\r
94             get => _additionalData;\r
95             set\r
96             {\r
97                 _additionalData = value;\r
98                 _shipMaster.AdditionalData = value;\r
99                 _itemInfo.AdditionalData = value;\r
100             }\r
101         }\r
102 \r
103         public void SaveState()\r
104         {\r
105             if (!_saveState)\r
106                 return;\r
107             if (!_haveState.Any(x => x.NeedSave))\r
108                 return;\r
109             foreach (var x in _haveState)\r
110                 x.SaveState(_status);\r
111             _status.Save();\r
112         }\r
113 \r
114         public void LoadState()\r
115         {\r
116             _status.Load();\r
117             foreach (var x in _haveState)\r
118                 x.LoadState(_status);\r
119             _saveState = true;\r
120         }\r
121 \r
122         public Update Sniff(string url, string request, dynamic json)\r
123         {\r
124             if (!json.api_result())\r
125                 return Update.Error;\r
126             if ((int)json.api_result != 1)\r
127                 return Update.None;\r
128             var data = json.api_data() ? json.api_data : new object();\r
129 \r
130             if (url.EndsWith("api_start2"))\r
131             {\r
132                 return ApiStart(data);\r
133             }\r
134             if (!_start)\r
135                 return Update.None;\r
136 \r
137             if (url.EndsWith("api_port/port"))\r
138                 return ApiPort(data);\r
139             if (url.Contains("member"))\r
140                 return ApiMember(url, json);\r
141             if (url.Contains("kousyou"))\r
142                 return ApiKousyou(url, request, data);\r
143             if (url.Contains("battle") || url.Contains("sortie"))\r
144                 return ApiBattle(url, request, data);\r
145             if (url.Contains("hensei"))\r
146                 return ApiHensei(url, request, data);\r
147             if (url.Contains("air_corps"))\r
148                 return ApiAirCorps(url, request, data);\r
149             return ApiOthers(url, request, data);\r
150         }\r
151 \r
152         private Update ApiStart(dynamic data)\r
153         {\r
154             _shipInfo.InspectMaster(data);\r
155             _missionInfo.InspectMaster(data.api_mst_mission);\r
156             _itemInfo.InspectMaster(data);\r
157             _exMapInfo.ResetIfNeeded();\r
158             _miscTextInfo.InspectMaster(data);\r
159             _start = true;\r
160             return Update.Start;\r
161         }\r
162 \r
163         private Update ApiPort(dynamic data)\r
164         {\r
165             _itemInfo.InspectBasic(data.api_basic);\r
166             _materialInfo.InspectMaterialPort(data.api_material);\r
167             _logger.InspectBasic(data.api_basic);\r
168             _logger.InspectMaterial(data.api_material);\r
169             _shipInfo.InspectShip(data);\r
170             _shipInfo.ClearBadlyDamagedShips();\r
171             _conditionTimer.CalcRegenTime();\r
172             _missionInfo.InspectDeck(data.api_deck_port);\r
173             _questInfo.InspectDeck(data.api_deck_port);\r
174             _dockInfo.InspectNDock(data.api_ndock);\r
175             _akashiTimer.Port();\r
176             _achievement.InspectBasic(data.api_basic);\r
177             if (data.api_parallel_quest_count()) // 昔のログにはないので\r
178                 _questInfo.AcceptMax = (int)data.api_parallel_quest_count;\r
179             if (data.api_event_object())\r
180                 _baseAirCoprs.InspectEventObject(data.api_event_object);\r
181             if (data.api_plane_info())\r
182                 _baseAirCoprs.InspectPlaneInfo(data.api_plane_info);\r
183             _battleInfo.CleanupResult();\r
184             _battleInfo.BattleState = BattleState.None;\r
185             _shipInfo.ClearEscapedShips();\r
186             _miscTextInfo.Port();\r
187             _cellInfo.Port();\r
188             SaveState();\r
189             RepeatingTimerController?.Resume();\r
190             foreach (var s in new[] {"遠征終了", "入渠終了", "疲労回復", "泊地修理", "大破警告"})\r
191                 RepeatingTimerController?.Stop(s);\r
192             return Update.All;\r
193         }\r
194 \r
195         private Update ApiMember(string url, dynamic json)\r
196         {\r
197             var data = json.api_data() ? json.api_data : new object();\r
198 \r
199             if (url.EndsWith("api_get_member/require_info"))\r
200             {\r
201                 _itemInfo.InspectSlotItem(data.api_slot_item, true);\r
202                 _dockInfo.InspectKDock(data.api_kdock);\r
203                 return Update.None;\r
204             }\r
205             if (url.EndsWith("api_get_member/basic"))\r
206             {\r
207                 _itemInfo.InspectBasic(data);\r
208                 _logger.InspectBasic(data);\r
209                 return Update.None;\r
210             }\r
211             if (url.EndsWith("api_get_member/slot_item"))\r
212             {\r
213                 _itemInfo.InspectSlotItem(data, true);\r
214                 return Update.Item;\r
215             }\r
216             if (url.EndsWith("api_get_member/kdock"))\r
217             {\r
218                 _dockInfo.InspectKDock(data);\r
219                 _logger.InspectKDock(data);\r
220                 return Update.Timer;\r
221             }\r
222             if (url.EndsWith("api_get_member/ndock"))\r
223             {\r
224                 _dockInfo.InspectNDock(data);\r
225                 _conditionTimer.CheckCond();\r
226                 _akashiTimer.CheckFleet();\r
227                 RepeatingTimerController?.Stop("入渠終了");\r
228                 return Update.NDock | Update.Timer | Update.Ship;\r
229             }\r
230             if (url.EndsWith("api_get_member/questlist"))\r
231             {\r
232                 _questInfo.InspectQuestList(data);\r
233                 return Update.QuestList;\r
234             }\r
235             if (url.EndsWith("api_get_member/deck"))\r
236             {\r
237                 _shipInfo.InspectDeck(data);\r
238                 _missionInfo.InspectDeck(data);\r
239                 _akashiTimer.CheckFleet();\r
240                 _questInfo.InspectDeck(data);\r
241                 return Update.Mission | Update.Timer;\r
242             }\r
243             if (url.EndsWith("api_get_member/ship2"))\r
244             {\r
245                 // ここだけjsonなので注意\r
246                 _shipInfo.InspectShip(json);\r
247                 _akashiTimer.CheckFleet();\r
248                 _battleInfo.BattleState = BattleState.None;\r
249                 return Update.Item | Update.Ship | Update.Battle;\r
250             }\r
251             if (url.EndsWith("api_get_member/ship_deck"))\r
252             {\r
253                 _shipInfo.InspectShip(data);\r
254                 _akashiTimer.CheckFleet();\r
255                 _battleInfo.BattleState = BattleState.None;\r
256                 return Update.Ship | Update.Battle | Update.Item;\r
257             }\r
258             if (url.EndsWith("api_get_member/ship3"))\r
259             {\r
260                 _shipInfo.InspectShip(data);\r
261                 _akashiTimer.CheckFleet();\r
262                 _conditionTimer.CheckCond();\r
263                 return Update.Ship;\r
264             }\r
265             if (url.EndsWith("api_get_member/material"))\r
266             {\r
267                 _materialInfo.InspectMaterial(data);\r
268                 return Update.Item;\r
269             }\r
270             if (url.EndsWith("api_get_member/mapinfo"))\r
271             {\r
272                 _exMapInfo.InspectMapInfo(data);\r
273                 _miscTextInfo.InspectMapInfo(data);\r
274                 if (data.api_air_base())\r
275                     _baseAirCoprs.Inspect(data.api_air_base);\r
276                 return Update.Item;\r
277             }\r
278             if (url.EndsWith("api_req_member/get_practice_enemyinfo"))\r
279             {\r
280                 _miscTextInfo.InspectPracticeEnemyInfo(data);\r
281                 return Update.Item;\r
282             }\r
283             if (url.EndsWith("api_get_member/preset_deck"))\r
284             {\r
285                 _presetDeck.Inspect(data);\r
286                 return Update.None;\r
287             }\r
288             if (url.EndsWith("api_get_member/base_air_corps"))\r
289             {\r
290                 _baseAirCoprs.Inspect(data);\r
291                 return Update.Ship;\r
292             }\r
293             return Update.None;\r
294         }\r
295 \r
296         private Update ApiKousyou(string url, string request, dynamic data)\r
297         {\r
298             if (url.EndsWith("api_req_kousyou/createitem"))\r
299             {\r
300                 _itemInfo.InspectCreateItem(data);\r
301                 _materialInfo.InspectCreateIem(data);\r
302                 _logger.InspectCreateItem(request, data);\r
303                 _questInfo.CountCreateItem();\r
304                 return Update.Item | Update.QuestList;\r
305             }\r
306             if (url.EndsWith("api_req_kousyou/getship"))\r
307             {\r
308                 _itemInfo.InspectGetShip(data);\r
309                 _shipInfo.InspectShip(data);\r
310                 _dockInfo.InspectKDock(data.api_kdock);\r
311                 _conditionTimer.CheckCond();\r
312                 RepeatingTimerController?.Stop("建造完了");\r
313                 return Update.Item | Update.Timer;\r
314             }\r
315             if (url.EndsWith("api_req_kousyou/destroyship"))\r
316             {\r
317                 _shipInfo.InspectDestroyShip(request, data);\r
318                 _materialInfo.InspectDestroyShip(data);\r
319                 _conditionTimer.CheckCond();\r
320                 _akashiTimer.CheckFleet();\r
321                 _questInfo.InspectDestroyShip(request);\r
322                 return Update.Item | Update.Ship | Update.QuestList;\r
323             }\r
324             if (url.EndsWith("api_req_kousyou/destroyitem2"))\r
325             {\r
326                 _questInfo.InspectDestroyItem(request, data); // 本当に削除される前\r
327                 _itemInfo.InspectDestroyItem(request, data);\r
328                 _materialInfo.InspectDestroyItem(data);\r
329                 return Update.Item | Update.QuestList;\r
330             }\r
331             if (url.EndsWith("api_req_kousyou/remodel_slot"))\r
332             {\r
333                 _logger.SetCurrentMaterial(_materialInfo.Current);\r
334                 _logger.InspectRemodelSlot(request, data); // 資材の差が必要なので_materialInfoより前\r
335                 _itemInfo.InspectRemodelSlot(data);\r
336                 _materialInfo.InspectRemodelSlot(data);\r
337                 _questInfo.CountRemodelSlot();\r
338                 return Update.Item | Update.QuestList;\r
339             }\r
340             if (url.EndsWith("api_req_kousyou/createship"))\r
341             {\r
342                 _logger.InspectCreateShip(request);\r
343                 _questInfo.CountCreateShip();\r
344                 return Update.QuestList;\r
345             }\r
346             if (url.EndsWith("api_req_kousyou/createship_speedchange"))\r
347             {\r
348                 _dockInfo.InspectCreateShipSpeedChange(request);\r
349                 return Update.Timer;\r
350             }\r
351             return Update.None;\r
352         }\r
353 \r
354         private Update ApiBattle(string url, string request, dynamic data)\r
355         {\r
356             if (IsNormalBattleAPI(url) || IsCombinedBattleAPI(url))\r
357             {\r
358                 _battleInfo.InspectBattle(url, request, data);\r
359                 _logger.InspectBattle(data);\r
360                 _cellInfo.StartBattle();\r
361                 return Update.Ship | Update.Battle;\r
362             }\r
363             if (url.EndsWith("api_req_practice/battle") || url.EndsWith("api_req_practice/midnight_battle"))\r
364             {\r
365                 if (url.EndsWith("/battle"))\r
366                 {\r
367                     _shipInfo.StartPractice(request);\r
368                     _questInfo.StartPractice(request);\r
369                     _cellInfo.StartPractice();\r
370                     _conditionTimer.InvalidateCond();\r
371                     RepeatingTimerController?.Suspend();\r
372                 }\r
373                 _battleInfo.InspectBattle(url, request, data);\r
374                 return Update.Ship | Update.Battle | Update.Timer;\r
375             }\r
376             if (url.EndsWith("api_req_sortie/battleresult") || url.EndsWith("api_req_combined_battle/battleresult"))\r
377             {\r
378                 _battleInfo.InspectBattleResult(data);\r
379                 _exMapInfo.InspectBattleResult(data);\r
380                 _logger.InspectBattleResult(data);\r
381                 _questInfo.InspectBattleResult(data);\r
382                 _miscTextInfo.InspectBattleResult(data);\r
383                 return Update.Ship | Update.QuestList;\r
384             }\r
385             if (url.EndsWith("api_req_practice/battle_result"))\r
386             {\r
387                 _battleInfo.InspectPracticeResult(data);\r
388                 _questInfo.InspectPracticeResult(data);\r
389                 return Update.Ship | Update.QuestList;\r
390             }\r
391             if (url.EndsWith("/goback_port"))\r
392             {\r
393                 _battleInfo.CauseEscape();\r
394                 return Update.Ship;\r
395             }\r
396             _battleInfo.BattleState = BattleState.Unknown;\r
397             return Update.None;\r
398         }\r
399 \r
400         private bool IsNormalBattleAPI(string url)\r
401         {\r
402             return url.EndsWith("api_req_sortie/battle") ||\r
403                    url.EndsWith("api_req_sortie/airbattle") ||\r
404                    url.EndsWith("api_req_sortie/ld_airbattle") ||\r
405                    url.EndsWith("api_req_battle_midnight/battle") ||\r
406                    url.EndsWith("api_req_battle_midnight/sp_midnight");\r
407         }\r
408 \r
409         private bool IsCombinedBattleAPI(string url)\r
410         {\r
411             return url.EndsWith("api_req_combined_battle/battle") ||\r
412                    url.EndsWith("api_req_combined_battle/airbattle") ||\r
413                    url.EndsWith("api_req_combined_battle/ld_airbattle") ||\r
414                    url.EndsWith("api_req_combined_battle/battle_water") ||\r
415                    url.EndsWith("api_req_combined_battle/midnight_battle") ||\r
416                    url.EndsWith("api_req_combined_battle/sp_midnight") ||\r
417                    url.EndsWith("api_req_combined_battle/ec_battle") ||\r
418                    url.EndsWith("api_req_combined_battle/ec_midnight_battle") ||\r
419                    url.EndsWith("api_req_combined_battle/ec_night_to_day") ||\r
420                    url.EndsWith("api_req_combined_battle/each_battle") ||\r
421                    url.EndsWith("api_req_combined_battle/each_battle_water");\r
422         }\r
423 \r
424         private Update ApiHensei(string url, string request, dynamic data)\r
425         {\r
426             if (url.EndsWith("api_req_hensei/change"))\r
427             {\r
428                 _shipInfo.InspectChange(request);\r
429                 _akashiTimer.InspectChange(request);\r
430                 return Update.Ship;\r
431             }\r
432             if (url.EndsWith("api_req_hensei/preset_select"))\r
433             {\r
434                 _shipInfo.InspectDeck(new[] {data});\r
435                 _akashiTimer.CheckFleet();\r
436                 return Update.Ship;\r
437             }\r
438             if (url.EndsWith("api_req_hensei/preset_register"))\r
439             {\r
440                 _presetDeck.InspectRegister(data);\r
441                 return Update.None;\r
442             }\r
443             if (url.EndsWith("api_req_hensei/preset_delete"))\r
444             {\r
445                 _presetDeck.InspectDelete(request);\r
446                 return Update.Timer;\r
447             }\r
448             if (url.EndsWith("api_req_hensei/combined"))\r
449             {\r
450                 _shipInfo.InspectCombined(request);\r
451                 return Update.Ship;\r
452             }\r
453             return Update.None;\r
454         }\r
455 \r
456         private Update ApiAirCorps(string url, string request, dynamic data)\r
457         {\r
458             if (url.EndsWith("api_req_air_corps/supply"))\r
459             {\r
460                 _materialInfo.InspectAirCorpsSupply(data);\r
461                 _baseAirCoprs.InspectSupply(request, data);\r
462                 return Update.Item;\r
463             }\r
464             if (url.EndsWith("api_req_air_corps/set_plane"))\r
465             {\r
466                 _materialInfo.InspectAirCorpsSetPlane(data);\r
467                 _baseAirCoprs.InspectSetPlane(request, data);\r
468                 return Update.Item | Update.Ship;\r
469             }\r
470             if (url.EndsWith("api_req_air_corps/set_action"))\r
471             {\r
472                 _baseAirCoprs.InspectSetAction(request);\r
473                 return Update.Ship;\r
474             }\r
475             if (url.EndsWith("api_req_air_corps/expand_base"))\r
476             {\r
477                 _baseAirCoprs.InspectExpandBase(request, data);\r
478                 return Update.Ship;\r
479             }\r
480             return Update.None;\r
481         }\r
482 \r
483         private Update ApiOthers(string url, string request, dynamic data)\r
484         {\r
485             if (url.EndsWith("api_req_hokyu/charge"))\r
486             {\r
487                 _shipInfo.InspectCharge(data);\r
488                 _materialInfo.InspectCharge(data);\r
489                 _questInfo.CountCharge();\r
490                 return Update.Item | Update.Ship | Update.QuestList;\r
491             }\r
492             if (url.EndsWith("api_req_kaisou/powerup"))\r
493             {\r
494                 _shipInfo.InspectPowerup(request, data);\r
495                 _conditionTimer.CheckCond();\r
496                 _akashiTimer.CheckFleet();\r
497                 _questInfo.InspectPowerup(data);\r
498                 return Update.Item | Update.Ship | Update.QuestList;\r
499             }\r
500             if (url.EndsWith("api_req_kaisou/slot_exchange_index"))\r
501             {\r
502                 _shipInfo.InspectSlotExchange(request, data);\r
503                 return Update.Ship;\r
504             }\r
505             if (url.EndsWith("api_req_kaisou/slot_deprive"))\r
506             {\r
507                 _shipInfo.InspectSlotDeprive(data);\r
508                 return Update.Ship;\r
509             }\r
510             if (url.EndsWith("api_req_nyukyo/start"))\r
511             {\r
512                 _dockInfo.InspectNyukyo(request);\r
513                 _conditionTimer.CheckCond();\r
514                 _akashiTimer.CheckFleet();\r
515                 _questInfo.CountNyukyo();\r
516                 var ndock = HttpUtility.ParseQueryString(request)["api_ndock_id"];\r
517                 if (ndock != null && int.TryParse(ndock, out int id))\r
518                     RepeatingTimerController?.Stop("入渠終了", id - 1);\r
519                 return Update.Item | Update.Ship | Update.QuestList;\r
520             }\r
521             if (url.EndsWith("api_req_nyukyo/speedchange"))\r
522             {\r
523                 _dockInfo.InspectSpeedChange(request);\r
524                 _conditionTimer.CheckCond();\r
525                 return Update.NDock | Update.Timer | Update.Item | Update.Ship;\r
526             }\r
527             if (url.EndsWith("api_req_map/start"))\r
528             {\r
529                 _shipInfo.InspectMapStart(request); // 出撃中判定が必要なので_conditionTimerより前\r
530                 _conditionTimer.InvalidateCond();\r
531                 _exMapInfo.InspectMapStart(data);\r
532                 _battleInfo.InspectMapStart(data);\r
533                 _logger.InspectMapStart(data);\r
534                 _miscTextInfo.InspectMapStart(data);\r
535                 _questInfo.InspectMapStart(data);\r
536                 _cellInfo.InspectMapStart(data);\r
537                 RepeatingTimerController?.Suspend("大破警告");\r
538                 return Update.Timer | Update.Ship | Update.Cell;\r
539             }\r
540             if (url.EndsWith("api_req_map/next"))\r
541             {\r
542                 _exMapInfo.InspectMapNext(data);\r
543                 _battleInfo.InspectMapNext(data);\r
544                 _logger.InspectMapNext(data);\r
545                 _questInfo.InspectMapNext(data);\r
546                 _miscTextInfo.InspectMapNext(data);\r
547                 _cellInfo.InspectMapNext(data);\r
548                 return Update.Cell;\r
549             }\r
550             if (url.EndsWith("api_req_mission/start"))\r
551             {\r
552                 var deck = HttpUtility.ParseQueryString(request)["api_deck_id"];\r
553                 if (deck != null && int.TryParse(deck, out int id))\r
554                     RepeatingTimerController?.Stop("遠征終了", id - 1);\r
555                 return Update.None;\r
556             }\r
557             if (url.EndsWith("api_req_mission/result"))\r
558             {\r
559                 _materialInfo.InspectMissionResult(data);\r
560                 _logger.InspectMissionResult(data);\r
561                 _questInfo.InspectMissionResult(request, data);\r
562                 return Update.Item;\r
563             }\r
564             if (url.EndsWith("api_req_quest/stop"))\r
565             {\r
566                 _questInfo.InspectStop(request);\r
567                 return Update.QuestList;\r
568             }\r
569             if (url.EndsWith("api_req_quest/clearitemget"))\r
570             {\r
571                 _questInfo.InspectClearItemGet(request);\r
572                 _logger.InspectClearItemGet(data);\r
573                 return Update.QuestList;\r
574             }\r
575             return Update.None;\r
576         }\r
577 \r
578         public NameAndTimer[] NDock => _dockInfo.NDock;\r
579 \r
580         public AlarmTimer[] KDock => _dockInfo.KDock;\r
581 \r
582         public ItemInfo Item => _itemInfo;\r
583 \r
584         public MaterialInfo Material => _materialInfo;\r
585 \r
586         public QuestStatus[] Quests => _questInfo.Quests;\r
587 \r
588         public void ClearQuests() => _questInfo.ClearQuests();\r
589 \r
590         public NameAndTimer[] Missions => _missionInfo.Missions;\r
591 \r
592         public DateTime GetConditionTimer(int fleet) => _conditionTimer.GetTimer(fleet);\r
593 \r
594         public int[] GetConditionNotice(DateTime prev, DateTime now) => _conditionTimer.GetNotice(prev, now);\r
595 \r
596         public Fleet[] Fleets => _shipInfo.Fleets;\r
597 \r
598         public ShipInfo.ShipStatusPair[] BattleResultStatusDiff => _shipInfo.BattleResultDiff;\r
599 \r
600         public bool IsBattleResultStatusError => _shipInfo.IsBattleResultError;\r
601 \r
602         public ShipStatus[] BattleStartStatus => _shipInfo.BattleStartStatus;\r
603 \r
604         public bool IsCombinedFleet => _shipInfo.Fleets[0].CombinedType != 0;\r
605 \r
606         public ShipStatus[] RepairList => _shipInfo.GetRepairList(_dockInfo);\r
607 \r
608         public ShipStatus[] ShipList => _shipInfo.ShipList;\r
609 \r
610         public string[] BadlyDamagedShips => _shipInfo.BadlyDamagedShips;\r
611 \r
612         public ItemStatus[] ItemList\r
613         {\r
614             get\r
615             {\r
616                 _itemInfo.ClearHolder();\r
617                 _shipInfo.SetItemHolder();\r
618                 _baseAirCoprs.SetItemHolder();\r
619                 return _itemInfo.ItemList;\r
620             }\r
621         }\r
622 \r
623         public AkashiTimer AkashiTimer => _akashiTimer;\r
624 \r
625         public Achievement Achievement => _achievement;\r
626 \r
627         public BattleInfo Battle => _battleInfo;\r
628 \r
629         public ExMapInfo ExMap => _exMapInfo;\r
630 \r
631         public string MiscText => _miscTextInfo.Text;\r
632 \r
633         public BaseAirCoprs.BaseInfo[] BaseAirCorps => _baseAirCoprs.AllAirCorps;\r
634 \r
635         public CellInfo CellInfo => _cellInfo;\r
636 \r
637         public void SetLogWriter(Action<string, string, string> writer, Func<DateTime> nowFunc)\r
638         {\r
639             _logger.SetWriter(writer, nowFunc);\r
640         }\r
641 \r
642         public void SkipMaster()\r
643         {\r
644             _start = true;\r
645         }\r
646 \r
647         public void EnableLog(LogType type)\r
648         {\r
649             _logger.EnableLog(type);\r
650         }\r
651 \r
652         public int MaterialLogInterval\r
653         {\r
654             set => _logger.MaterialLogInterval = value;\r
655         }\r
656 \r
657         public string LogOutputDir\r
658         {\r
659             set => _logger.OutputDir = value;\r
660         }\r
661 \r
662         public void FlashLog()\r
663         {\r
664             _logger.FlashLog();\r
665         }\r
666     }\r
667 }