OSDN Git Service

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