- var fleets = _shipInfo.Fleets;\r
- if (_guard.Length > 0 && _enemyGuard.Length > 0)\r
- return fleets[0].FighterPower.Zip(fleets[1].FighterPower, (a, b) => a + b).ToArray();\r
- return _fleet.FighterPower;\r
- }\r
-\r
- private EnemyFighterPower CalcEnemyFighterPower(dynamic json)\r
- {\r
- var result = new EnemyFighterPower();\r
- var ships = (int[])json.api_ship_ke;\r
- if (json.api_ship_ke_combined() && _guard.Length > 0)\r
- ships = ships.Concat((int[])json.api_ship_ke_combined).ToArray();\r
- var maxEq = ships.SelectMany(id =>\r
- {\r
- var r = _shipInfo.GetSpec(id).MaxEq;\r
- if (r != null)\r
- return r;\r
- result.HasUnknown = true;\r
- return new int[5];\r
- });\r
- var equips = ((int[][])json.api_eSlot).SelectMany(x => x);\r
- if (json.api_eSlot_combined() && _guard.Length > 0)\r
- equips = equips.Concat(((int[][])json.api_eSlot_combined).SelectMany(x => x));\r
- foreach (var entry in from slot in equips.Zip(maxEq, (id, max) => new {id, max})\r
- let spec = _itemInfo.GetSpecByItemId(slot.id)\r
- let perSlot = (int)Floor(spec.AntiAir * Sqrt(slot.max))\r
- select new {spec, perSlot})\r
- {\r
- if (entry.spec.CanAirCombat)\r
- result.AirCombat += entry.perSlot;\r
- if (entry.spec.IsAircraft)\r
- result.Interception += entry.perSlot;\r
+ EnemyFighterPower = new EnemyFighterPower();\r
+ foreach (var record in _guard.Length == 0 ? _enemy : _enemy.Concat(_enemyGuard))\r
+ {\r
+ var ship = record.SnapShot;\r
+ if (ship.Spec.MaxEq == null)\r
+ {\r
+ EnemyFighterPower.HasUnknown = true;\r
+ continue;\r
+ }\r
+ foreach (var entry in ship.Slot.Zip(ship.Spec.MaxEq, (item, maxEq) => new {item.Spec, maxEq}))\r
+ {\r
+ var perSlot = (int)Floor(entry.Spec.AntiAir * Sqrt(entry.maxEq));\r
+ if (entry.Spec.CanAirCombat)\r
+ EnemyFighterPower.AirCombat += perSlot;\r
+ if (entry.Spec.IsAircraft)\r
+ EnemyFighterPower.Interception += perSlot;\r
+ }\r
+ }\r
+ }\r
+\r
+ public void InspectMapStart(dynamic json)\r
+ {\r
+ InspectMapNext(json);\r
+ }\r
+\r
+ public void InspectMapNext(dynamic json)\r
+ {\r
+ SetSafeCell(json);\r
+ BattleState = BattleState.None;\r
+ if (!json.api_destruction_battle())\r
+ return;\r
+ InspectAirRaidBattle((int)json.api_maparea_id, json.api_destruction_battle);\r
+ }\r
+\r
+ private void SetSafeCell(dynamic json)\r
+ {\r
+ var map = (int)json.api_maparea_id * 1000 + (int)json.api_mapinfo_no * 100 + (int)json.api_no;\r
+ _safeCell =\r
+ (int)json.api_next == 0 || // last cell\r
+ map switch\r
+ {\r
+ 1613 => true, // 1-6-B\r
+ 1611 => true, // 1-6-D\r
+ 1616 => true, // 1-6-D\r
+ 2202 => true, // 2-2-B\r
+ 3102 => true, // 3-1-B\r
+ 3201 => true, // 3-2-A\r
+ 4206 => true, // 4-2-F\r
+ 5302 => true, // 5-3-B\r
+ _ => false\r
+ };\r
+ }\r
+\r
+ private 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.AirRaid;\r
+ AirBattleResult.Clear();\r
+ AirBattleResult.Add(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
+ Id = 1,\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.B;\r
+ break;\r
+ case 3:\r
+ ResultRank = BattleResultRank.C;\r
+ break;\r
+ case 4:\r
+ ResultRank = BattleResultRank.S;\r
+ break;\r