// limitations under the License.\r
\r
using System;\r
+using KancolleSniffer.Util;\r
using System.Collections.Generic;\r
using System.Linq;\r
+using KancolleSniffer.Log;\r
+using KancolleSniffer.Model;\r
\r
namespace KancolleSniffer\r
{\r
public class Sniffer\r
{\r
- private bool _start;\r
- private readonly ItemInfo _itemInfo = new ItemInfo();\r
+ private readonly ItemMaster _itemMaster = new ItemMaster();\r
+ private readonly ItemInventory _itemInventory = new ItemInventory();\r
+ private readonly ItemInfo _itemInfo;\r
+ private readonly ShipMaster _shipMaster = new ShipMaster();\r
+ private readonly ShipInventory _shipInventory = new ShipInventory();\r
+ private readonly ShipInfo _shipInfo;\r
private readonly MaterialInfo _materialInfo = new MaterialInfo();\r
- private readonly QuestInfo _questInfo = new QuestInfo();\r
+ private readonly QuestInfo _questInfo;\r
+ private readonly QuestCounter _questCounter;\r
+ private readonly QuestCountList _questCountList = new QuestCountList();\r
private readonly MissionInfo _missionInfo = new MissionInfo();\r
- private readonly ShipInfo _shipInfo;\r
private readonly ConditionTimer _conditionTimer;\r
private readonly DockInfo _dockInfo;\r
private readonly AkashiTimer _akashiTimer;\r
private readonly BattleInfo _battleInfo;\r
private readonly Logger _logger;\r
private readonly ExMapInfo _exMapInfo = new ExMapInfo();\r
- private readonly MiscTextInfo _miscTextInfo = new MiscTextInfo();\r
- private readonly BaseAirCoprs _baseAirCoprs;\r
+ private readonly MiscTextInfo _miscTextInfo;\r
+ private readonly AirBase _airBase;\r
+ private readonly PresetDeck _presetDeck = new PresetDeck();\r
+ private readonly CellInfo _cellInfo = new CellInfo();\r
private readonly Status _status = new Status();\r
private bool _saveState;\r
private readonly List<IHaveState> _haveState;\r
+ private AdditionalData _additionalData;\r
+\r
+ public interface IRepeatingTimerController\r
+ {\r
+ void Stop(string key);\r
+ void Stop(string key, int fleet);\r
+ void Suspend(string exception = null);\r
+ void Resume();\r
+ }\r
+\r
+ public IRepeatingTimerController RepeatingTimerController { get; set; }\r
+\r
+ public Dictionary<string, string> MapDictionary { get; } = new Dictionary<string, string>\r
+ {\r
+ {"南西作戦海域方面 バリ島沖", "42-1"},\r
+ {"西方作戦海域方面 マラッカ海峡北方", "42-2"},\r
+ {"西方作戦海域方面 セイロン島南西沖", "42-3"},\r
+ {"欧州作戦海域方面 地中海マルタ島沖", "42-4"},\r
+ {"欧州作戦海域方面 北海/北大西洋海域", "42-5"}\r
+ };\r
\r
[Flags]\r
public enum Update\r
{\r
None = 0,\r
- Error = 1 << 0,\r
+ Error = 1,\r
Start = 1 << 1,\r
Item = 1 << 2,\r
Ship = 1 << 3,\r
Mission = 1 << 6,\r
QuestList = 1 << 7,\r
Battle = 1 << 8,\r
- All = (1 << 9) - 1\r
+ Cell = 1 << 9,\r
+ All = (1 << 10) - 1\r
}\r
\r
- public Sniffer()\r
+ public bool Started { get; private set; }\r
+\r
+ public Sniffer(bool started = false)\r
{\r
- _shipInfo = new ShipInfo(_itemInfo);\r
+ Started = started;\r
+ _itemInfo = new ItemInfo(_itemMaster, _itemInventory);\r
+ _shipInfo = new ShipInfo(_shipMaster, _shipInventory, _itemInventory);\r
_conditionTimer = new ConditionTimer(_shipInfo);\r
- _dockInfo = new DockInfo(_shipInfo, _materialInfo);\r
- _akashiTimer = new AkashiTimer(_shipInfo, _dockInfo);\r
- _battleInfo = new BattleInfo(_shipInfo, _itemInfo);\r
+ _dockInfo = new DockInfo(_shipInventory, _materialInfo);\r
+ _akashiTimer = new AkashiTimer(_shipInfo, _dockInfo, _presetDeck);\r
+ _airBase = new AirBase(_itemInfo);\r
+ _battleInfo = new BattleInfo(_shipInfo, _itemInfo, _airBase);\r
_logger = new Logger(_shipInfo, _itemInfo, _battleInfo);\r
- _baseAirCoprs = new BaseAirCoprs(_itemInfo);\r
- _haveState = new List<IHaveState> {_achievement, _materialInfo, _conditionTimer, _exMapInfo};\r
+ _questInfo = new QuestInfo(_questCountList);\r
+ _questCounter = new QuestCounter(_questInfo, _itemInfo, _battleInfo);\r
+ _miscTextInfo = new MiscTextInfo(_shipInfo, _itemInfo);\r
+ _haveState = new List<IHaveState> {_achievement, _materialInfo, _conditionTimer, _exMapInfo, _questInfo};\r
+ AdditionalData = new AdditionalData();\r
+ }\r
+\r
+ public AdditionalData AdditionalData\r
+ {\r
+ get => _additionalData;\r
+ private set\r
+ {\r
+ _additionalData = value;\r
+ _itemMaster.AdditionalData = value;\r
+ _shipMaster.AdditionalData = value;\r
+ }\r
}\r
\r
- private void SaveState()\r
+ public void SaveState()\r
{\r
if (!_saveState)\r
return;\r
return Update.None;\r
var data = json.api_data() ? json.api_data : new object();\r
\r
- if (url.EndsWith("api_start2"))\r
+ if (url.Contains("api_start2"))\r
{\r
return ApiStart(data);\r
}\r
- if (!_start)\r
+ if (!Started)\r
return Update.None;\r
+\r
if (url.EndsWith("api_port/port"))\r
return ApiPort(data);\r
if (url.Contains("member"))\r
- return ApiMember(url, json);\r
+ return ApiMember(url, request,json);\r
if (url.Contains("kousyou"))\r
return ApiKousyou(url, request, data);\r
- if (url.Contains("battle"))\r
+ if (url.Contains("practice"))\r
+ return ApiPractice(url, request, data);\r
+ if (IsBattleAPI(url))\r
return ApiBattle(url, request, data);\r
+ if (url.Contains("hensei"))\r
+ return ApiHensei(url, request, data);\r
+ if (url.Contains("kaisou"))\r
+ return ApiKaisou(url, request, data);\r
+ if (url.Contains("air_corps"))\r
+ return ApiAirCorps(url, request, data);\r
+ if (url.Contains("map"))\r
+ return ApiMap(url, request, data);\r
return ApiOthers(url, request, data);\r
}\r
\r
+ private static bool IsBattleAPI(string url)\r
+ {\r
+ return url.Contains("api_req_sortie/") ||\r
+ url.Contains("api_req_battle_midnight/") ||\r
+ url.Contains("api_req_combined_battle/");\r
+ }\r
+\r
private Update ApiStart(dynamic data)\r
{\r
_shipInfo.InspectMaster(data);\r
+ _shipInfo.ClearBattleResult();\r
_missionInfo.InspectMaster(data.api_mst_mission);\r
_itemInfo.InspectMaster(data);\r
_exMapInfo.ResetIfNeeded();\r
- _start = true;\r
+ _miscTextInfo.InspectMaster(data);\r
+ _logger.InspectMapInfoMaster(data.api_mst_mapinfo);\r
+ SetMapDictionary(data.api_mst_mapinfo);\r
+ _questCountList.SetMissionNames(data.api_mst_mission);\r
+ Started = true;\r
return Update.Start;\r
}\r
\r
+ private void SetMapDictionary(dynamic json)\r
+ {\r
+ foreach (var map in json)\r
+ MapDictionary[map.api_name] = $"{map.api_maparea_id}-{map.api_no}";\r
+ }\r
+\r
+ public interface IPort\r
+ {\r
+ void Port();\r
+ }\r
+\r
private Update ApiPort(dynamic data)\r
{\r
_itemInfo.InspectBasic(data.api_basic);\r
- _materialInfo.InspectMaterial(data.api_material, true);\r
+ _materialInfo.InspectMaterialPort(data.api_material);\r
_logger.InspectBasic(data.api_basic);\r
_logger.InspectMaterial(data.api_material);\r
- _shipInfo.InspectShip(data);\r
- _shipInfo.ClearBadlyDamagedShips();\r
- _conditionTimer.CalcRegenTime();\r
+ _shipInfo.Port(data);\r
_missionInfo.InspectDeck(data.api_deck_port);\r
+ _questCounter.InspectDeck(data.api_deck_port);\r
_dockInfo.InspectNDock(data.api_ndock);\r
- _akashiTimer.Port();\r
_achievement.InspectBasic(data.api_basic);\r
- if (data.api_parallel_quest_count()) // 昔のログにはないので\r
- _questInfo.QuestCount = (int)data.api_parallel_quest_count;\r
if (data.api_event_object())\r
- _baseAirCoprs.InspectEventObject(data.api_event_object);\r
- _battleInfo.CleanupResult();\r
- _battleInfo.InBattle = false;\r
- _shipInfo.ClearEscapedShips();\r
- _miscTextInfo.ClearIfNeeded();\r
+ _airBase.InspectEventObject(data.api_event_object);\r
+ if (data.api_plane_info())\r
+ _airBase.InspectPlaneInfo(data.api_plane_info);\r
+ foreach (var receiver in new IPort[]{_conditionTimer, _akashiTimer, _battleInfo, _miscTextInfo, _cellInfo})\r
+ receiver.Port();\r
SaveState();\r
+ RepeatingTimerController?.Resume();\r
+ foreach (var s in new[] {"遠征終了", "入渠終了", "疲労回復", "泊地修理", "大破警告"})\r
+ RepeatingTimerController?.Stop(s);\r
return Update.All;\r
}\r
\r
- private Update ApiMember(string url, dynamic json)\r
+ private Update ApiMember(string url, string request, dynamic json)\r
{\r
var data = json.api_data() ? json.api_data : new object();\r
\r
if (url.EndsWith("api_get_member/require_info"))\r
{\r
_itemInfo.InspectSlotItem(data.api_slot_item, true);\r
+ if (data.api_useitem())\r
+ _itemInfo.InspectUseItem(data.api_useitem);\r
_dockInfo.InspectKDock(data.api_kdock);\r
- return Update.Timer;\r
+ return Update.None;\r
}\r
if (url.EndsWith("api_get_member/basic"))\r
{\r
_itemInfo.InspectSlotItem(data, true);\r
return Update.Item;\r
}\r
+ if (url.EndsWith("api_get_member/useitem"))\r
+ {\r
+ if (data == null)\r
+ return Update.None;\r
+ _itemInfo.InspectUseItem(data);\r
+ return Update.Item;\r
+ }\r
if (url.EndsWith("api_get_member/kdock"))\r
{\r
_dockInfo.InspectKDock(data);\r
_dockInfo.InspectNDock(data);\r
_conditionTimer.CheckCond();\r
_akashiTimer.CheckFleet();\r
+ RepeatingTimerController?.Stop("入渠終了");\r
return Update.NDock | Update.Timer | Update.Ship;\r
}\r
if (url.EndsWith("api_get_member/questlist"))\r
{\r
- _questInfo.InspectQuestList(data);\r
+ _questInfo.InspectQuestList(request, data);\r
return Update.QuestList;\r
}\r
if (url.EndsWith("api_get_member/deck"))\r
_shipInfo.InspectDeck(data);\r
_missionInfo.InspectDeck(data);\r
_akashiTimer.CheckFleet();\r
+ _questCounter.InspectDeck(data);\r
return Update.Mission | Update.Timer;\r
}\r
if (url.EndsWith("api_get_member/ship2"))\r
{\r
// ここだけjsonなので注意\r
- _shipInfo.InspectShip(json);\r
+ _shipInfo.InspectShip(url, json);\r
_akashiTimer.CheckFleet();\r
- _battleInfo.InBattle = false;\r
- return Update.Item | Update.Ship | Update.Battle;\r
+ _battleInfo.BattleState = BattleState.None;\r
+ return Update.Item | Update.Ship;\r
}\r
if (url.EndsWith("api_get_member/ship_deck"))\r
{\r
- _shipInfo.InspectShip(data);\r
+ _shipInfo.InspectShip(url, data);\r
_akashiTimer.CheckFleet();\r
- _battleInfo.InBattle = false;\r
- return Update.Ship | Update.Battle;\r
+ _battleInfo.BattleState = BattleState.None;\r
+ return Update.Ship | Update.Item;\r
}\r
if (url.EndsWith("api_get_member/ship3"))\r
{\r
- _shipInfo.InspectShip(data);\r
+ _shipInfo.InspectShip(url, data);\r
_akashiTimer.CheckFleet();\r
_conditionTimer.CheckCond();\r
return Update.Ship;\r
{\r
_exMapInfo.InspectMapInfo(data);\r
_miscTextInfo.InspectMapInfo(data);\r
+ if (data.api_air_base())\r
+ _airBase.Inspect(data.api_air_base);\r
return Update.Item;\r
}\r
if (url.EndsWith("api_req_member/get_practice_enemyinfo"))\r
}\r
if (url.EndsWith("api_get_member/preset_deck"))\r
{\r
- _shipInfo.InspectPresetDeck(data);\r
+ _presetDeck.Inspect(data);\r
return Update.None;\r
}\r
if (url.EndsWith("api_get_member/base_air_corps"))\r
{\r
- _baseAirCoprs.Inspect(data);\r
+ _airBase.Inspect(data);\r
return Update.Ship;\r
}\r
return Update.None;\r
_itemInfo.InspectCreateItem(data);\r
_materialInfo.InspectCreateIem(data);\r
_logger.InspectCreateItem(request, data);\r
- return Update.Item;\r
+ _questCounter.InspectCreateItem(request);\r
+ return Update.Item | Update.QuestList;\r
}\r
if (url.EndsWith("api_req_kousyou/getship"))\r
{\r
_itemInfo.InspectGetShip(data);\r
- _shipInfo.InspectShip(data);\r
+ _shipInfo.InspectShip(url, data);\r
_dockInfo.InspectKDock(data.api_kdock);\r
_conditionTimer.CheckCond();\r
+ RepeatingTimerController?.Stop("建造完了");\r
return Update.Item | Update.Timer;\r
}\r
if (url.EndsWith("api_req_kousyou/destroyship"))\r
{\r
- _shipInfo.InspectDestroyShip(request, data);\r
+ _shipInfo.InspectDestroyShip(request);\r
_materialInfo.InspectDestroyShip(data);\r
_conditionTimer.CheckCond();\r
_akashiTimer.CheckFleet();\r
- return Update.Item | Update.Ship;\r
+ _questCounter.InspectDestroyShip(request);\r
+ return Update.Item | Update.Ship | Update.QuestList;\r
}\r
if (url.EndsWith("api_req_kousyou/destroyitem2"))\r
{\r
- _itemInfo.InspectDestroyItem(request, data);\r
+ _questCounter.InspectDestroyItem(request); // 本当に削除される前\r
+ _itemInfo.InspectDestroyItem(request);\r
_materialInfo.InspectDestroyItem(data);\r
- return Update.Item;\r
+ return Update.Item | Update.QuestList;\r
}\r
if (url.EndsWith("api_req_kousyou/remodel_slot"))\r
{\r
_logger.InspectRemodelSlot(request, data); // 資材の差が必要なので_materialInfoより前\r
_itemInfo.InspectRemodelSlot(data);\r
_materialInfo.InspectRemodelSlot(data);\r
- return Update.Item;\r
+ _questCounter.CountRemodelSlot();\r
+ return Update.Item | Update.QuestList;\r
}\r
if (url.EndsWith("api_req_kousyou/createship"))\r
{\r
_logger.InspectCreateShip(request);\r
- return Update.None;\r
+ _questCounter.CountCreateShip();\r
+ return Update.QuestList;\r
}\r
if (url.EndsWith("api_req_kousyou/createship_speedchange"))\r
{\r
return Update.None;\r
}\r
\r
- private Update ApiBattle(string url, string request, dynamic data)\r
+ private Update ApiPractice(string url, string request, dynamic data)\r
{\r
- if (IsNormalBattleAPI(url))\r
+ if (url.EndsWith("api_req_practice/battle_result"))\r
{\r
- _battleInfo.InspectBattle(data, url);\r
- _logger.InspectBattle(data);\r
- return Update.Ship | Update.Battle;\r
+ _battleInfo.InspectPracticeResult(data);\r
+ _questCounter.InspectPracticeResult(data);\r
+ return Update.Ship | Update.QuestList;\r
+ }\r
+ if (url.EndsWith("api_req_practice/battle"))\r
+ {\r
+ _shipInfo.StartPractice(request);\r
+ _questCounter.StartPractice(request);\r
+ _cellInfo.StartPractice();\r
+ _conditionTimer.InvalidateCond();\r
+ RepeatingTimerController?.Suspend();\r
}\r
if (url.EndsWith("api_req_practice/battle") || url.EndsWith("api_req_practice/midnight_battle"))\r
{\r
- if (url.EndsWith("/battle"))\r
- {\r
- _shipInfo.InspectMapStart(request); // 演習を出撃中とみなす\r
- _conditionTimer.InvalidateCond();\r
- _miscTextInfo.ClearFlag = true;\r
- }\r
- _battleInfo.InspectBattle(data, url);\r
+ _battleInfo.InspectBattle(url, request, data);\r
return Update.Ship | Update.Battle | Update.Timer;\r
}\r
- if (url.EndsWith("api_req_sortie/battleresult"))\r
+ return Update.None;\r
+ }\r
+\r
+ private Update ApiBattle(string url, string request, dynamic data)\r
+ {\r
+ if (url.EndsWith("/battleresult"))\r
{\r
_battleInfo.InspectBattleResult(data);\r
_exMapInfo.InspectBattleResult(data);\r
_logger.InspectBattleResult(data);\r
- return Update.Ship;\r
- }\r
- if (url.EndsWith("api_req_practice/battle_result"))\r
- {\r
- _battleInfo.InspectPracticeResult(data);\r
- return Update.Ship;\r
- }\r
- if (IsCombinedBattleAPI(url))\r
- {\r
- _battleInfo.InspectCombinedBattle(data, url);\r
- _logger.InspectBattle(data);\r
- return Update.Ship | Update.Battle;\r
+ _questCounter.InspectBattleResult(data);\r
+ _miscTextInfo.InspectBattleResult(data);\r
+ return Update.Ship | Update.QuestList;\r
}\r
- if (url.EndsWith("api_req_combined_battle/battleresult"))\r
+ if (url.EndsWith("/goback_port"))\r
{\r
- _battleInfo.InspectCombinedBattleResult(data);\r
- _logger.InspectBattleResult(data);\r
+ _battleInfo.CauseEscape();\r
return Update.Ship;\r
}\r
- if (url.EndsWith("api_req_combined_battle/goback_port"))\r
- {\r
- _battleInfo.CauseCombinedBattleEscape();\r
- return Update.Ship;\r
- }\r
- return Update.None;\r
- }\r
-\r
- private bool IsNormalBattleAPI(string url)\r
- {\r
- return url.EndsWith("api_req_sortie/battle") ||\r
- url.EndsWith("api_req_sortie/airbattle") ||\r
- url.EndsWith("api_req_sortie/ld_airbattle") ||\r
- url.EndsWith("api_req_battle_midnight/battle") ||\r
- url.EndsWith("api_req_battle_midnight/sp_midnight");\r
- }\r
-\r
- private bool IsCombinedBattleAPI(string url)\r
- {\r
- return url.EndsWith("api_req_combined_battle/battle") ||\r
- url.EndsWith("api_req_combined_battle/airbattle") ||\r
- url.EndsWith("api_req_combined_battle/ld_airbattle") ||\r
- url.EndsWith("api_req_combined_battle/battle_water") ||\r
- url.EndsWith("api_req_combined_battle/midnight_battle") ||\r
- url.EndsWith("api_req_combined_battle/sp_midnight");\r
+ _shipInfo.ClearBadlyDamagedShips();\r
+ RepeatingTimerController?.Stop("大破警告");\r
+ _battleInfo.InspectBattle(url, request, data);\r
+ _cellInfo.StartBattle();\r
+ return Update.Ship | Update.Battle;\r
}\r
\r
- private Update ApiOthers(string url, string request, dynamic data)\r
+ private Update ApiHensei(string url, string request, dynamic data)\r
{\r
if (url.EndsWith("api_req_hensei/change"))\r
{\r
}\r
if (url.EndsWith("api_req_hensei/preset_register"))\r
{\r
- _shipInfo.InspectPresetRegister(data);\r
+ _presetDeck.InspectRegister(data);\r
return Update.None;\r
}\r
if (url.EndsWith("api_req_hensei/preset_delete"))\r
{\r
- _shipInfo.InspectPresetDelete(request);\r
+ _presetDeck.InspectDelete(request);\r
return Update.Timer;\r
}\r
if (url.EndsWith("api_req_hensei/combined"))\r
_shipInfo.InspectCombined(request);\r
return Update.Ship;\r
}\r
- if (url.EndsWith("api_req_hokyu/charge"))\r
- {\r
- _shipInfo.InspectCharge(data);\r
- _materialInfo.InspectCharge(data);\r
- return Update.Item | Update.Ship;\r
- }\r
+ return Update.None;\r
+ }\r
+\r
+ private Update ApiKaisou(string url, string request, dynamic data)\r
+ {\r
if (url.EndsWith("api_req_kaisou/powerup"))\r
{\r
- _shipInfo.InspectPowerup(request, data);\r
+ _shipInfo.InspectPowerUp(request, data);\r
_conditionTimer.CheckCond();\r
_akashiTimer.CheckFleet();\r
- return Update.Item | Update.Ship;\r
+ _questCounter.InspectPowerUp(data);\r
+ return Update.Item | Update.Ship | Update.QuestList;\r
}\r
if (url.EndsWith("api_req_kaisou/slot_exchange_index"))\r
{\r
- _shipInfo.InspectSlotExchange(request, data);\r
+ _shipInfo.InspectSlotExchange(data);\r
return Update.Ship;\r
}\r
if (url.EndsWith("api_req_kaisou/slot_deprive"))\r
_shipInfo.InspectSlotDeprive(data);\r
return Update.Ship;\r
}\r
- if (url.EndsWith("api_req_nyukyo/start"))\r
+ if (url.EndsWith("api_req_kaisou/marriage"))\r
{\r
- _dockInfo.InspectNyukyo(request);\r
- _conditionTimer.CheckCond();\r
- _akashiTimer.CheckFleet();\r
+ _shipInfo.InspectMarriage(data);\r
+ return Update.Ship;\r
+ }\r
+ return Update.None;\r
+ }\r
+\r
+ private Update ApiAirCorps(string url, string request, dynamic data)\r
+ {\r
+ if (url.EndsWith("api_req_air_corps/supply"))\r
+ {\r
+ _materialInfo.InspectAirCorpsSupply(data);\r
+ _airBase.InspectSupply(request, data);\r
+ return Update.Item;\r
+ }\r
+ if (url.EndsWith("api_req_air_corps/set_plane"))\r
+ {\r
+ _materialInfo.InspectAirCorpsSetPlane(data);\r
+ _airBase.InspectSetPlane(request, data);\r
return Update.Item | Update.Ship;\r
}\r
- if (url.EndsWith("api_req_nyukyo/speedchange"))\r
+ if (url.EndsWith("api_req_air_corps/set_action"))\r
{\r
- _dockInfo.InspectSpeedChange(request);\r
- _conditionTimer.CheckCond();\r
- return Update.NDock | Update.Timer | Update.Ship;\r
+ _airBase.InspectSetAction(request);\r
+ return Update.Ship;\r
}\r
+ if (url.EndsWith("api_req_air_corps/expand_base"))\r
+ {\r
+ _airBase.InspectExpandBase(request, data);\r
+ return Update.Ship;\r
+ }\r
+ return Update.None;\r
+ }\r
+\r
+ private Update ApiMap(string url, string request, dynamic data)\r
+ {\r
if (url.EndsWith("api_req_map/start"))\r
{\r
_shipInfo.InspectMapStart(request); // 出撃中判定が必要なので_conditionTimerより前\r
_conditionTimer.InvalidateCond();\r
_exMapInfo.InspectMapStart(data);\r
+ _battleInfo.InspectMapStart(data);\r
_logger.InspectMapStart(data);\r
- _miscTextInfo.ClearFlag = true;\r
- return Update.Timer | Update.Ship;\r
+ _miscTextInfo.InspectMapStart(data);\r
+ _questCounter.InspectMapStart(data);\r
+ _cellInfo.InspectMapStart(data);\r
+ RepeatingTimerController?.Suspend("大破警告");\r
+ return Update.Timer | Update.Ship | Update.Cell;\r
}\r
if (url.EndsWith("api_req_map/next"))\r
{\r
- _battleInfo.InspectMapNext(request);\r
_exMapInfo.InspectMapNext(data);\r
+ _battleInfo.InspectMapNext(data);\r
_logger.InspectMapNext(data);\r
+ _questCounter.InspectMapNext(data);\r
+ _miscTextInfo.InspectMapNext(data);\r
+ _cellInfo.InspectMapNext(data);\r
+ return Update.Battle;\r
+ }\r
+ if (url.EndsWith("api_req_map/anchorage_repair"))\r
+ {\r
+ _shipInfo.InspectAnchorageRepair(data);\r
+ return Update.Ship;\r
+ }\r
+ return Update.None;\r
+ }\r
+\r
+ private Update ApiOthers(string url, string request, dynamic data)\r
+ {\r
+ if (url.EndsWith("api_req_hokyu/charge"))\r
+ {\r
+ _shipInfo.InspectCharge(data);\r
+ _materialInfo.InspectCharge(data);\r
+ _questCounter.CountCharge();\r
+ return Update.Item | Update.Ship | Update.QuestList;\r
+ }\r
+ if (url.EndsWith("api_req_nyukyo/start"))\r
+ {\r
+ _dockInfo.InspectNyukyo(request);\r
+ _conditionTimer.CheckCond();\r
+ _akashiTimer.CheckFleet();\r
+ _questCounter.CountNyukyo();\r
+ var ndock = HttpUtility.ParseQueryString(request)["api_ndock_id"];\r
+ if (ndock != null && int.TryParse(ndock, out int id))\r
+ RepeatingTimerController?.Stop("入渠終了", id - 1);\r
+ return Update.Item | Update.Ship | Update.QuestList;\r
+ }\r
+ if (url.EndsWith("api_req_nyukyo/speedchange"))\r
+ {\r
+ _dockInfo.InspectSpeedChange(request);\r
+ _conditionTimer.CheckCond();\r
+ return Update.NDock | Update.Timer | Update.Item | Update.Ship;\r
+ }\r
+ if (url.EndsWith("api_req_mission/start"))\r
+ {\r
+ var deck = HttpUtility.ParseQueryString(request)["api_deck_id"];\r
+ if (deck != null && int.TryParse(deck, out int id))\r
+ RepeatingTimerController?.Stop("遠征終了", id - 1);\r
return Update.None;\r
}\r
if (url.EndsWith("api_req_mission/result"))\r
{\r
_materialInfo.InspectMissionResult(data);\r
_logger.InspectMissionResult(data);\r
+ _questCounter.InspectMissionResult(request, data);\r
return Update.Item;\r
}\r
if (url.EndsWith("api_req_quest/stop"))\r
if (url.EndsWith("api_req_quest/clearitemget"))\r
{\r
_questInfo.InspectClearItemGet(request);\r
+ _logger.InspectClearItemGet(data);\r
return Update.QuestList;\r
}\r
- if (url.EndsWith("api_req_air_corps/supply"))\r
- {\r
- _materialInfo.InspectAirCorpsSupply(data);\r
- return Update.Item;\r
- }\r
- if (url.EndsWith("api_req_air_corps/set_plane"))\r
- {\r
- _materialInfo.InspectAirCorpsSetPlane(data);\r
- _baseAirCoprs.InspectSetPlane(request, data);\r
- return Update.Item | Update.Ship;\r
- }\r
- if (url.EndsWith("api_req_air_corps/set_action"))\r
- {\r
- _baseAirCoprs.InspectSetAction(request);\r
- return Update.Ship;\r
- }\r
return Update.None;\r
}\r
\r
public NameAndTimer[] NDock => _dockInfo.NDock;\r
\r
- public RingTimer[] KDock => _dockInfo.KDock;\r
+ public AlarmTimer[] KDock => _dockInfo.KDock;\r
\r
- public ItemInfo Item => _itemInfo;\r
+ public AlarmCounter ItemCounter => _itemInfo.Counter;\r
\r
public MaterialInfo Material => _materialInfo;\r
\r
public QuestStatus[] Quests => _questInfo.Quests;\r
\r
+ public void GetQuestNotifications(out string[] notify, out string[] stop) =>\r
+ _questInfo.GetNotifications(out notify, out stop);\r
+\r
public NameAndTimer[] Missions => _missionInfo.Missions;\r
\r
public DateTime GetConditionTimer(int fleet) => _conditionTimer.GetTimer(fleet);\r
\r
- public int[] GetConditionNotice() => _conditionTimer.GetNotice();\r
+ public int[] GetConditionNotice(TimeStep step) => _conditionTimer.GetNotice(step);\r
\r
- public ShipStatus[] GetShipStatuses(int fleet) => _shipInfo.GetShipStatuses(fleet);\r
+ public AlarmCounter ShipCounter => _shipInfo.Counter;\r
\r
- public int[] GetDeck(int fleet) => _shipInfo.GetDeck(fleet);\r
+ public IReadOnlyList<Fleet> Fleets => _shipInfo.Fleets;\r
\r
- public int CombinedFleetType => _shipInfo.CombinedFleetType;\r
+ public int InSortie => _shipInfo.InSortie;\r
\r
- public ChargeStatus[] ChargeStatuses => _shipInfo.ChargeStatuses;\r
+ public ShipInfo.ShipStatusPair[] BattleResultStatusDiff => _shipInfo.BattleResultDiff;\r
\r
- public int[] GetFighterPower(int fleet) => _shipInfo.GetFighterPower(fleet);\r
+ public bool IsBattleResultError => _shipInfo.IsBattleResultError || _battleInfo.DisplayedResultRank.IsError;\r
\r
- public double GetContactTriggerRate(int fleet) => _shipInfo.GetContactTriggerRate(fleet);\r
+ public ShipStatus[] BattleStartStatus => _shipInfo.BattleStartStatus;\r
\r
- public double GetFleetLineOfSights(int fleet) => _shipInfo.GetLineOfSights(fleet);\r
+ public bool IsCombinedFleet => _shipInfo.Fleets[0].CombinedType != 0;\r
\r
public ShipStatus[] RepairList => _shipInfo.GetRepairList(_dockInfo);\r
\r
\r
public string[] BadlyDamagedShips => _shipInfo.BadlyDamagedShips;\r
\r
+ public bool WarnBadDamageWithDameCon\r
+ {\r
+ set => _shipInfo.WarnBadDamageWithDameCon = value;\r
+ }\r
+\r
public ItemStatus[] ItemList\r
{\r
get\r
{\r
_itemInfo.ClearHolder();\r
_shipInfo.SetItemHolder();\r
- _baseAirCoprs.SetItemHolder();\r
+ _airBase.SetItemHolder();\r
return _itemInfo.ItemList;\r
}\r
}\r
\r
public string MiscText => _miscTextInfo.Text;\r
\r
- public BaseAirCoprs.AirCorpsInfo[] BaseAirCorps => _baseAirCoprs.AirCorps;\r
+ public AirBase.BaseInfo[] AirBase => _airBase.AllBase;\r
+\r
+ public CellInfo CellInfo => _cellInfo;\r
\r
public void SetLogWriter(Action<string, string, string> writer, Func<DateTime> nowFunc)\r
{\r
_logger.SetWriter(writer, nowFunc);\r
}\r
\r
- public void SkipMaster()\r
- {\r
- _start = true;\r
- }\r
-\r
public void EnableLog(LogType type)\r
{\r
_logger.EnableLog(type);\r
\r
public int MaterialLogInterval\r
{\r
- set { _logger.MaterialLogInterval = value; }\r
+ set => _logger.MaterialLogInterval = value;\r
}\r
\r
public string LogOutputDir\r
{\r
- set { _logger.OutputDir = value; }\r
- }\r
- }\r
-\r
- public class NameAndTimer\r
- {\r
- public string Name { get; set; }\r
- public RingTimer Timer { get; set; }\r
-\r
- public NameAndTimer()\r
- {\r
- Timer = new RingTimer();\r
+ set => _logger.OutputDir = value;\r
}\r
- }\r
-\r
- public class RingTimer\r
- {\r
- private readonly TimeSpan _spare;\r
\r
- public TimeSpan Rest { get; private set; }\r
-\r
- public bool IsFinished => EndTime != DateTime.MinValue && Rest <= _spare;\r
-\r
- public DateTime EndTime { get; private set; }\r
-\r
- public bool NeedRing { get; set; }\r
-\r
- public RingTimer(int spare = 60)\r
+ public void FlashLog()\r
{\r
- _spare = TimeSpan.FromSeconds(spare);\r
+ _logger.FlashLog();\r
}\r
-\r
- public void SetEndTime(double time)\r
- {\r
- SetEndTime((int)time == 0\r
- ? DateTime.MinValue\r
- : new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time / 1000));\r
- }\r
-\r
- public void SetEndTime(DateTime time)\r
- {\r
- EndTime = time;\r
- }\r
-\r
- public void Update()\r
- {\r
- if (EndTime == DateTime.MinValue)\r
- {\r
- Rest = TimeSpan.Zero;\r
- return;\r
- }\r
- var prev = Rest;\r
- Rest = EndTime - DateTime.Now;\r
- if (Rest < TimeSpan.Zero)\r
- Rest = TimeSpan.Zero;\r
- if (prev > _spare && _spare >= Rest)\r
- NeedRing = true;\r
- }\r
-\r
- public string ToString(bool finish = false)\r
- => EndTime == DateTime.MinValue\r
- ? ""\r
- : finish ? EndTime.ToString(@"dd\ HH\:mm") : $@"{(int)Rest.TotalHours:d2}:{Rest:mm\:ss}";\r
}\r
}
\ No newline at end of file