None,\r
Day,\r
Night,\r
+ SpNight,\r
Result,\r
Unknown\r
}\r
SetupResult(request, json, url.Contains("practice"));\r
FighterPower = CalcFighterPower();\r
EnemyFighterPower = CalcEnemyFighterPower(json);\r
- BattleState = IsNightBattle(json) ? BattleState.Night : BattleState.Day;\r
+ BattleState = url.Contains("sp_midnight") ? BattleState.SpNight :\r
+ url.Contains("midnight") ? BattleState.Night : BattleState.Day;\r
CalcDamage(json);\r
- ResultRank = url.EndsWith("ld_airbattle") ? CalcLdAirBattleRank() : CalcResultRank();\r
+ ResultRank = url.Contains("/ld_") ? CalcLdResultRank() : CalcResultRank();\r
SetResult();\r
}\r
\r
- private bool IsNightBattle(dynamic json) => json.api_hougeki();\r
-\r
public static int DeckId(dynamic json)\r
{\r
if (json.api_dock_id()) // 昼戦はtypoしている\r
};\r
}\r
\r
- private void FlagshipRecovery(string request, ShipStatus flagship)\r
+ private void FlagshipRecovery(string request, ShipStatus flagship)\r
{\r
var type = int.Parse(HttpUtility.ParseQueryString(request)["api_recovery_type"] ?? "0");\r
switch (type)\r
if (guard == null)\r
return;\r
for (var i = 0; i < guard.Length; i++)\r
+ {\r
guard[i].ApplyDamage(damage[i + 6]);\r
+ guard[i].CheckDamageControl();\r
+ }\r
}\r
\r
private void CalcDamageByTurn(dynamic json, bool ignoreFriendDamage = false)\r
json.api_at_eflag() && json.api_at_eflag != null))\r
return;\r
\r
+ var eFlags = (int[])json.api_at_eflag;\r
+ var sources = (int[])json.api_at_list;\r
+ var types = json.api_at_type() ? (int[])json.api_at_type : (int[])json.api_sp_list;\r
var targets = (int[][])json.api_df_list;\r
var damages = (int[][])json.api_damage;\r
- var eFlags = (int[])json.api_at_eflag;\r
var records = new[] {new Record[12], new Record[12]};\r
Array.Copy(_friend, records[1], _friend.Length);\r
Array.Copy(_guard, 0, records[1], 6, _guard.Length);\r
{\r
if (ignoreFriendDamage && eFlags[turn] == 1)\r
continue;\r
+ if (types[turn] == 100 || types[turn] == 101) // Nelson Touchと長門一斉射\r
+ records[eFlags[turn] ^ 1][sources[turn]].TriggerSpecialAttack();\r
for (var shot = 0; shot < targets[turn].Length; shot++)\r
{\r
var target = targets[turn][shot];\r
- var damage = damages[turn][shot];\r
+ var damage = damages[turn][shot];\r
if (target == -1 || damage == -1)\r
continue;\r
records[eFlags[turn]][target].ApplyDamage(damage);\r
public ShipStatus.Damage DamageLevel => _status.DamageLevel;\r
public string Name => _status.Name;\r
public int StartHp { get; private set; }\r
- public bool GoddessConsumed { get; private set; }\r
\r
public static Record[] Setup(IEnumerable<ShipStatus> ships, bool practice) =>\r
(from s in ships\r
}).ToArray();\r
}\r
\r
+ public void TriggerSpecialAttack()\r
+ {\r
+ _status.SpecialAttack = ShipStatus.Attack.Fire;\r
+ }\r
+\r
public void ApplyDamage(int damage)\r
{\r
_status.NowHp = Max(0, _status.NowHp - damage);\r
{\r
_status.NowHp = _status.MaxHp;\r
ConsumeSlotItem(_status, 43);\r
- GoddessConsumed = true;\r
break;\r
}\r
}\r
ship.NowHp = NowHp;\r
ship.Slot = _status.Slot;\r
ship.SlotEx = _status.SlotEx;\r
+ ship.SpecialAttack = _status.SpecialAttack == ShipStatus.Attack.Fire\r
+ ? ShipStatus.Attack.Fired\r
+ : ShipStatus.Attack.None;\r
}\r
}\r
\r
- private BattleResultRank CalcLdAirBattleRank()\r
+ private BattleResultRank CalcLdResultRank()\r
{\r
var combined = _friend.Concat(_guard).Where(r => !r.Escaped).ToArray();\r
var friendGauge = combined.Sum(r => r.StartHp - r.NowHp);\r
var friendStartHpTotal = 0;\r
var friendNowHpTotal = 0;\r
var friendSunk = 0;\r
- var goddessConsumed = false;\r
foreach (var ship in friend)\r
{\r
if (ship.Escaped)\r
friendNowHpTotal += ship.NowHp;\r
if (ship.NowHp == 0)\r
friendSunk++;\r
- goddessConsumed |= ship.GoddessConsumed;\r
}\r
var friendGaugeRate = (int)((double)(friendStartHpTotal - friendNowHpTotal) / friendStartHpTotal * 100);\r
\r
\r
if (friendSunk == 0 && enemySunk == enemyCount)\r
{\r
- if (friendNowHpTotal == friendStartHpTotal && !goddessConsumed)\r
+ if (friendNowHpTotal >= friendStartHpTotal)\r
return BattleResultRank.P;\r
return BattleResultRank.S;\r
}\r