OSDN Git Service

基地空襲戦のAPIを処理する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 19 Jul 2019 12:47:00 +0000 (21:47 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 20 Jul 2019 10:59:20 +0000 (19:59 +0900)
KancolleSniffer.Test/BattleBriefTest.cs
KancolleSniffer.Test/BattleTest.cs
KancolleSniffer.Test/QuestCounterTest.cs
KancolleSniffer.Test/logs
KancolleSniffer/Model/AirBase.cs
KancolleSniffer/Model/BattleInfo.cs
KancolleSniffer/Sniffer.cs

index 35ecef7..1b0b3b6 100644 (file)
@@ -81,7 +81,7 @@ namespace KancolleSniffer.Test
             _shipInventory = new ShipInventory();\r
             _shipMaster = new ShipMaster();\r
             _shipInfo = new ShipInfo(_shipMaster, _shipInventory, _itemInventory);\r
-            _battleInfo = new BattleInfo(_shipInfo, _itemInfo);\r
+            _battleInfo = new BattleInfo(_shipInfo, _itemInfo, new AirBase(_itemInfo));\r
         }\r
 \r
         /// <summary>\r
index a6b5f61..a59ffb1 100644 (file)
@@ -340,5 +340,45 @@ namespace KancolleSniffer.Test
             SniffLogFile(sniffer, "damecon_advance_001");\r
             PAssert.That(() => sniffer.BadlyDamagedShips.Length == 0);\r
         }\r
+\r
+        /// <summary>\r
+        /// 迎撃機ありの基地空襲戦\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void AirRaidBattleWithInterceptor()\r
+        {\r
+            var sniffer = new Sniffer();\r
+            SniffLogFile(sniffer, "airraid_battle_001");\r
+            var battle = sniffer.Battle;\r
+            Assert.AreEqual(BattleState.Day, battle.BattleState);\r
+            Assert.AreEqual(2, battle.AirControlLevel);\r
+            Assert.AreEqual(425, battle.FighterPower.Min);\r
+            Assert.AreEqual(231, battle.EnemyFighterPower.AirCombat);\r
+            Assert.AreEqual(BattleResultRank.P, battle.ResultRank);\r
+            var ships = battle.Result.Friend.Main;\r
+            Assert.IsTrue(new[] {200, 200, 200}.SequenceEqual(ships.Select(ship => ship.NowHp)));\r
+            Assert.IsTrue(new[] {"基地航空隊1", "基地航空隊2", "基地航空隊3"}.SequenceEqual(ships.Select(ship => ship.Name)));\r
+            Assert.IsTrue(\r
+                new[] {"烈風改(三五二空/熟練)", "雷電", "雷電", "烈風改"}.SequenceEqual(ships[2].Slot.Select(item => item.Spec.Name)));\r
+            Assert.IsTrue(new[]{18, 18, 18, 18}.SequenceEqual(ships[2].OnSlot));\r
+        }\r
+\r
+        /// <summary>\r
+        /// 迎撃機なしの基地航空戦\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void AirRaidBattleWithoutInterceptor()\r
+        {\r
+            var sniffer = new Sniffer();\r
+            SniffLogFile(sniffer, "airraid_battle_002");\r
+            var battle = sniffer.Battle;\r
+            Assert.AreEqual(BattleState.Day, battle.BattleState);\r
+            Assert.AreEqual(4, battle.AirControlLevel);\r
+            Assert.AreEqual(0, battle.FighterPower.Min);\r
+            Assert.AreEqual(231, battle.EnemyFighterPower.AirCombat);\r
+            Assert.AreEqual(BattleResultRank.C, battle.ResultRank);\r
+            var ships = battle.Result.Friend.Main;\r
+            Assert.IsTrue(new[] {82, 174, 147}.SequenceEqual(ships.Select(ship => ship.NowHp)));\r
+        }\r
     }\r
 }
\ No newline at end of file
index 6058f8e..688c2f0 100644 (file)
@@ -211,7 +211,7 @@ namespace KancolleSniffer.Test
         [TestInitialize]\r
         public void Initialize()\r
         {\r
-            _battleInfo = new BattleInfo(null, null);\r
+            _battleInfo = new BattleInfo(null, null, null);\r
             _itemInfo = new ItemInfo(new ItemMaster(), new ItemInventory());\r
             _questInfo = new QuestInfo(() => new DateTime(2015, 1, 1)) {AcceptMax = 10};\r
             _questCounter = new QuestCounter(_questInfo, _itemInfo, _battleInfo);\r
index a7eff40..cab4a46 160000 (submodule)
@@ -1 +1 @@
-Subproject commit a7eff40685cdda124f94216a5a1185bddd663a31
+Subproject commit cab4a4669f6feaf536cbf84dd8e74ba640165c06
index 0b1fc51..708352a 100644 (file)
@@ -32,11 +32,22 @@ namespace KancolleSniffer.Model
 \r
         public BaseInfo[] AllBase { get; set; }\r
 \r
+        public BaseInfo GetAirBase(int areaId)\r
+        {\r
+            return AllBase.FirstOrDefault(b => b.AreaId == areaId);\r
+        }\r
+\r
         public class BaseInfo\r
         {\r
             public int AreaId { get; set; }\r
             public string AreaName => AreaId == 6 ? "中部海域" : "限定海域";\r
             public AirCorpsInfo[] AirCorps { get; set; }\r
+\r
+            public Range CalcInterceptionFighterPower()\r
+            {\r
+                return AirCorps.Where(airCorps => airCorps.Action == 2).Aggregate(new Range(0, 0),\r
+                    (all, cur) => all + cur.CalcFighterPower().Interception);\r
+            }\r
         }\r
 \r
         public class Distance\r
index 60fe113..9f0fbf9 100644 (file)
@@ -54,6 +54,7 @@ namespace KancolleSniffer.Model
     {\r
         private readonly ShipInfo _shipInfo;\r
         private readonly ItemInfo _itemInfo;\r
+        private readonly AirBase _airBase;\r
         private Fleet _fleet;\r
         private Record[] _friend;\r
         private Record[] _guard;\r
@@ -93,10 +94,11 @@ namespace KancolleSniffer.Model
             public Combined Enemy { get; set; }\r
         }\r
 \r
-        public BattleInfo(ShipInfo shipInfo, ItemInfo itemInfo)\r
+        public BattleInfo(ShipInfo shipInfo, ItemInfo itemInfo, AirBase airBase)\r
         {\r
             _shipInfo = shipInfo;\r
             _itemInfo = itemInfo;\r
+            _airBase = airBase;\r
         }\r
 \r
         public void Port()\r
@@ -122,6 +124,7 @@ namespace KancolleSniffer.Model
             SetResult();\r
         }\r
 \r
+\r
         private void SetFormation(dynamic json)\r
         {\r
             if (json.api_formation())\r
@@ -276,6 +279,89 @@ namespace KancolleSniffer.Model
             }\r
         }\r
 \r
+        public void InspectMapStart(dynamic json)\r
+        {\r
+            InspectMapNext(json);\r
+        }\r
+\r
+        public void InspectMapNext(dynamic json)\r
+        {\r
+            _lastCell = (int)json.api_next == 0;\r
+\r
+            if (!json.api_destruction_battle())\r
+                return;\r
+            InspectAirRaidBattle((int)json.api_maparea_id, json.api_destruction_battle);\r
+        }\r
+\r
+        public void InspectAirRaidBattle(int areaId, dynamic json)\r
+        {\r
+            SetFormation(json);\r
+            var attack = json.api_air_base_attack;\r
+            var stage1 = attack.api_stage1;\r
+            AirControlLevel = (int)stage1.api_disp_seiku;\r
+            var ships = (ShipStatus[])CreateShipsForAirBase(json);\r
+            _friend = Record.Setup(ships, false);\r
+            _guard = new Record[0];\r
+            FighterPower = _airBase.GetAirBase(areaId).CalcInterceptionFighterPower();\r
+            SetupEnemyDamageRecord(json, false);\r
+            SetEnemyFighterPower();\r
+            BattleState = BattleState.Day;\r
+            AddAirBattleResult(json.api_air_base_attack, "空襲");\r
+            CalcKoukuDamage(json.api_air_base_attack);\r
+            SetAirRaidResultRank(json);\r
+            SetResult();\r
+            CleanupResult();\r
+        }\r
+\r
+        private ShipStatus[] CreateShipsForAirBase(dynamic json)\r
+        {\r
+            var nowHps = (int[])json.api_f_nowhps;\r
+            var maxHps = (int[])json.api_f_maxhps;\r
+            var maxEq = new[] {18, 18, 18, 18};\r
+            var ships = nowHps.Select((hp, n) => new ShipStatus\r
+            {\r
+                Spec = new ShipSpec {Name = "基地航空隊" + (n + 1), GetMaxEq = () => maxEq},\r
+                NowHp = nowHps[n],\r
+                MaxHp = maxHps[n]\r
+            }).ToArray();\r
+            var planes = json.api_air_base_attack.api_map_squadron_plane;\r
+            if (planes == null)\r
+                return ships;\r
+            foreach (KeyValuePair<string, dynamic> entry in planes)\r
+            {\r
+                var num = int.Parse(entry.Key) - 1;\r
+                var slot = new List<ItemStatus>();\r
+                var onSlot = new List<int>();\r
+                foreach (var plane in entry.Value)\r
+                {\r
+                    slot.Add(new ItemStatus {Id = 1, Spec = _itemInfo.GetSpecByItemId((int)plane.api_mst_id)});\r
+                    onSlot.Add((int)plane.api_count);\r
+                }\r
+                ships[num].Slot = slot;\r
+                ships[num].OnSlot = onSlot.ToArray();\r
+            }\r
+            return ships;\r
+        }\r
+\r
+        private void SetAirRaidResultRank(dynamic json)\r
+        {\r
+            switch ((int)json.api_lost_kind)\r
+            {\r
+                case 1:\r
+                    ResultRank = BattleResultRank.A;\r
+                    break;\r
+                case 2:\r
+                    ResultRank = BattleResultRank.C;\r
+                    break;\r
+                case 3:\r
+                    ResultRank = BattleResultRank.D;\r
+                    break;\r
+                case 4:\r
+                    ResultRank = BattleResultRank.P;\r
+                    break;\r
+            }\r
+        }\r
+\r
         private void CalcDamage(dynamic json)\r
         {\r
             AirBattleResults.Clear();\r
@@ -529,16 +615,6 @@ namespace KancolleSniffer.Model
             }\r
         }\r
 \r
-        public void InspectMapStart(dynamic json)\r
-        {\r
-            InspectMapNext(json);\r
-        }\r
-\r
-        public void InspectMapNext(dynamic json)\r
-        {\r
-            _lastCell = (int)json.api_next == 0;\r
-        }\r
-\r
         public void InspectBattleResult(dynamic json)\r
         {\r
             BattleState = BattleState.Result;\r
index 1d42b58..6d0e30f 100644 (file)
@@ -94,10 +94,10 @@ namespace KancolleSniffer
             _conditionTimer = new ConditionTimer(_shipInfo);\r
             _dockInfo = new DockInfo(_shipInventory, _materialInfo);\r
             _akashiTimer = new AkashiTimer(_shipInfo, _dockInfo, _presetDeck);\r
-            _battleInfo = new BattleInfo(_shipInfo, _itemInfo);\r
+            _airBase = new AirBase(_itemInfo);\r
+            _battleInfo = new BattleInfo(_shipInfo, _itemInfo, _airBase);\r
             _logger = new Logger(_shipInfo, _itemInfo, _battleInfo);\r
             _questCounter = new QuestCounter(_questInfo, _itemInfo, _battleInfo);\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