_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
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
[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
-Subproject commit a7eff40685cdda124f94216a5a1185bddd663a31
+Subproject commit cab4a4669f6feaf536cbf84dd8e74ba640165c06
\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
{\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
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
SetResult();\r
}\r
\r
+\r
private void SetFormation(dynamic json)\r
{\r
if (json.api_formation())\r
}\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
}\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
_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