OSDN Git Service

BaseAirCorpsをAirBaseにリネームする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Sniffer.cs
index 3f0b306..b5c8369 100644 (file)
 // 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;\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
@@ -34,12 +41,13 @@ namespace KancolleSniffer
         private readonly Logger _logger;\r
         private readonly ExMapInfo _exMapInfo = new ExMapInfo();\r
         private readonly MiscTextInfo _miscTextInfo;\r
-        private readonly BaseAirCoprs _baseAirCoprs;\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
@@ -51,6 +59,15 @@ namespace KancolleSniffer
 \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
@@ -71,16 +88,29 @@ namespace KancolleSniffer
         public Sniffer(bool start = false)\r
         {\r
             _start = start;\r
-            _shipInfo = new ShipInfo(_itemInfo);\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
+            _dockInfo = new DockInfo(_shipInventory, _materialInfo);\r
             _akashiTimer = new AkashiTimer(_shipInfo, _dockInfo, _presetDeck);\r
             _battleInfo = new BattleInfo(_shipInfo, _itemInfo);\r
             _logger = new Logger(_shipInfo, _itemInfo, _battleInfo);\r
             _questInfo = new QuestInfo(_itemInfo, _battleInfo);\r
-            _baseAirCoprs = new BaseAirCoprs(_itemInfo);\r
+            _airBase = new AirBase(_itemInfo);\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
+            set\r
+            {\r
+                _additionalData = value;\r
+                _itemMaster.AdditionalData = value;\r
+                _shipMaster.AdditionalData = value;\r
+            }\r
         }\r
 \r
         public void SaveState()\r
@@ -110,7 +140,7 @@ namespace KancolleSniffer
                 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
@@ -118,7 +148,7 @@ namespace KancolleSniffer
                 return Update.None;\r
 \r
             if (url.EndsWith("api_port/port"))\r
-                return ApiPort(data);\r
+                return ApiPort(url, data);\r
             if (url.Contains("member"))\r
                 return ApiMember(url, json);\r
             if (url.Contains("kousyou"))\r
@@ -127,6 +157,8 @@ namespace KancolleSniffer
                 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
             return ApiOthers(url, request, data);\r
@@ -135,23 +167,31 @@ namespace KancolleSniffer
         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
             _miscTextInfo.InspectMaster(data);\r
+            SetMapDictionary(data.api_mst_mapinfo);\r
             _start = true;\r
             return Update.Start;\r
         }\r
 \r
-        private Update ApiPort(dynamic data)\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
+        private Update ApiPort(string url, dynamic data)\r
         {\r
             _itemInfo.InspectBasic(data.api_basic);\r
             _materialInfo.InspectMaterialPort(data.api_material);\r
             _logger.InspectBasic(data.api_basic);\r
             _logger.InspectMaterial(data.api_material);\r
-            _shipInfo.InspectShip(data);\r
+            _shipInfo.InspectShip(url, data);\r
             _shipInfo.ClearBadlyDamagedShips();\r
-            _conditionTimer.CalcRegenTime();\r
+            _conditionTimer.CalcRegainTime();\r
             _missionInfo.InspectDeck(data.api_deck_port);\r
             _questInfo.InspectDeck(data.api_deck_port);\r
             _dockInfo.InspectNDock(data.api_ndock);\r
@@ -160,12 +200,11 @@ namespace KancolleSniffer
             if (data.api_parallel_quest_count()) // 昔のログにはないので\r
                 _questInfo.AcceptMax = (int)data.api_parallel_quest_count;\r
             if (data.api_event_object())\r
-                _baseAirCoprs.InspectEventObject(data.api_event_object);\r
+                _airBase.InspectEventObject(data.api_event_object);\r
             if (data.api_plane_info())\r
-                _baseAirCoprs.InspectPlaneInfo(data.api_plane_info);\r
+                _airBase.InspectPlaneInfo(data.api_plane_info);\r
             _battleInfo.CleanupResult();\r
             _battleInfo.BattleState = BattleState.None;\r
-            _shipInfo.ClearEscapedShips();\r
             _miscTextInfo.Port();\r
             _cellInfo.Port();\r
             SaveState();\r
@@ -226,21 +265,21 @@ namespace KancolleSniffer
             if (url.EndsWith("api_get_member/ship2"))\r
             {\r
                 // ここだけjsonなので注意\r
-                _shipInfo.InspectShip(json);\r
+                _shipInfo.InspectShip(url, json);\r
                 _akashiTimer.CheckFleet();\r
                 _battleInfo.BattleState = BattleState.None;\r
                 return Update.Item | Update.Ship | Update.Battle;\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.BattleState = BattleState.None;\r
-                return Update.Ship | Update.Battle;\r
+                return Update.Ship | Update.Battle | 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
@@ -255,7 +294,7 @@ namespace KancolleSniffer
                 _exMapInfo.InspectMapInfo(data);\r
                 _miscTextInfo.InspectMapInfo(data);\r
                 if (data.api_air_base())\r
-                    _baseAirCoprs.Inspect(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
@@ -270,7 +309,7 @@ namespace KancolleSniffer
             }\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
@@ -289,7 +328,7 @@ namespace KancolleSniffer
             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
@@ -338,6 +377,8 @@ namespace KancolleSniffer
         {\r
             if (IsNormalBattleAPI(url) || IsCombinedBattleAPI(url))\r
             {\r
+                _shipInfo.ClearBadlyDamagedShips();\r
+                RepeatingTimerController?.Stop("大破警告");\r
                 _battleInfo.InspectBattle(url, request, data);\r
                 _logger.InspectBattle(data);\r
                 _cellInfo.StartBattle();\r
@@ -385,6 +426,7 @@ namespace KancolleSniffer
             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_sortie/ld_shooting") ||\r
                    url.EndsWith("api_req_battle_midnight/battle") ||\r
                    url.EndsWith("api_req_battle_midnight/sp_midnight");\r
         }\r
@@ -436,28 +478,56 @@ namespace KancolleSniffer
             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
+                _conditionTimer.CheckCond();\r
+                _akashiTimer.CheckFleet();\r
+                _questInfo.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
+                return Update.Ship;\r
+            }\r
+            if (url.EndsWith("api_req_kaisou/slot_deprive"))\r
+            {\r
+                _shipInfo.InspectSlotDeprive(data);\r
+                return Update.Ship;\r
+            }\r
+            if (url.EndsWith("api_req_kaisou/marriage"))\r
+            {\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
-                _baseAirCoprs.InspectSupply(request, 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
-                _baseAirCoprs.InspectSetPlane(request, data);\r
+                _airBase.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
+                _airBase.InspectSetAction(request);\r
                 return Update.Ship;\r
             }\r
             if (url.EndsWith("api_req_air_corps/expand_base"))\r
             {\r
-                _baseAirCoprs.InspectExpandBase(request, data);\r
+                _airBase.InspectExpandBase(request, data);\r
                 return Update.Ship;\r
             }\r
             return Update.None;\r
@@ -472,24 +542,6 @@ namespace KancolleSniffer
                 _questInfo.CountCharge();\r
                 return Update.Item | Update.Ship | Update.QuestList;\r
             }\r
-            if (url.EndsWith("api_req_kaisou/powerup"))\r
-            {\r
-                _shipInfo.InspectPowerup(request, data);\r
-                _conditionTimer.CheckCond();\r
-                _akashiTimer.CheckFleet();\r
-                _questInfo.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
-                return Update.Ship;\r
-            }\r
-            if (url.EndsWith("api_req_kaisou/slot_deprive"))\r
-            {\r
-                _shipInfo.InspectSlotDeprive(data);\r
-                return Update.Ship;\r
-            }\r
             if (url.EndsWith("api_req_nyukyo/start"))\r
             {\r
                 _dockInfo.InspectNyukyo(request);\r
@@ -562,12 +614,17 @@ namespace KancolleSniffer
 \r
         public AlarmTimer[] KDock => _dockInfo.KDock;\r
 \r
+        public AlarmCounter ItemCounter => _itemInfo.Counter;\r
+\r
         public ItemInfo Item => _itemInfo;\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 void ClearQuests() => _questInfo.ClearQuests();\r
 \r
         public NameAndTimer[] Missions => _missionInfo.Missions;\r
@@ -576,11 +633,13 @@ namespace KancolleSniffer
 \r
         public int[] GetConditionNotice(DateTime prev, DateTime now) => _conditionTimer.GetNotice(prev, now);\r
 \r
-        public Fleet[] Fleets => _shipInfo.Fleets;\r
+        public AlarmCounter ShipCounter => _shipInfo.Counter;\r
+\r
+        public IReadOnlyList<Fleet> Fleets => _shipInfo.Fleets;\r
 \r
         public ShipInfo.ShipStatusPair[] BattleResultStatusDiff => _shipInfo.BattleResultDiff;\r
 \r
-        public bool IsBattleResultStatusError => _shipInfo.IsBattleResultError;\r
+        public bool IsBattleResultError => _shipInfo.IsBattleResultError || _battleInfo.DisplayedResultRank.IsError;\r
 \r
         public ShipStatus[] BattleStartStatus => _shipInfo.BattleStartStatus;\r
 \r
@@ -598,7 +657,7 @@ namespace KancolleSniffer
             {\r
                 _itemInfo.ClearHolder();\r
                 _shipInfo.SetItemHolder();\r
-                _baseAirCoprs.SetItemHolder();\r
+                _airBase.SetItemHolder();\r
                 return _itemInfo.ItemList;\r
             }\r
         }\r
@@ -613,7 +672,7 @@ namespace KancolleSniffer
 \r
         public string MiscText => _miscTextInfo.Text;\r
 \r
-        public BaseAirCoprs.BaseInfo[] BaseAirCorps => _baseAirCoprs.AllAirCorps;\r
+        public AirBase.BaseInfo[] AirBase => _airBase.AllAirCorps;\r
 \r
         public CellInfo CellInfo => _cellInfo;\r
 \r