public int AirControlLevel { get; private set; }\r
public BattleResultRank ResultRank { get; private set; }\r
public ShipStatus[] EnemyResultStatus { get; private set; }\r
+ public ShipStatus[] EnemyGuardResultStatus { get; private set; }\r
public bool EnemyIsCombined => EnemyResultStatus.Length > 6;\r
public List<AirBattleResult> AirBattleResults { get; } = new List<AirBattleResult>();\r
\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
+ CalcCombinedHougekiDamage(json.api_hougeki, _friend, _guard, _enemyHp, _enemyGuardHp);\r
}\r
else\r
{\r
BattleState = BattleState.Day;\r
- CalcDamage(json, url.EndsWith("battle_water"));\r
+ CalcDamage(json);\r
}\r
ClearEnemyOverKill();\r
ResultRank = url.EndsWith("ld_airbattle") ? CalcLdAirBattleRank() : CalcResultRank();\r
{\r
if (_friend != null)\r
return;\r
- var nowhps = (int[])json.api_nowhps;\r
_fleet = DeckId(json);\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 = (int[])json.api_e_nowhps;\r
_enemyStartHp = (int[])_enemyHp.Clone();\r
- EnemyResultStatus =\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
+ EnemyResultStatus = ((int[])json.api_ship_ke)\r
+ .Select(id => new ShipStatus {Id = id, Spec = _shipInfo.GetSpec(id)}).ToArray();\r
+ EnemyGuardResultStatus = new ShipStatus[0];\r
+ if (json.api_ship_ke_combined())\r
+ {\r
+ EnemyGuardResultStatus = ((int[])json.api_ship_ke_combined)\r
+ .Select(id => new ShipStatus {Id = id, Spec = _shipInfo.GetSpec(id)}).ToArray();\r
+ }\r
_guard = new Record[0];\r
_enemyGuardHp = new int[0];\r
_enemyGuardStartHp = new int[0];\r
- if (!json.api_nowhps_combined())\r
- return;\r
- var combined = (int[])json.api_nowhps_combined;\r
- if (combined[1] != -1) // 味方が連合艦隊\r
+ if (json.api_f_nowhps_combined())\r
_guard = Record.Setup(_shipInfo.GetShipStatuses(1));\r
- if (combined.Length > 7) // 敵が連合艦隊\r
+ if (json.api_e_nowhps_combined()) // 敵が連合艦隊\r
{\r
- _enemyGuardHp =\r
- ((int[])json.api_nowhps_combined).Skip(7).TakeWhile(hp => hp != -1).ToArray();\r
+ _enemyGuardHp = (int[])json.api_nowhps;\r
_enemyGuardStartHp = (int[])_enemyGuardHp.Clone();\r
}\r
}\r
private EnemyFighterPower CalcEnemyFighterPower(dynamic json)\r
{\r
var result = new EnemyFighterPower();\r
- var ships = ((int[])json.api_ship_ke).Skip(1);\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).Skip(1));\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
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
+ 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
+ select new {spec, perSlot})\r
{\r
if (entry.spec.CanAirCombat)\r
result.AirCombat += entry.perSlot;\r
return result;\r
}\r
\r
- private void CalcDamage(dynamic json, bool surfaceFleet = false)\r
+ private void CalcDamage(dynamic json)\r
{\r
AirBattleResults.Clear();\r
var fc = _guard.Length > 0;\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
- 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
+ CalcCombinedHougekiDamage(json.api_opening_taisen, _friend, _guard, _enemyHp, _enemyGuardHp);\r
if (json.api_opening_atack != null)\r
{\r
if (both)\r
}\r
}\r
if (json.api_hougeki1() && json.api_hougeki1 != null)\r
- {\r
- if (json.api_hougeki1.api_at_eflag())\r
- {\r
- CalcCombinedHougekiDamage(json.api_hougeki1, _friend, _guard, _enemyHp, _enemyGuardHp);\r
- }\r
- else\r
- {\r
- CalcHougekiDamage(json.api_hougeki1,\r
- fc && !surfaceFleet ? _guard : _friend, // 空母機動部隊は一巡目が護衛\r
- ec ? _enemyGuardHp : _enemyHp); // 敵連合艦隊は一巡目が護衛\r
- }\r
- }\r
+ CalcCombinedHougekiDamage(json.api_hougeki1, _friend, _guard, _enemyHp, _enemyGuardHp);\r
if (json.api_hougeki2() && json.api_hougeki2 != null)\r
- {\r
- if (json.api_hougeki2.api_at_eflag())\r
- {\r
- CalcCombinedHougekiDamage(json.api_hougeki2, _friend, _guard, _enemyHp, _enemyGuardHp);\r
- }\r
- else\r
- {\r
- CalcHougekiDamage(json.api_hougeki2, _friend, _enemyHp);\r
- }\r
- }\r
+ CalcCombinedHougekiDamage(json.api_hougeki2, _friend, _guard, _enemyHp, _enemyGuardHp);\r
if (json.api_hougeki3() && json.api_hougeki3 != null)\r
- {\r
- if (json.api_hougeki3.api_at_eflag())\r
- {\r
- CalcCombinedHougekiDamage(json.api_hougeki3, _friend, _guard, _enemyHp, _enemyGuardHp);\r
- }\r
- else\r
- {\r
- CalcHougekiDamage(json.api_hougeki3,\r
- fc && surfaceFleet ? _guard : _friend, // 水上打撃部隊は三順目が護衛\r
- _enemyHp);\r
- }\r
- }\r
+ CalcCombinedHougekiDamage(json.api_hougeki3, _friend, _guard, _enemyHp, _enemyGuardHp);\r
if (json.api_raigeki() && json.api_raigeki != null)\r
{\r
if (both)\r
{\r
var damage = (int[])rawDamage;\r
for (var i = 0; i < friend.Length; i++)\r
- friend[i].ApplyDamage(damage[i + 1]);\r
+ friend[i].ApplyDamage(damage[i]);\r
for (var i = 0; i < guard.Length; i++)\r
- guard[i].ApplyDamage(damage[i + 6 + 1]);\r
+ guard[i].ApplyDamage(damage[i + 6]);\r
}\r
\r
private void CalcSimpleDamage(dynamic rawDamage, Record[] friend)\r
{\r
var damage = (int[])rawDamage;\r
for (var i = 0; i < friend.Length; i++)\r
- friend[i].ApplyDamage(damage[i + 1]);\r
+ friend[i].ApplyDamage(damage[i]);\r
}\r
\r
private void CalcSimpleDamage(dynamic rawDamage, int[] enemy, int[] enemyGuard)\r
{\r
var damage = (int[])rawDamage;\r
for (var i = 0; i < enemy.Length; i++)\r
- enemy[i] -= damage[i + 1];\r
+ enemy[i] -= damage[i];\r
for (var i = 0; i < enemyGuard.Length; i++)\r
- enemyGuard[i] -= damage[i + 6 + 1];\r
+ enemyGuard[i] -= damage[i + 6];\r
}\r
\r
private void CalcSimpleDamage(dynamic rawDamage, int[] result)\r
{\r
var damage = (int[])rawDamage;\r
for (var i = 0; i < result.Length; i++)\r
- result[i] -= damage[i + 1];\r
- }\r
-\r
- private void CalcHougekiDamage(dynamic hougeki, Record[] friend, int[] enemy)\r
- {\r
- var targets = ((dynamic[])hougeki.api_df_list).Skip(1).SelectMany(x => (int[])x);\r
- var damages = ((dynamic[])hougeki.api_damage).Skip(1).SelectMany(x => (int[])x);\r
- foreach (var hit in targets.Zip(damages, (t, d) => new {t, d}))\r
- {\r
- if (hit.t == -1)\r
- continue;\r
- if (hit.t <= 6)\r
- friend[hit.t - 1].ApplyDamage(hit.d);\r
- else\r
- enemy[(hit.t - 1) % 6] -= hit.d;\r
- }\r
+ result[i] -= damage[i];\r
}\r
\r
private void CalcCombinedHougekiDamage(dynamic hougeki, Record[] friend, Record[] guard,\r
int[] enemy, int[] enemyGuard)\r
{\r
- var targets = ((dynamic[])hougeki.api_df_list).Skip(1).Select(x => (int[])x);\r
- var damages = ((dynamic[])hougeki.api_damage).Skip(1).Select(x => (int[])x);\r
- var eflags = ((int[])hougeki.api_at_eflag).Skip(1);\r
+ var targets = ((dynamic[])hougeki.api_df_list).Select(x => (int[])x);\r
+ var damages = ((dynamic[])hougeki.api_damage).Select(x => (int[])x);\r
+ var eflags = (int[])hougeki.api_at_eflag;\r
foreach (var turn in\r
targets.Zip(damages, (t, d) => new {t, d}).Zip(eflags, (td, e) => new {e, td.t, td.d}))\r
{\r
{\r
if (turn.e == 1)\r
{\r
- if (hit.t <= 6)\r
- friend[hit.t - 1].ApplyDamage(hit.d);\r
+ if (hit.t < 6)\r
+ {\r
+ friend[hit.t].ApplyDamage(hit.d);\r
+ }\r
else\r
- guard[(hit.t - 1) % 6].ApplyDamage(hit.d);\r
+ {\r
+ guard[hit.t % 6].ApplyDamage(hit.d);\r
+ }\r
}\r
else\r
{\r
- if (hit.t <= 6)\r
- enemy[hit.t - 1] -= hit.d;\r
+ if (hit.t < 6)\r
+ {\r
+ enemy[hit.t] -= hit.d;\r
+ }\r
else\r
- enemyGuard[(hit.t - 1) % 6] -= hit.d;\r
+ {\r
+ enemyGuard[hit.t % 6] -= hit.d;\r
+ }\r
}\r
}\r
}\r
}\r
for (var i = 0; i < _enemyGuardHp.Length; i++)\r
{\r
- EnemyResultStatus[i + 6].MaxHp = _enemyGuardStartHp[i];\r
- EnemyResultStatus[i + 6].NowHp = _enemyGuardHp[i];\r
+ EnemyGuardResultStatus[i].MaxHp = _enemyGuardStartHp[i];\r
+ EnemyGuardResultStatus[i].NowHp = _enemyGuardHp[i];\r
}\r
}\r
\r