OSDN Git Service

終了時に戦果がリセットされないようにする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Sniffer.cs
index 10d5847..23cc7bd 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,137 +19,177 @@ 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 readonly NameAndTimer[] _ndocInfo = new NameAndTimer[4];\r
-        private readonly RingTimer[] _kdocTimers = new RingTimer[4];\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 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
+            All = 127\r
+        }\r
 \r
         public Sniffer()\r
         {\r
-            _shipInfo = new ShipInfo(_shipMaster);\r
-            for (var i = 0; i < _ndocInfo.Length; i++)\r
-                _ndocInfo[i] = new NameAndTimer();\r
-            for (var i = 0; i < _kdocTimers.Length; i++)\r
-                _kdocTimers[i] = new RingTimer(0);\r
+            _shipInfo = new ShipInfo(_shipMaster, _itemInfo);\r
+            _dockInfo = new DockInfo(_shipInfo);\r
+            _akashiTimer = new AkashiTimer(_shipInfo, _itemInfo, _dockInfo, _missionInfo);\r
         }\r
 \r
-        public UpdateInfo Sniff(string uri, dynamic json)\r
+        public void SaveState()\r
         {\r
-            if (uri.EndsWith("api_get_master/ship"))\r
+            _achievement.SaveState(_status);\r
+            _status.Save();\r
+        }\r
+\r
+        public void LoadState()\r
+        {\r
+            _status.Load();\r
+            _achievement.LoadState(_status);\r
+        }\r
+\r
+        public Update Sniff(string url, string request, dynamic json)\r
+        {\r
+            var data = json.IsDefined("api_data") ? json.api_data : new object();\r
+\r
+            if (url.EndsWith("api_start2"))\r
             {\r
-                _shipMaster.InspectShip(json);\r
-                return UpdateInfo.None;\r
+                _start = true;\r
+                _shipMaster.Inspect(data.api_mst_ship);\r
+                _missionInfo.InspectMaster(data.api_mst_mission);\r
+                _itemInfo.InspectMaster(data.api_mst_slotitem);\r
+                return Update.Start;\r
             }\r
-            if (uri.EndsWith("api_get_member/basic"))\r
+            if (!_start)\r
+                return Update.None;\r
+            if (url.EndsWith("api_port/port"))\r
             {\r
-                _itemInfo.InspectBasic(json);\r
-                return UpdateInfo.Item;\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
+                return Update.All;\r
             }\r
-            if (uri.EndsWith("api_get_member/record"))\r
+            if (url.EndsWith("api_get_member/basic"))\r
             {\r
-                _itemInfo.InspectRecord(json);\r
-                return UpdateInfo.Item;\r
+                _itemInfo.InspectBasic(data);\r
+                return Update.None;\r
             }\r
-            if (uri.EndsWith("api_get_member/material"))\r
+            if (url.EndsWith("api_get_member/slot_item"))\r
             {\r
-                _itemInfo.InspectMaterial(json);\r
-                return UpdateInfo.Item;\r
+                _itemInfo.InspectSlotItem(data, true);\r
+                return Update.None;\r
             }\r
-            if (uri.EndsWith("api_get_member/slotitem"))\r
+            if (url.EndsWith("api_get_member/kdock"))\r
             {\r
-                _itemInfo.InspectSlotItem(json);\r
-                return UpdateInfo.Item;\r
+                _dockInfo.InspectKDock(data);\r
+                return Update.Timer;\r
             }\r
-            if (uri.EndsWith("api_get_member/questlist"))\r
+            if (url.EndsWith("api_get_member/ndock"))\r
             {\r
-                _questInfo.Inspect(json);\r
-                return UpdateInfo.Quest;\r
+                _dockInfo.InspectNDock(data);\r
+                _akashiTimer.SetTimer();\r
+                return Update.NDock | Update.Timer;\r
             }\r
-            if (uri.EndsWith("api_get_member/ndock"))\r
+            if (url.EndsWith("api_req_hensei/change"))\r
             {\r
-                InspectNDock(json);\r
-                return UpdateInfo.NDock | UpdateInfo.Timer;\r
+                _shipInfo.InspectChange(request);\r
+                _akashiTimer.SetTimer();\r
+                return Update.Ship;\r
             }\r
-            if (uri.EndsWith("api_get_member/kdock"))\r
+            if (url.EndsWith("api_get_member/questlist"))\r
             {\r
-                InspectKDock(json);\r
-                return UpdateInfo.Timer;\r
+                _questInfo.Inspect(data);\r
+                return Update.QuestList;\r
             }\r
-            if (uri.EndsWith("api_get_master/mission"))\r
+            if (url.EndsWith("api_get_member/deck"))\r
             {\r
-                _missionInfo.InspectMission(json);\r
-                return UpdateInfo.Mission;\r
+                _missionInfo.InspectDeck(data);\r
+                _akashiTimer.SetTimer();\r
+                return Update.Mission | Update.Timer;\r
             }\r
-            if (uri.Contains("api_get_member/deck"))\r
+            if (url.EndsWith("api_get_member/ship2"))\r
             {\r
-                _missionInfo.InspectDeck(json);\r
-                _shipInfo.InspectDeck(json);\r
-                return UpdateInfo.Mission | UpdateInfo.Ship | UpdateInfo.Charge;\r
+                // ここだけjsonなので注意\r
+                _shipInfo.InspectShip(json);\r
+                _akashiTimer.SetTimer();\r
+                return Update.Ship;\r
             }\r
-            if (uri.EndsWith("api_get_member/ship2") || uri.EndsWith("api_get_member/ship3"))\r
+            if (url.EndsWith("api_get_member/ship3"))\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.Charge;\r
+                _shipInfo.InspectShip(data);\r
+                _akashiTimer.SetTimer();\r
+                return Update.Ship;\r
             }\r
-            return UpdateInfo.None;\r
-        }\r
-\r
-        public void SaveMaster()\r
-        {\r
-            _missionInfo.SaveNames();\r
-            _shipMaster.Save();\r
-        }\r
-\r
-        public void LoadMaster()\r
-        {\r
-            _missionInfo.LoadNames();\r
-            _shipMaster.Load();\r
-        }\r
-\r
-        private void InspectNDock(dynamic json)\r
-        {\r
-            foreach (var entry in json)\r
+            if (url.EndsWith("api_req_hokyu/charge"))\r
+            {\r
+                _shipInfo.InspectCharge(data);\r
+                return 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);\r
+                _akashiTimer.SetTimer();\r
+                return Update.Item | Update.Ship;\r
+            }\r
+            if (url.EndsWith("api_req_kousyou/destroyitem2"))\r
             {\r
-                var id = (int)entry.api_id;\r
-                _ndocInfo[id - 1].Timer.EndTime = (double)entry.api_complete_time;\r
-                var ship = (int)entry.api_ship_id;\r
-                _ndocInfo[id - 1].Name = ship == 0 ? "" : _shipInfo.GetNameById(ship);\r
+                _itemInfo.InspectDestroyItem(request);\r
+                return Update.Item;\r
             }\r
+            if (url.EndsWith("api_req_kaisou/powerup"))\r
+            {\r
+                _shipInfo.InspectPowerup(request, data);\r
+                return Update.Item | Update.Ship;\r
+            }\r
+            if (url.EndsWith("api_req_nyukyo/start"))\r
+            {\r
+                _shipInfo.InspectNyukyo(request);\r
+                return Update.Item | Update.Ship;\r
+            }\r
+            return Update.None;\r
         }\r
 \r
         public NameAndTimer[] NDock\r
         {\r
-            get { return _ndocInfo; }\r
-        }\r
-\r
-        private void InspectKDock(dynamic json)\r
-        {\r
-            foreach (var entry in json)\r
-                _kdocTimers[(int)entry.api_id - 1].EndTime = (double)entry.api_complete_time;\r
+            get { return _dockInfo.NDock; }\r
         }\r
 \r
         public RingTimer[] KDock\r
         {\r
-            get { return _kdocTimers; }\r
+            get { return _dockInfo.KDock; }\r
         }\r
 \r
         public ItemInfo Item\r
@@ -167,31 +207,45 @@ namespace KancolleSniffer
             get { return _missionInfo.Missions; }\r
         }\r
 \r
-        public string FleetName\r
+        public string[] GetConditionTimers(int fleet)\r
         {\r
-            get { return _shipInfo.FleetName; }\r
+            return _shipInfo.GetConditionTimers(fleet);\r
         }\r
 \r
-        public DateTime[] RecoveryTimes\r
+        public ShipStatus[] GetShipStatuses(int fleet)\r
         {\r
-            get { return _shipInfo.RecoveryTimes; }\r
+            return _shipInfo.GetShipStatuses(fleet);\r
         }\r
 \r
-        public ShipStatus[] ShipStatuses\r
+        public ChargeStatus[] ChargeStatuses\r
         {\r
-            get { return _shipInfo.ShipStatuses; }\r
+            get { return _shipInfo.ChargeStatuses; }\r
         }\r
 \r
-        public ChargeStatus[] ChargeStatuses\r
+        public int GetAirSuperiority(int fleet)\r
         {\r
-            get { return _shipInfo.ChargeStatuses; }\r
+            return _shipInfo.GetAirSuperiority(fleet);\r
+        }\r
+\r
+        public DateTime GetAkashiStartTime(int fleet)\r
+        {\r
+            return _akashiTimer[fleet];\r
+        }\r
+\r
+        public double Achievement\r
+        {\r
+            get { return _achievement.Value; }\r
+        }\r
+\r
+        public void ResetAchievement()\r
+        {\r
+            _achievement.Reset();\r
         }\r
     }\r
 \r
     public class NameAndTimer\r
     {\r
         public string Name { get; set; }\r
-\r
         public RingTimer Timer { get; set; }\r
 \r
         public NameAndTimer()\r
@@ -202,7 +256,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
@@ -212,19 +265,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
@@ -237,19 +289,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