OSDN Git Service

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