-// Copyright (C) 2013 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>\r
+// Copyright (C) 2013, 2014 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>\r
// \r
// This program is part of KancolleSniffer.\r
//\r
\r
namespace KancolleSniffer\r
{\r
- [Flags]\r
- public enum UpdateInfo\r
- {\r
- None = 0,\r
- Item = 1,\r
- Ship = 2,\r
- Timer = 4,\r
- Quest = 8,\r
- NDock = 16,\r
- Mission = 32,\r
- Charge = 64\r
- }\r
-\r
public class Sniffer\r
{\r
+ private bool _start;\r
private readonly ShipMaster _shipMaster = new ShipMaster();\r
private readonly ItemInfo _itemInfo = new ItemInfo();\r
private readonly QuestInfo _questInfo = new QuestInfo();\r
private readonly MissionInfo _missionInfo = new MissionInfo();\r
private readonly ShipInfo _shipInfo;\r
private readonly DockInfo _dockInfo;\r
+ private readonly AkashiTimer _akashiTimer;\r
+ private readonly Achievement _achievement = new Achievement();\r
+ private readonly BattleInfo _battleInfo;\r
+ private readonly Status _status = new Status();\r
+\r
+ [Flags]\r
+ public enum Update\r
+ {\r
+ None = 0,\r
+ Start = 1,\r
+ Item = 2,\r
+ Ship = 4,\r
+ Timer = 8,\r
+ NDock = 16,\r
+ Mission = 32,\r
+ QuestList = 64,\r
+ Battle = 128,\r
+ All = 255\r
+ }\r
\r
public Sniffer()\r
{\r
- _shipInfo = new ShipInfo(_shipMaster);\r
- _dockInfo = new DockInfo(_shipInfo);\r
+ _shipInfo = new ShipInfo(_shipMaster, _itemInfo);\r
+ _dockInfo = new DockInfo(_shipInfo, _itemInfo);\r
+ _akashiTimer = new AkashiTimer(_shipInfo, _itemInfo, _dockInfo);\r
+ _battleInfo = new BattleInfo(_shipMaster, _shipInfo, _itemInfo);\r
+ }\r
+\r
+ public void SaveState()\r
+ {\r
+ _achievement.SaveState(_status);\r
+ _itemInfo.SaveState(_status);\r
+ _status.Save();\r
+ }\r
+\r
+ public void LoadState()\r
+ {\r
+ _status.Load();\r
+ _achievement.LoadState(_status);\r
+ _itemInfo.LoadSate(_status);\r
}\r
\r
- public UpdateInfo Sniff(string uri, dynamic json)\r
+ public Update Sniff(string url, string request, dynamic json)\r
{\r
- if (uri.EndsWith("api_get_master/ship"))\r
+ var data = json.IsDefined("api_data") ? json.api_data : new object();\r
+\r
+ if (url.EndsWith("api_start2"))\r
+ {\r
+ _start = true;\r
+ _shipMaster.Inspect(data.api_mst_ship);\r
+ _shipMaster.InspectStype(data.api_mst_stype);\r
+ _missionInfo.InspectMaster(data.api_mst_mission);\r
+ _itemInfo.InspectMaster(data.api_mst_slotitem);\r
+ return Update.Start;\r
+ }\r
+ if (!_start)\r
+ return Update.None;\r
+ if (url.EndsWith("api_port/port"))\r
+ {\r
+ _itemInfo.InspectBasic(data.api_basic);\r
+ _itemInfo.InspectMaterial(data.api_material);\r
+ _shipInfo.InspectShip(data);\r
+ _missionInfo.InspectDeck(data.api_deck_port);\r
+ _dockInfo.InspectNDock(data.api_ndock);\r
+ _akashiTimer.SetTimer(true);\r
+ _achievement.InspectBasic(data.api_basic);\r
+ _battleInfo.InBattle = false;\r
+ _battleInfo.HasDamagedShip = false;\r
+ _shipInfo.ClearEscapedShips();\r
+ return Update.All;\r
+ }\r
+ if (url.EndsWith("api_get_member/basic"))\r
+ {\r
+ _itemInfo.InspectBasic(data);\r
+ return Update.None;\r
+ }\r
+ if (url.EndsWith("api_get_member/slot_item"))\r
+ {\r
+ _itemInfo.InspectSlotItem(data, true);\r
+ return Update.None;\r
+ }\r
+ if (url.EndsWith("api_get_member/kdock"))\r
+ {\r
+ _dockInfo.InspectKDock(data);\r
+ return Update.Timer;\r
+ }\r
+ if (url.EndsWith("api_get_member/ndock"))\r
+ {\r
+ _dockInfo.InspectNDock(data);\r
+ _akashiTimer.SetTimer();\r
+ return Update.NDock | Update.Timer | Update.Ship;\r
+ }\r
+ if (url.EndsWith("api_req_hensei/change"))\r
+ {\r
+ _shipInfo.InspectChange(request);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Ship;\r
+ }\r
+ if (url.EndsWith("api_get_member/questlist"))\r
+ {\r
+ _questInfo.Inspect(data);\r
+ return Update.QuestList;\r
+ }\r
+ if (url.EndsWith("api_get_member/deck"))\r
+ {\r
+ _shipInfo.InspectDeck(data);\r
+ _missionInfo.InspectDeck(data);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Mission | Update.Timer;\r
+ }\r
+ if (url.EndsWith("api_get_member/ship2"))\r
+ {\r
+ // ここだけjsonなので注意\r
+ _shipInfo.InspectShip(json);\r
+ _akashiTimer.SetTimer();\r
+ _battleInfo.InBattle = false;\r
+ return Update.Item | Update.Ship | Update.Battle;\r
+ }\r
+ if (url.EndsWith("api_get_member/ship3"))\r
+ {\r
+ _shipInfo.InspectShip(data);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Ship;\r
+ }\r
+ if (url.EndsWith("api_get_member/material"))\r
+ {\r
+ _itemInfo.InspectMaterial(data);\r
+ return Update.Item;\r
+ }\r
+ if (url.EndsWith("api_req_hokyu/charge"))\r
+ {\r
+ _shipInfo.InspectCharge(data);\r
+ return Update.Item | Update.Ship;\r
+ }\r
+ if (url.EndsWith("api_req_kousyou/createitem"))\r
+ {\r
+ _itemInfo.InspectCreateItem(data);\r
+ return Update.Item;\r
+ }\r
+ if (url.EndsWith("api_req_kousyou/getship"))\r
+ {\r
+ _itemInfo.InspectGetShip(data);\r
+ _shipInfo.InspectShip(data);\r
+ _dockInfo.InspectKDock(data.api_kdock);\r
+ return Update.Item | Update.Timer;\r
+ }\r
+ if (url.EndsWith("api_req_kousyou/destroyship"))\r
+ {\r
+ _shipInfo.InspectDestroyShip(request, data);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Item | Update.Ship;\r
+ }\r
+ if (url.EndsWith("api_req_kousyou/destroyitem2"))\r
+ {\r
+ _itemInfo.InspectDestroyItem(request, data);\r
+ return Update.Item;\r
+ }\r
+ if (url.EndsWith("api_req_kousyou/remodel_slot"))\r
{\r
- _shipMaster.InspectShip(json);\r
- return UpdateInfo.None;\r
+ _itemInfo.InspectRemodelSlot(data);\r
+ return Update.Item;\r
}\r
- if (uri.EndsWith("api_get_member/basic"))\r
+ if (url.EndsWith("api_req_kaisou/powerup"))\r
{\r
- _itemInfo.InspectBasic(json);\r
- return UpdateInfo.Item;\r
+ _shipInfo.InspectPowerup(request, data);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Item | Update.Ship;\r
}\r
- if (uri.EndsWith("api_get_member/record"))\r
+ if (url.EndsWith("api_req_nyukyo/start"))\r
{\r
- _itemInfo.InspectRecord(json);\r
- return UpdateInfo.Item;\r
+ _dockInfo.InspectNyukyo(request);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Item | Update.Ship;\r
}\r
- if (uri.EndsWith("api_get_member/material"))\r
+ if (url.EndsWith("api_req_nyukyo/speedchange"))\r
{\r
- _itemInfo.InspectMaterial(json);\r
- return UpdateInfo.Item;\r
+ _dockInfo.InspectSpeedChange(request);\r
+ return Update.NDock | Update.Timer | Update.Ship;\r
}\r
- if (uri.EndsWith("api_get_member/slotitem"))\r
+ if (IsNormalBattleAPI(url))\r
{\r
- _itemInfo.InspectSlotItem(json);\r
- return UpdateInfo.Item;\r
+ _battleInfo.InspectBattle(data);\r
+ if (!url.EndsWith("api_req_practice/battle"))\r
+ return Update.Battle;\r
+ _shipInfo.StartSortie(request); // 演習を出撃中とみなす\r
+ return Update.Battle | Update.Timer;\r
}\r
- if (uri.EndsWith("api_get_member/questlist"))\r
+ if (url.EndsWith("api_req_sortie/battleresult"))\r
{\r
- _questInfo.Inspect(json);\r
- return UpdateInfo.Quest;\r
+ _battleInfo.CauseDamage();\r
+ return Update.Ship;\r
}\r
- if (uri.EndsWith("api_get_member/ndock"))\r
+ if (url.EndsWith("api_req_practice/battle_result"))\r
{\r
- _dockInfo.InspectNDock(json);\r
- return UpdateInfo.NDock | UpdateInfo.Timer;\r
+ _battleInfo.CausePracticeDamage();\r
+ return Update.Ship;\r
}\r
- if (uri.EndsWith("api_get_member/kdock"))\r
+ if (IsCombinedBattleAPI(url))\r
{\r
- _dockInfo.InspectKDock(json);\r
- return UpdateInfo.Timer;\r
+ _battleInfo.InspectCombinedBattle(data, url.EndsWith("battle_water"));\r
+ return Update.Battle;\r
}\r
- if (uri.EndsWith("api_get_master/mission"))\r
+ if (url.EndsWith("api_req_combined_battle/battleresult"))\r
{\r
- _missionInfo.InspectMission(json);\r
- return UpdateInfo.Mission;\r
+ _battleInfo.InspectCombinedBattleResult(data);\r
+ return Update.Ship;\r
}\r
- if (uri.Contains("api_get_member/deck"))\r
+ if (url.EndsWith("api_req_combined_battle/goback_port"))\r
{\r
- _missionInfo.InspectDeck(json);\r
- _shipInfo.InspectDeck(json);\r
- return UpdateInfo.Mission | UpdateInfo.Ship | UpdateInfo.Charge;\r
+ _battleInfo.CauseCombinedBattleEscape();\r
+ return Update.None;\r
}\r
- if (uri.EndsWith("api_get_member/ship2") || uri.EndsWith("api_get_member/ship3"))\r
+ if (url.EndsWith("api_req_map/start"))\r
{\r
- _shipInfo.InspectShipInfo(uri.EndsWith("ship3") ? json.api_ship_data : json);\r
- _itemInfo.NowShips = _shipInfo.NumShips;\r
- return UpdateInfo.Ship | UpdateInfo.Item | UpdateInfo.Timer | UpdateInfo.NDock | UpdateInfo.Charge;\r
+ _shipInfo.StartSortie(request);\r
+ return Update.Timer;\r
}\r
- return UpdateInfo.None;\r
+ if (url.EndsWith("api_req_mission/result"))\r
+ {\r
+ _itemInfo.InspectMissionResult(data);\r
+ return Update.Item;\r
+ }\r
+ return Update.None;\r
}\r
\r
- public void SaveMaster()\r
+ public bool IsBattleAPI(string url)\r
{\r
- _missionInfo.SaveNames();\r
- _shipMaster.Save();\r
+ return IsNormalBattleAPI(url) || IsCombinedBattleAPI(url);\r
}\r
\r
- public void LoadMaster()\r
+ public bool IsNormalBattleAPI(string url)\r
{\r
- _missionInfo.LoadNames();\r
- _shipMaster.Load();\r
+ return url.EndsWith("api_req_sortie/battle") || url.EndsWith("api_req_practice/battle") ||\r
+ url.EndsWith("api_req_battle_midnight/battle") ||\r
+ url.EndsWith("api_req_battle_midnight/sp_midnight") ||\r
+ url.EndsWith("api_req_practice/midnight_battle");\r
+ }\r
+\r
+ public 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/battle_water") ||\r
+ url.EndsWith("api_req_combined_battle/midnight_battle") ||\r
+ url.EndsWith("api_req_combined_battle/sp_midnight");\r
}\r
\r
public NameAndTimer[] NDock\r
get { return _missionInfo.Missions; }\r
}\r
\r
- public string FleetName\r
+ public DateTime GetConditionTimer(int fleet)\r
{\r
- get { return _shipInfo.FleetName; }\r
+ return _shipInfo.GetConditionTiemr(fleet);\r
}\r
\r
- public DateTime[] RecoveryTimes\r
+ public int[] GetConditionNotice()\r
{\r
- get { return _shipInfo.RecoveryTimes; }\r
+ return _shipInfo.GetConditionNotice();\r
}\r
\r
- public ShipStatus[] ShipStatuses\r
+ public ShipStatus[] GetShipStatuses(int fleet)\r
{\r
- get { return _shipInfo.ShipStatuses; }\r
+ return _shipInfo.GetShipStatuses(fleet);\r
}\r
\r
public ChargeStatus[] ChargeStatuses\r
{\r
get { return _shipInfo.ChargeStatuses; }\r
}\r
+\r
+ public int GetAirSuperiority(int fleet)\r
+ {\r
+ return _shipInfo.GetAirSuperiority(fleet);\r
+ }\r
+\r
+ public double GetFleetLineOfSights(int fleet)\r
+ {\r
+ return _shipInfo.GetLineOfSights(fleet);\r
+ }\r
+\r
+ public ShipStatus[] DamagedShipList\r
+ {\r
+ get { return _shipInfo.GetDamagedShipList(_dockInfo); }\r
+ }\r
+\r
+ public ShipStatus[] ShipList\r
+ {\r
+ get { return _shipInfo.ShipList; }\r
+ }\r
+\r
+ public ShipType[] ShipTypeList\r
+ {\r
+ get { return _shipMaster.ShipTypeList; }\r
+ }\r
+\r
+ public AkashiTimer.RepairSpan[] GetAkashiTimers(int fleet)\r
+ {\r
+ return _akashiTimer.GetTimers(fleet);\r
+ }\r
+\r
+ public string[] GetAkashiTimerNotice()\r
+ {\r
+ return _akashiTimer.GetNotice();\r
+ }\r
+\r
+ public Achievement Achievement\r
+ {\r
+ get { return _achievement; }\r
+ }\r
+\r
+ public BattleInfo Battle\r
+ {\r
+ get { return _battleInfo; }\r
+ }\r
}\r
\r
public class NameAndTimer\r
\r
public class RingTimer\r
{\r
- private bool _ringed;\r
private DateTime _endTime;\r
private TimeSpan _rest;\r
private readonly TimeSpan _spare;\r
_spare = TimeSpan.FromSeconds(spare);\r
}\r
\r
- public double EndTime\r
+ public void SetEndTime(double time)\r
{\r
- set\r
- {\r
-// ReSharper disable once CompareOfFloatsByEqualityOperator\r
- if (value != 0)\r
- _endTime = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(value / 1000);\r
- else\r
- {\r
- _endTime = DateTime.MinValue;\r
- _ringed = false;\r
- }\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
+ if (_endTime == DateTime.MinValue)\r
+ IsFinished = false;\r
}\r
\r
public void Update()\r
_rest = _endTime - DateTime.Now;\r
if (_rest < TimeSpan.Zero)\r
_rest = TimeSpan.Zero;\r
- if (_rest > _spare || _ringed)\r
+ if (_rest > _spare || IsFinished)\r
return;\r
- _ringed = true;\r
+ IsFinished = true;\r
NeedRing = true;\r
}\r
\r
+ public bool IsFinished { get; private set; }\r
public bool NeedRing { get; set; }\r
\r
- public bool IsSet\r
- {\r
- get { return _endTime != DateTime.MinValue; }\r
- }\r
-\r
public override string ToString()\r
{\r
return _rest.Days == 0 ? _rest.ToString(@"hh\:mm\:ss") : _rest.ToString(@"d\.hh\:mm");\r