OSDN Git Service

艦隊を表すクラスに艦隊の状態と編成を集約する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 17 Jun 2018 11:28:15 +0000 (20:28 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Mon, 18 Jun 2018 14:15:58 +0000 (23:15 +0900)
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer/AkashiTimer.cs
KancolleSniffer/BattleInfo.cs
KancolleSniffer/ConditionTimer.cs
KancolleSniffer/Logger.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/ShipInfo.cs
KancolleSniffer/Sniffer.cs

index 2082f11..010259d 100644 (file)
@@ -432,7 +432,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "deck_001");\r
-            var result = sniffer.GetDeck(0);\r
+            var result = sniffer.Fleets[0].Deck;\r
             PAssert.That(() => new[] {756, 17204, 6156, 28806, 1069, -1}.SequenceEqual(result));\r
         }\r
 \r
@@ -444,7 +444,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "deck_005");\r
-            var result = sniffer.GetDeck(0);\r
+            var result = sniffer.Fleets[0].Deck;\r
             PAssert.That(() => new[] {57391, 50, 24475, 113, -1, -1}.SequenceEqual(result));\r
         }\r
 \r
@@ -457,18 +457,18 @@ namespace KancolleSniffer.Test
             var sniffer = new Sniffer();\r
 \r
             SniffLogFile(sniffer, "deck_002");\r
-            var result0 = sniffer.GetDeck(0);\r
+            var result0 = sniffer.Fleets[0].Deck;\r
             PAssert.That(() => new[] {1069, 6156, 756, 3223, -1, -1}.SequenceEqual(result0), "編成で艦隊内で艦娘と交換する");\r
 \r
             SniffLogFile(sniffer, "deck_003");\r
-            var result10 = sniffer.GetDeck(0);\r
-            var result11 = sniffer.GetDeck(1);\r
+            var result10 = sniffer.Fleets[0].Deck;\r
+            var result11 = sniffer.Fleets[1].Deck;\r
             PAssert.That(() => new[] {1069, 6156, 14258, 3223, -1, -1}.SequenceEqual(result10) &&\r
                                new[] {101, 4487, 756, 14613, 28806, -1}.SequenceEqual(result11), "002に続いて艦隊をまたがって交換する");\r
 \r
             SniffLogFile(sniffer, "deck_004");\r
-            var result20 = sniffer.GetDeck(0);\r
-            var result21 = sniffer.GetDeck(1);\r
+            var result20 = sniffer.Fleets[0].Deck;\r
+            var result21 = sniffer.Fleets[1].Deck;\r
             PAssert.That(() => new[] {1069, 6156, 14258, 3223, 756, -1}.SequenceEqual(result20) &&\r
                                new[] {101, 4487, 14613, 28806, -1, -1}.SequenceEqual(result21),\r
                 "003に続いて空き番号にほかの艦隊の艦娘を配置する");\r
@@ -482,7 +482,7 @@ namespace KancolleSniffer.Test
         {\r
             var sniffer = new Sniffer();\r
             SniffLogFile(sniffer, "preset_001");\r
-            var result = sniffer.GetDeck(0);\r
+            var result = sniffer.Fleets[0].Deck;\r
             PAssert.That(() => new[] {50510, 632, 39843, 113, 478, 47422}.SequenceEqual(result));\r
         }\r
 \r
index 9e81ecf..ecbe951 100644 (file)
@@ -182,7 +182,7 @@ namespace KancolleSniffer
 \r
         private void CheckFleet(int fleet)\r
         {\r
-            var deck = _shipInfo.GetDeck(fleet).ToArray();\r
+            var deck = _shipInfo.Fleets[fleet].Deck.ToArray();\r
             var repair = _repairStatuses[fleet];\r
             var fs = _shipInfo.GetStatus(deck[0]);\r
             repair.State = State.Continue;\r
index 449a550..3a32909 100644 (file)
@@ -526,13 +526,13 @@ namespace KancolleSniffer
             var damaged = (int)json.api_escape.api_escape_idx[0] - 1;\r
             if (json.api_escape.api_tow_idx())\r
             {\r
-                _escapingShips.Add(_shipInfo.GetDeck(damaged / 6)[damaged % 6]);\r
+                _escapingShips.Add(_shipInfo.Fleets[damaged / 6].Deck[damaged % 6]);\r
                 var escort = (int)json.api_escape.api_tow_idx[0] - 1;\r
-                _escapingShips.Add(_shipInfo.GetDeck(escort / 6)[escort % 6]);\r
+                _escapingShips.Add(_shipInfo.Fleets[escort / 6].Deck[escort % 6]);\r
             }\r
             else\r
             {\r
-                _escapingShips.Add(_shipInfo.GetDeck(2)[damaged]);\r
+                _escapingShips.Add(_shipInfo.Fleets[2].Deck[damaged]);\r
             }\r
         }\r
 \r
index 2a76d2d..0a94589 100644 (file)
@@ -80,7 +80,7 @@ namespace KancolleSniffer
 \r
         public DateTime GetTimer(int fleet)\r
         {\r
-            if (_shipInfo.InMission[fleet] || _shipInfo.InSortie[fleet])\r
+            if (_shipInfo.Fleets[fleet].State != FleetState.Port)\r
                 return DateTime.MinValue;\r
             var cond = _shipInfo.GetShipStatuses(fleet).Select(s => s.Cond).DefaultIfEmpty(49).Min();\r
             if (cond >= 49)\r
@@ -96,7 +96,7 @@ namespace KancolleSniffer
                 return result;\r
             for (var f = 0; f < result.Length; f++)\r
             {\r
-                if (_shipInfo.InMission[f] || _shipInfo.InSortie[f])\r
+                if (_shipInfo.Fleets[f].State != FleetState.Port)\r
                     continue;\r
                 var timer = GetTimer(f);\r
                 if (timer == DateTime.MinValue || prev < _lastUpdate)\r
index 9b38098..8998b22 100644 (file)
@@ -243,8 +243,8 @@ namespace KancolleSniffer
             int deckId = BattleInfo.DeckId(_battle);\r
             if (_battle.api_f_nowhps_combined())\r
             {\r
-                var main = _shipInfo.GetDeck(0);\r
-                var guard = _shipInfo.GetDeck(1);\r
+                var main = _shipInfo.Fleets[0].Deck;\r
+                var guard = _shipInfo.Fleets[1].Deck;\r
                 return main.Zip(guard, (m, g) =>\r
                 {\r
                     if (m == -1 && g == -1)\r
@@ -268,7 +268,7 @@ namespace KancolleSniffer
                     return name + "," + hp;\r
                 }).ToList();\r
             }\r
-            var deck = _shipInfo.GetDeck(deckId);\r
+            var deck = _shipInfo.Fleets[deckId].Deck;\r
             if (deck.Length > 6)\r
             {\r
                 var result = new List<string>();\r
index 33cef4d..8190aa9 100644 (file)
@@ -614,14 +614,15 @@ namespace KancolleSniffer
 \r
         private void SetCurrentFleet()\r
         {\r
-            var inSortie = _sniffer.InSortie;\r
-            if (_inSortie || !inSortie.Any(x => x))\r
+            var states = _sniffer.Fleets.Select(fleet => fleet.State).ToArray();\r
+            var inSortie = states.Any(state => state >= FleetState.Sortie);\r
+            if (_inSortie || !inSortie)\r
             {\r
-                _inSortie = inSortie.Any(x => x);\r
+                _inSortie = inSortie;\r
                 return;\r
             }\r
             _inSortie = true;\r
-            if (inSortie[0] && inSortie[1])\r
+            if (states[0] == FleetState.Sortie && states[1] == FleetState.Sortie)\r
             {\r
                 _combinedFleet = true;\r
                 _currentFleet = 0;\r
@@ -629,7 +630,7 @@ namespace KancolleSniffer
             else\r
             {\r
                 _combinedFleet = false;\r
-                _currentFleet = Array.FindIndex(inSortie, x => x);\r
+                _currentFleet = Array.FindIndex(states, state => state >= FleetState.Sortie);\r
             }\r
         }\r
 \r
index ff929f2..83b3626 100644 (file)
@@ -51,17 +51,29 @@ namespace KancolleSniffer
         }\r
     }\r
 \r
+    public enum FleetState\r
+    {\r
+        Port,\r
+        Mission,\r
+        Sortie,\r
+        Practice\r
+    }\r
+\r
+    public class Fleet\r
+    {\r
+        public FleetState State { get; set; }\r
+        public int[] Deck { get; set; } = Enumerable.Repeat(-1, ShipInfo.MemberCount).ToArray();\r
+    }\r
+\r
     public class ShipInfo\r
     {\r
         public const int FleetCount = 4;\r
         public const int MemberCount = 6;\r
 \r
-        private readonly int[][] _decks;\r
+        private readonly Fleet[] _fleets = Enumerable.Range(0, FleetCount).Select(x => new Fleet()).ToArray();\r
         private readonly Dictionary<int, ShipStatus> _shipInfo = new Dictionary<int, ShipStatus>();\r
         private readonly ShipMaster _shipMaster = new ShipMaster();\r
         private readonly ItemInfo _itemInfo;\r
-        private readonly bool[] _inMission = new bool[FleetCount];\r
-        private readonly bool[] _inSortie = new bool[FleetCount];\r
         private int _hqLevel;\r
         private readonly List<int> _escapedShips = new List<int>();\r
         private int _combinedFleetType;\r
@@ -85,7 +97,6 @@ namespace KancolleSniffer
         public ShipInfo(ItemInfo itemInfo)\r
         {\r
             _itemInfo = itemInfo;\r
-            _decks = Enumerable.Repeat(Enumerable.Repeat(-1, MemberCount).ToArray(), FleetCount).ToArray();\r
             ClearShipInfo();\r
         }\r
 \r
@@ -100,7 +111,7 @@ namespace KancolleSniffer
             {\r
                 ClearShipInfo();\r
                 for (var i = 0; i < FleetCount; i++)\r
-                    _inSortie[i] = false;\r
+                    _fleets[i].State = FleetState.Port;\r
                 InspectDeck(json.api_deck_port);\r
                 InspectShipData(json.api_ship);\r
                 InspectBasic(json.api_basic);\r
@@ -130,9 +141,9 @@ namespace KancolleSniffer
 \r
         public void SaveBattleResult()\r
         {\r
-            _battleResult = _decks.Where((deck, i) =>\r
-                    _inSortie[i] && !GetStatus(deck[0]).Spec.IsRepairShip)\r
-                .SelectMany(deck => deck.Select(GetStatus)).ToArray();\r
+            _battleResult = _fleets.Where(fleet =>\r
+                    fleet.State >= FleetState.Sortie && !GetStatus(fleet.Deck[0]).Spec.IsRepairShip)\r
+                .SelectMany(fleet => fleet.Deck.Select(GetStatus)).ToArray();\r
         }\r
 \r
         private void VerifyBattleResult()\r
@@ -146,8 +157,8 @@ namespace KancolleSniffer
 \r
         public void SaveBattleStartStatus()\r
         {\r
-            BattleStartStatus = _decks.Where((deck, i) => _inSortie[i])\r
-                .SelectMany(deck => deck.Select(id => (ShipStatus)GetStatus(id).Clone())).ToArray();\r
+            BattleStartStatus = _fleets.Where(fleet => fleet.State >= FleetState.Sortie)\r
+                .SelectMany(fleet => fleet.Deck.Select(id => (ShipStatus)GetStatus(id).Clone())).ToArray();\r
         }\r
 \r
         private void ClearShipInfo()\r
@@ -161,8 +172,9 @@ namespace KancolleSniffer
             foreach (var entry in json)\r
             {\r
                 var fleet = (int)entry.api_id - 1;\r
-                _decks[fleet] = (int[])entry.api_ship;\r
-                _inMission[fleet] = (int)entry.api_mission[0] != 0;\r
+                _fleets[fleet].Deck = (int[])entry.api_ship;\r
+                if ((int)entry.api_mission[0] != 0)\r
+                    _fleets[fleet].State = FleetState.Mission;\r
             }\r
         }\r
 \r
@@ -221,7 +233,7 @@ namespace KancolleSniffer
             var ship = int.Parse(values["api_ship_id"]);\r
             if (idx == -1)\r
             {\r
-                var deck = _decks[fleet];\r
+                var deck = _fleets[fleet].Deck;\r
                 for (var i = 1; i < deck.Length; i++)\r
                     deck[i] = -1;\r
                 return;\r
@@ -232,20 +244,20 @@ namespace KancolleSniffer
                 return;\r
             }\r
             var of = FindFleet(ship, out var oi);\r
-            var orig = _decks[fleet][idx];\r
-            _decks[fleet][idx] = ship;\r
+            var orig = _fleets[fleet].Deck[idx];\r
+            _fleets[fleet].Deck[idx] = ship;\r
             if (of == -1)\r
                 return;\r
             // 入れ替えの場合\r
-            if ((_decks[of][oi] = orig) == -1)\r
+            if ((_fleets[of].Deck[oi] = orig) == -1)\r
                 WithdrowShip(of, oi);\r
         }\r
 \r
         private int FindFleet(int ship, out int idx)\r
         {\r
-            for (var f = 0; f < _decks.Length; f++)\r
+            for (var f = 0; f < _fleets.Length; f++)\r
             {\r
-                idx = Array.FindIndex(_decks[f], id => id == ship);\r
+                idx = Array.FindIndex(_fleets[f].Deck, id => id == ship);\r
                 if (idx < 0)\r
                     continue;\r
                 return f;\r
@@ -256,7 +268,7 @@ namespace KancolleSniffer
 \r
         private void WithdrowShip(int fleet, int idx)\r
         {\r
-            var deck = _decks[fleet];\r
+            var deck = _fleets[fleet].Deck;\r
             var j = idx;\r
             for (var i = idx + 1; i < deck.Length; i++)\r
             {\r
@@ -321,15 +333,22 @@ namespace KancolleSniffer
             var fleet = int.Parse(values["api_deck_id"]) - 1;\r
             if (_combinedFleetType == 0 || fleet > 1)\r
             {\r
-                _inSortie[fleet] = true;\r
+                _fleets[fleet].State = FleetState.Sortie;\r
             }\r
             else\r
             {\r
-                _inSortie[0] = _inSortie[1] = true;\r
+                _fleets[0].State = _fleets[1].State = FleetState.Sortie;\r
             }\r
             SetBadlyDamagedShips();\r
         }\r
 \r
+        public void StartPractice(string request)\r
+        {\r
+            var values = HttpUtility.ParseQueryString(request);\r
+            var fleet = int.Parse(values["api_deck_id"]) - 1;\r
+            _fleets[fleet].State = FleetState.Practice;\r
+        }\r
+\r
         public void RepairShip(int id)\r
         {\r
             var s = _shipInfo[id];\r
@@ -339,10 +358,10 @@ namespace KancolleSniffer
 \r
         public ShipStatus[] GetShipStatuses(int fleet)\r
         {\r
-            return _decks[fleet].Where(id => id != -1).Select(GetStatus).ToArray();\r
+            return _fleets[fleet].Deck.Where(id => id != -1).Select(GetStatus).ToArray();\r
         }\r
 \r
-        public int[] GetDeck(int fleet) => _decks[fleet];\r
+        public Fleet[] Fleets => _fleets;\r
 \r
         public ShipStatus GetStatus(int id)\r
         {\r
@@ -369,18 +388,14 @@ namespace KancolleSniffer
 \r
         public ShipSpec GetSpec(int id) => _shipMaster.GetSpec(id);\r
 \r
-        public bool[] InMission => _inMission;\r
-\r
-        public bool[] InSortie => _inSortie;\r
-\r
         public int CombinedFleetType => _combinedFleetType;\r
 \r
         public ShipStatus[] ShipList => _shipInfo.Keys.Where(id => id != -1).Select(GetStatus).ToArray();\r
 \r
         public ChargeStatus[] ChargeStatuses\r
-            => (from deck in _decks\r
-                let flag = new ChargeStatus(_shipInfo[deck[0]])\r
-                let others = (from id in deck.Skip(1)\r
+            => (from fleet in _fleets\r
+                let flag = new ChargeStatus(_shipInfo[fleet.Deck[0]])\r
+                let others = (from id in fleet.Deck.Skip(1)\r
                         select new ChargeStatus(_shipInfo[id]))\r
                     .Aggregate(\r
                         (result, next) =>\r
@@ -485,14 +500,11 @@ namespace KancolleSniffer
         public void SetBadlyDamagedShips()\r
         {\r
             BadlyDamagedShips =\r
-                _inSortie.SelectMany((flag, i) => !flag\r
-                        ? new ShipStatus[0]\r
-                        : _combinedFleetType > 0 && i == 1\r
-                            ? GetShipStatuses(1).Skip(1) // 連合艦隊第二の旗艦を飛ばす\r
-                            : GetShipStatuses(i))\r
-                    .Where(s => !s.Escaped && s.DamageLevel == ShipStatus.Damage.Badly)\r
-                    .Select(s => s.Name)\r
-                    .ToArray();\r
+            (from s in _fleets.Where(fleet => fleet.State == FleetState.Sortie)\r
+                    .SelectMany(fleet => fleet.Deck.Where(id => id != -1).Select(GetStatus))\r
+                where !s.Escaped && s.DamageLevel == ShipStatus.Damage.Badly &&\r
+                      !(s.CombinedFleetType > 0 && s.Fleet == 1 && s.DeckIndex == 0) // 第二艦隊の旗艦を除く\r
+                select s.Name).ToArray();\r
         }\r
 \r
         public void ClearBadlyDamagedShips()\r
@@ -533,7 +545,7 @@ namespace KancolleSniffer
             var id = _shipInfo.Keys.Count + 1;\r
             var ships = nowhps.Zip(maxhps,\r
                 (now, max) => new ShipStatus {Id = id++, NowHp = now, MaxHp = max}).ToArray();\r
-            _decks[deck] = (from ship in ships select ship.Id).ToArray();\r
+            _fleets[deck].Deck = (from ship in ships select ship.Id).ToArray();\r
             foreach (var ship in ships)\r
                 _shipInfo[ship.Id] = ship;\r
             foreach (var entry in ships.Zip(slots, (ship, slot) =>new {ship, slot}))\r
index 54360ef..cc56698 100644 (file)
@@ -339,7 +339,7 @@ namespace KancolleSniffer
             {\r
                 if (url.EndsWith("/battle"))\r
                 {\r
-                    _shipInfo.InspectMapStart(request); // 演習を出撃中とみなす\r
+                    _shipInfo.StartPractice(request);\r
                     _conditionTimer.InvalidateCond();\r
                     RepeatingTimerController?.Suspend();\r
                 }\r
@@ -556,9 +556,7 @@ namespace KancolleSniffer
 \r
         public ShipStatus[] GetShipStatuses(int fleet) => _shipInfo.GetShipStatuses(fleet);\r
 \r
-        public int[] GetDeck(int fleet) => _shipInfo.GetDeck(fleet);\r
-\r
-        public bool[] InSortie => _shipInfo.InSortie;\r
+        public Fleet[] Fleets => _shipInfo.Fleets;\r
 \r
         public ShipInfo.ShipStatusPair[] BattleResultStatusDiff => _shipInfo.BattleResultDiff;\r
 \r