OSDN Git Service

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