E,\r
}\r
\r
+ public enum BattleState\r
+ {\r
+ None,\r
+ Day,\r
+ Night,\r
+ Result\r
+ }\r
+\r
public class BattleInfo\r
{\r
private readonly ShipInfo _shipInfo;\r
private readonly List<int> _escapingShips = new List<int>();\r
private int _flagshipRecoveryType;\r
\r
- public bool InBattle { get; set; }\r
+ public BattleState BattleState { get; set; }\r
public string Formation { get; private set; }\r
public string EnemyFighterPower { get; private set; }\r
public int AirControlLevel { get; private set; }\r
public BattleResultRank ResultRank { get; private set; }\r
public ShipStatus[] EnemyResultStatus { get; private set; }\r
- public AirBattleResult AirBattleResults { get; private set; }\r
+ public List<AirBattleResult> AirBattleResults { get; } = new List<AirBattleResult>();\r
+\r
\r
public BattleInfo(ShipInfo shipInfo, ItemInfo itemInfo)\r
{\r
\r
public void InspectBattle(dynamic json, string url)\r
{\r
- InBattle = true;\r
Formation = FormationName(json);\r
EnemyFighterPower = CalcEnemyFighterPower(json);\r
AirControlLevel = CheckAirControlLevel(json);\r
SetupResult(json);\r
if (IsNightBattle(json))\r
{\r
+ BattleState = BattleState.Night;\r
CalcHougekiDamage(json.api_hougeki,\r
_guard.Length > 0 ? _guard : _friend,\r
json.api_active_deck() && json.api_active_deck[1] != 1 ? _enemyGuardHp : _enemyHp);\r
}\r
else\r
{\r
+ BattleState = BattleState.Day;\r
CalcDamage(json, url.EndsWith("battle_water"));\r
}\r
ClearEnemyOverKill();\r
\r
private bool IsNightBattle(dynamic json) => json.api_hougeki();\r
\r
- private int DeckId(dynamic json)\r
+ public static int DeckId(dynamic json)\r
{\r
if (json.api_dock_id()) // 昼戦はtypoしている\r
return (int)json.api_dock_id - 1;\r
- if (json.api_deck_id is string) // 通常の夜戦では文字列\r
+ if (json.api_deck_id is string) // é\80\9a常ã\81®å¤\9cæ\88¦ã\81¨é\80£å\90\88è\89¦é\9a\8a(å\91³æ\96¹ã\81®ã\81¿)ã\81§ã\81¯æ\96\87å\97å\88\97\r
return int.Parse(json.api_deck_id) - 1;\r
return (int)json.api_deck_id - 1;\r
}\r
var fstats = _shipInfo.GetShipStatuses(_fleet);\r
FlagshipRecovery(fstats[0]);\r
_friend = Record.Setup(fstats);\r
- _enemyHp = nowhps.Skip(7).TakeWhile(hp => hp != -1).ToArray();\r
+ _enemyHp = nowhps.Skip(7).ToArray();\r
_enemyStartHp = (int[])_enemyHp.Clone();\r
EnemyResultStatus =\r
- (from id in (int[])json.api_ship_ke\r
- where id != -1\r
+ (from id in\r
+ json.api_ship_ke_combined()\r
+ ? ((int[])json.api_ship_ke).Skip(1).Concat(((int[])json.api_ship_ke_combined).Skip(1))\r
+ : ((int[])json.api_ship_ke).Skip(1)\r
select new ShipStatus {Id = id, Spec = _shipInfo.GetSpec(id)}).ToArray();\r
_guard = new Record[0];\r
_enemyGuardHp = new int[0];\r
{\r
_enemyGuardHp =\r
((int[])json.api_nowhps_combined).\r
- Skip(7).TakeWhile(hp => hp != -1).ToArray();\r
+ Skip(7).ToArray();\r
_enemyGuardStartHp = (int[])_enemyGuardHp.Clone();\r
}\r
}\r
\r
private void CalcDamage(dynamic json, bool surfaceFleet = false)\r
{\r
- AirBattleResults = new AirBattleResult();\r
+ AirBattleResults.Clear();\r
var fc = _guard.Length > 0;\r
var ec = _enemyGuardHp.Length > 0;\r
var both = fc && ec;\r
if (json.api_air_base_injection())\r
{\r
- var obj = json.api_air_base_injection;\r
- CalcAirBaseAttackDamage(obj.IsArray() ? obj : new[] {obj});\r
+ AddAirBattleResult(json.api_air_base_injection, "AB噴式");\r
+ CalcKoukuDamage(json.api_air_base_injection);\r
+ }\r
+ if (json.api_injection_kouku())\r
+ {\r
+ AddAirBattleResult(json.api_injection_kouku, "噴式");\r
+ CalcKoukuDamage(json.api_injection_kouku);\r
}\r
if (json.api_air_base_attack())\r
CalcAirBaseAttackDamage(json.api_air_base_attack);\r
- if (json.api_injection_kouku()) // 噴式強襲\r
- CalcKoukuDamage(json.api_injection_kouku);\r
if (json.api_kouku())\r
{\r
- SetAirBattleResult(json.api_kouku);\r
+ AddAirBattleResult(json.api_kouku, "航空戦");\r
CalcKoukuDamage(json.api_kouku);\r
}\r
if (json.api_kouku2()) // 航空戦2回目\r
+ {\r
+ AddAirBattleResult(json.api_kouku2, "航空戦2");\r
CalcKoukuDamage(json.api_kouku2);\r
+ }\r
if (!json.api_opening_atack()) // 航空戦のみ\r
return;\r
if (json.api_support_info() && json.api_support_info != null)\r
CalcSupportDamage(json.api_support_info);\r
if (json.api_opening_taisen() && json.api_opening_taisen != null)\r
{\r
- CalcHougekiDamage(json.api_opening_taisen,\r
- fc ? _guard : _friend, // 先制対潜攻撃の対象は護衛(たぶん)\r
- _enemyHp);\r
+ if (json.api_opening_taisen.api_at_eflag())\r
+ {\r
+ CalcCombinedHougekiDamage(json.api_opening_taisen, _friend, _guard, _enemyHp, _enemyGuardHp);\r
+ }\r
+ else\r
+ {\r
+ CalcHougekiDamage(json.api_opening_taisen,\r
+ fc ? _guard : _friend, // 先制対潜攻撃の対象は護衛\r
+ _enemyHp);\r
+ }\r
}\r
if (json.api_opening_atack != null)\r
{\r
}\r
else if (json.api_support_airatack != null)\r
{\r
- CalcKoukuDamage(json.api_support_airatack);\r
+ CalcSimpleDamage(json.api_support_airatack.api_stage3.api_edam, _enemyHp, _enemyGuardHp);\r
}\r
}\r
\r
private void CalcAirBaseAttackDamage(dynamic json)\r
{\r
+ var i = 1;\r
foreach (var entry in json)\r
+ {\r
+ AddAirBattleResult(entry, "基地" + i++);\r
CalcKoukuDamage(entry);\r
+ }\r
}\r
\r
- private void SetAirBattleResult(dynamic json)\r
+ private void AddAirBattleResult(dynamic json, string phaseName)\r
{\r
- if (json.api_stage1 == null || json.api_stage2 == null)\r
+ var stage1 = json.api_stage1;\r
+ if (stage1 == null || (stage1.api_f_count == 0 && stage1.api_e_count == 0))\r
return;\r
- AirBattleResults.Stage1 = new AirBattleResult.StageResult\r
- {\r
- FriendCount = (int)json.api_stage1.api_f_count,\r
- FriendLost = (int)json.api_stage1.api_f_lostcount,\r
- EnemyCount = (int)json.api_stage1.api_e_count,\r
- EnemyLost = (int)json.api_stage1.api_e_lostcount\r
- };\r
- AirBattleResults.Stage2 = new AirBattleResult.StageResult\r
+ AirBattleResults.Add(new AirBattleResult\r
{\r
- FriendCount = (int)json.api_stage2.api_f_count,\r
- FriendLost = (int)json.api_stage2.api_f_lostcount,\r
- EnemyCount = (int)json.api_stage2.api_e_count,\r
- EnemyLost = (int)json.api_stage2.api_e_lostcount\r
- };\r
+ PhaseName = phaseName,\r
+ AirControlLevel = json.api_stage1.api_disp_seiku() ? (int)json.api_stage1.api_disp_seiku : 0,\r
+ Stage1 = new AirBattleResult.StageResult\r
+ {\r
+ FriendCount = (int)json.api_stage1.api_f_count,\r
+ FriendLost = (int)json.api_stage1.api_f_lostcount,\r
+ EnemyCount = (int)json.api_stage1.api_e_count,\r
+ EnemyLost = (int)json.api_stage1.api_e_lostcount\r
+ },\r
+ Stage2 = json.api_stage2 == null\r
+ ? new AirBattleResult.StageResult\r
+ {\r
+ FriendCount = 0,\r
+ FriendLost = 0,\r
+ EnemyCount = 0,\r
+ EnemyLost = 0\r
+ }\r
+ : new AirBattleResult.StageResult\r
+ {\r
+ FriendCount = (int)json.api_stage2.api_f_count,\r
+ FriendLost = (int)json.api_stage2.api_f_lostcount,\r
+ EnemyCount = (int)json.api_stage2.api_e_count,\r
+ EnemyLost = (int)json.api_stage2.api_e_lostcount\r
+ }\r
+ });\r
}\r
\r
private void CalcKoukuDamage(dynamic json)\r
\r
public void InspectBattleResult(dynamic json)\r
{\r
+ BattleState = BattleState.Result;\r
ShowResult();\r
CleanupResult();\r
SetEscapeShips(json);\r
\r
public void InspectPracticeResult(dynamic json)\r
{\r
+ BattleState = BattleState.Result;\r
ShowResult(false);\r
CleanupResult();\r
}\r
\r
private void SetEnemyResultStatus()\r
{\r
- for (var i = 0; i < EnemyResultStatus.Length; i++)\r
+ for (var i = 0; i < 6; i++)\r
{\r
EnemyResultStatus[i].MaxHp = _enemyStartHp[i];\r
EnemyResultStatus[i].NowHp = _enemyHp[i];\r
}\r
+ for (var i = 6; i < EnemyResultStatus.Length; i++)\r
+ {\r
+ EnemyResultStatus[i].MaxHp = _enemyGuardStartHp[i - 6];\r
+ EnemyResultStatus[i].NowHp = _enemyGuardHp[i - 6];\r
+ }\r
}\r
\r
public void SetEscapeShips(dynamic json)\r