};\r
if (json.api_stage2 != null && json.api_stage2.api_air_fire())\r
{\r
- var airfire = json.api_stage2.api_air_fire;\r
- var idx = (int)airfire.api_idx;\r
+ var airFire = json.api_stage2.api_air_fire;\r
+ var idx = (int)airFire.api_idx;\r
result.AirFire = new AirBattleResult.AirFireResult\r
{\r
ShipName = idx < _friend.Length ? _friend[idx].Name : _guard[idx - 6].Name,\r
- Kind = (int)airfire.api_kind,\r
- Items = ((int[])airfire.api_use_items).Select(id => _itemInfo.GetSpecByItemId(id).Name).ToArray()\r
+ Kind = (int)airFire.api_kind,\r
+ Items = ((int[])airFire.api_use_items).Select(id => _itemInfo.GetSpecByItemId(id).Name).ToArray()\r
};\r
}\r
AirBattleResults.Add(result);\r
{\r
var damage = (int[])rawDamage;\r
for (var i = 0; i < friend.Length; i++)\r
+ {\r
friend[i].ApplyDamage(damage[i]);\r
+ friend[i].CheckDamageControl();\r
+ }\r
if (guard == null)\r
return;\r
for (var i = 0; i < guard.Length; i++)\r
\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 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
Array.Copy(_enemy, records[0], _enemy.Length);\r
Array.Copy(_enemyGuard, 0, records[0], 6, _enemyGuard.Length);\r
- for (var i = 0; i < eflags.Length; i++)\r
+ for (var turn = 0; turn < eFlags.Length; turn++)\r
{\r
- // 一度に複数の目標を狙う攻撃はないものと仮定する\r
- var hit = new {t = targets[i][0], d = damages[i].Sum(d => d >= 0 ? d : 0)};\r
- if (hit.t == -1)\r
- continue;\r
- if (ignoreFriendDamage && eflags[i] == 1)\r
+ if (ignoreFriendDamage && eFlags[turn] == 1)\r
continue;\r
- records[eflags[i]][hit.t].ApplyDamage(hit.d);\r
+ for (var shot = 0; shot < targets[turn].Length; shot++)\r
+ {\r
+ var target = targets[turn][shot];\r
+ var damage = damages[turn][shot];\r
+ if (target == -1 || damage == -1)\r
+ continue;\r
+ records[eFlags[turn]][target].ApplyDamage(damage);\r
+ }\r
+ foreach (var ship in records[1])\r
+ ship?.CheckDamageControl();\r
}\r
}\r
\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
select new Record {_status = (ShipStatus)s.Clone(), _practice = practice, StartHp = s.NowHp}).ToArray();\r
\r
- public static Record[] Setup(int[] nowhps, ShipSpec[] specs, ItemSpec[][] slots, bool practice)\r
+ public static Record[] Setup(int[] nowHps, ShipSpec[] specs, ItemSpec[][] slots, bool practice)\r
{\r
- return Enumerable.Range(0, nowhps.Length).Select(i =>\r
+ return Enumerable.Range(0, nowHps.Length).Select(i =>\r
new Record\r
{\r
- StartHp = nowhps[i],\r
+ StartHp = nowHps[i],\r
_status = new ShipStatus\r
{\r
Id = specs[i].Id,\r
- NowHp = nowhps[i],\r
- MaxHp = nowhps[i],\r
+ NowHp = nowHps[i],\r
+ MaxHp = nowHps[i],\r
Spec = specs[i],\r
Slot = slots[i].Select(spec => new ItemStatus {Id = spec.Id, Spec = spec}).ToArray(),\r
SlotEx = new ItemStatus(0)\r
\r
public void ApplyDamage(int damage)\r
{\r
- if (_status.NowHp > damage)\r
- {\r
- _status.NowHp -= damage;\r
- return;\r
- }\r
- _status.NowHp = 0;\r
- if (_practice)\r
+ _status.NowHp = Max(0, _status.NowHp - damage);\r
+ }\r
+\r
+ public void CheckDamageControl()\r
+ {\r
+ if (_status.NowHp > 0 || _practice)\r
return;\r
foreach (var item in new[] {_status.SlotEx}.Concat(_status.Slot))\r
{\r
{\r
_status.NowHp = _status.MaxHp;\r
ConsumeSlotItem(_status, 43);\r
+ GoddessConsumed = true;\r
break;\r
}\r
}\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)\r
+ if (friendNowHpTotal == friendStartHpTotal && !goddessConsumed)\r
return BattleResultRank.P;\r
return BattleResultRank.S;\r
}\r