OSDN Git Service

通常の夜戦のダメージが戦闘結果に反映されないのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Sniffer.cs
index 4558dc3..f8e5abe 100644 (file)
@@ -1,4 +1,4 @@
-// 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
@@ -19,106 +19,260 @@ using System;
 \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
@@ -146,25 +300,70 @@ namespace KancolleSniffer
             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
@@ -180,7 +379,6 @@ namespace KancolleSniffer
 \r
     public class RingTimer\r
     {\r
-        private bool _ringed;\r
         private DateTime _endTime;\r
         private TimeSpan _rest;\r
         private readonly TimeSpan _spare;\r
@@ -190,19 +388,18 @@ namespace KancolleSniffer
             _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
@@ -215,19 +412,15 @@ namespace KancolleSniffer
             _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