/// <summary> /// 戦闘詳細の情報を出力します。 /// </summary> public override string ToString() { StringBuilder builder = new StringBuilder(); builder.AppendFormat("{0} → {1}\r\n", GetAttackerName(), GetDefenderName()); if (AttackType >= 0) { builder.Append("[").Append(GetAttackKind()).Append("] "); } for (int i = 0; i < Damages.Length; i++) { if (CriticalTypes[i] == CriticalType.Invalid) // カットイン(主砲/主砲)、カットイン(主砲/副砲)時に発生する { continue; } if (i > 0) { builder.Append(" , "); } switch (CriticalTypes[i]) { case CriticalType.Miss: builder.Append("Miss"); break; case CriticalType.Hit: builder.Append(Damages[i]).Append(" Dmg"); break; case CriticalType.Critical: builder.Append(Damages[i]).Append(" Critical!"); break; } } { int before = Math.Max(DefenderHP, 0); int after = Math.Max(DefenderHP - Damages.Sum(), 0); if (before != after) { builder.AppendFormat(" ( {0} → {1} )", before, after); } } builder.AppendLine(); return(builder.ToString()); }
/// <summary> /// 航空戦での与ダメージを推測します。 /// </summary> /// <param name="damages">与ダメージリスト。</param> private void CalculateAttackDamage(int[] damages) { // 敵はめんどくさすぎるので省略 // 仮想火力を求め、それに従って合計ダメージを分配 var firepower = new int[6]; var members = _battleData.Initial.FriendFleet.MembersWithoutEscaped; for (int i = 0; i < members.Count; i++) { var ship = members[i]; if (ship == null) { continue; } var slots = ship.SlotInstanceMaster; var aircrafts = ship.Aircraft; for (int s = 0; s < slots.Count; s++) { if (slots[s] == null) { continue; } switch (slots[s].CategoryType) { case 7: //艦上爆撃機 case 11: //水上爆撃機 firepower[i] += (int)(1.0 * (slots[s].Bomber * Math.Sqrt(aircrafts[s]) + 25)); break; case 8: //艦上攻撃機 (80%と150%はランダムのため係数は平均値) firepower[i] += (int)(1.15 * (slots[s].Torpedo * Math.Sqrt(aircrafts[s]) + 25)); break; } } } int totalFirepower = firepower.Sum(); int totalDamage = Damages.Sum(); for (int i = 0; i < 6; i++) { damages[i] += (int)((double)totalDamage * firepower[i] / Math.Max(totalFirepower, 1)); } }
/// <summary> /// 戦闘詳細の情報を出力します。 /// </summary> public override string ToString() { StringBuilder builder = new StringBuilder(); if (Battle.IsPractice) { builder.AppendFormat("{0}{1} → {2}{3}", Attacker == null ? "" : AttackerIndex.IsFriend ? "自軍 " : "敵軍 ", GetAttackerName(), DefenderIndex.IsFriend ? "自軍 " : "敵軍 ", GetDefenderName() ).AppendLine(); } else { builder.AppendFormat("{0} → {1}", GetAttackerName(), GetDefenderName()).AppendLine(); } if (AttackType >= 0) { builder.Append("[").Append(GetAttackKind()).Append("] "); } /*// * if ( EquipmentIDs != null ) { * var eqs = EquipmentIDs.Select( id => KCDatabase.Instance.MasterEquipments[id] ).Where( eq => eq != null ).Select( eq => eq.Name ); * if ( eqs.Any() ) * builder.Append( "(" ).Append( string.Join( ", ", eqs ) ).Append( ") " ); * } * //*/ for (int i = 0; i < Damages.Length; i++) { if (CriticalTypes[i] == CriticalType.Invalid) // カットイン(主砲/主砲)、カットイン(主砲/副砲)時に発生する { continue; } if (i > 0) { builder.Append(" , "); } if (GuardsFlagship[i]) { builder.Append("<かばう> "); } switch (CriticalTypes[i]) { case CriticalType.Miss: builder.Append("Miss"); break; case CriticalType.Hit: builder.Append(Damages[i]).Append(" Dmg"); break; case CriticalType.Critical: builder.Append(Damages[i]).Append(" Critical!"); break; } } int beforeHP = Math.Max(DefenderHP, 0); int afterHP = Math.Max(DefenderHP - Damages.Sum(), 0); if (beforeHP != afterHP) { builder.AppendFormat(" ( {0} → {1} )", beforeHP, afterHP); } builder.AppendLine(); // damage control if (beforeHP > 0 && afterHP <= 0 && DefenderIndex.IsFriend && !Battle.IsPractice && !Battle.IsBaseAirRaid) { // 友軍艦隊時は常に beforeHP == 0 になるので、ここには来ないはず // 暫定対策でしかないのでできればまともにしたい var defender = (DefenderIndex.Side == BattleSides.FriendEscort ? Battle.Initial.FriendFleetEscort : Battle.Initial.FriendFleet) ?.MembersInstance?.ElementAtOrDefault(DefenderIndex.Index); if (defender != null) { int id = defender.DamageControlID; if (id == 42) { builder.AppendFormat(" 応急修理要員発動 HP{0}", (int)(defender.HPMax * 0.2)).AppendLine(); } else if (id == 43) { builder.AppendFormat(" 応急修理女神発動 HP{0}", defender.HPMax).AppendLine(); } } } return(builder.ToString()); }
/// <summary> /// 戦闘詳細の情報を出力します。 /// </summary> public override string ToString() { StringBuilder builder = new StringBuilder(); builder.AppendFormat("{0} → {1}\r\n", GetAttackerName(), GetDefenderName()); if (AttackType >= 0) { builder.Append("[").Append(GetAttackKind()).Append("] "); } /*// * if ( EquipmentIDs != null ) { * var eqs = EquipmentIDs.Select( id => KCDatabase.Instance.MasterEquipments[id] ).Where( eq => eq != null ).Select( eq => eq.Name ); * if ( eqs.Any() ) * builder.Append( "(" ).Append( string.Join( ", ", eqs ) ).Append( ") " ); * } * //*/ for (int i = 0; i < Damages.Length; i++) { if (CriticalTypes[i] == CriticalType.Invalid) // カットイン(主砲/主砲)、カットイン(主砲/副砲)時に発生する { continue; } if (i > 0) { builder.Append(" , "); } if (GuardsFlagship[i]) { builder.Append("<かばう> "); } switch (CriticalTypes[i]) { case CriticalType.Miss: builder.Append("Miss"); break; case CriticalType.Hit: builder.Append(Damages[i]).Append(" Dmg"); break; case CriticalType.Critical: builder.Append(Damages[i]).Append(" Critical!"); break; } } { int before = Math.Max(DefenderHP, 0); int after = Math.Max(DefenderHP - Damages.Sum(), 0); if (before != after) { builder.AppendFormat(" ( {0} → {1} )", before, after); } } builder.AppendLine(); return(builder.ToString()); }
/// <summary> /// 戦闘詳細の情報を出力します。 /// </summary> public override string ToString() { StringBuilder builder = new StringBuilder(); if (Battle.IsPractice) builder.AppendFormat("{0}{1} → {2}{3}", Attacker == null ? "" : AttackerIndex.IsFriend ? "Friendly " : "Enemy ", GetAttackerName(), DefenderIndex.IsFriend ? "Friendly " : "Enemy ", GetDefenderName() ).AppendLine(); else builder.AppendFormat("{0} → {1}", GetAttackerName(), GetDefenderName()).AppendLine(); if (AttackType >= 0) builder.Append("[").Append(GetAttackKind()).Append("] "); /*// if ( EquipmentIDs != null ) { var eqs = EquipmentIDs.Select( id => KCDatabase.Instance.MasterEquipments[id] ).Where( eq => eq != null ).Select( eq => eq.Name ); if ( eqs.Any() ) builder.Append( "(" ).Append( string.Join( ", ", eqs ) ).Append( ") " ); } //*/ for (int i = 0; i < Damages.Length; i++) { if (CriticalTypes[i] == CriticalType.Invalid) // カットイン(主砲/主砲)、カットイン(主砲/副砲)時に発生する continue; if (i > 0) builder.Append(" , "); if (GuardsFlagship[i]) builder.Append("<Protected> "); switch (CriticalTypes[i]) { case CriticalType.Miss: builder.Append("Miss"); break; case CriticalType.Hit: builder.Append(Damages[i]).Append(" Dmg"); break; case CriticalType.Critical: builder.Append(Damages[i]).Append(" Critical!"); break; } } int beforeHP = Math.Max(DefenderHP, 0); int afterHP = Math.Max(DefenderHP - Damages.Sum(), 0); if (beforeHP != afterHP) builder.AppendFormat(" ( {0} → {1} )", beforeHP, afterHP); builder.AppendLine(); // damage control if (beforeHP > 0 && afterHP <= 0 && DefenderIndex.IsFriend && !Battle.IsPractice && !Battle.IsBaseAirRaid) { var defender = (DefenderIndex.Side == BattleSides.FriendEscort ? Battle.Initial.FriendFleetEscort : Battle.Initial.FriendFleet) ?.MembersInstance?.ElementAtOrDefault(DefenderIndex.Index); if (defender != null) { int id = defender.DamageControlID; if (id == 42) builder.AppendFormat(" Emergency Repair Personnel activated. HP{0}", (int)(defender.HPMax * 0.2)).AppendLine(); else if (id == 43) builder.AppendFormat(" Emergency Repair Goddess activated. HP{0}", defender.HPMax).AppendLine(); } } return builder.ToString(); }
/// <summary> /// 戦闘詳細の情報を出力します。 /// </summary> public override string ToString() { StringBuilder builder = new StringBuilder(); // 航空戦・支援攻撃時 AttackerIndex = BattleIndex.Invalid 、それで AttackerIndex.Side = BattleSides.FriendMain になる // DefenderIndex.Side で判断すれば航空戦も正確に識別できるが表示が変になるので、最終的には AttackerIndex.Side で判断した builder.AppendFormat(AttackerIndex.IsFriend ? "{0} → {1}\r\n" : "{1} ← {0}\r\n", GetAttackerName(), GetDefenderName()); if (AttackType >= 0) { builder.Append("[").Append(GetAttackKind()).Append("] "); } /*// * if ( EquipmentIDs != null ) { * var eqs = EquipmentIDs.Select( id => KCDatabase.Instance.MasterEquipments[id] ).Where( eq => eq != null ).Select( eq => eq.Name ); * if ( eqs.Any() ) * builder.Append( "(" ).Append( string.Join( ", ", eqs ) ).Append( ") " ); * } * //*/ for (int i = 0; i < Damages.Length; i++) { if (CriticalTypes[i] == CriticalType.Invalid) // カットイン(主砲/主砲)、カットイン(主砲/副砲)時に発生する { continue; } if (i > 0) { builder.Append(" , "); } if (GuardsFlagship[i]) { builder.Append("<援护> "); } switch (CriticalTypes[i]) { case CriticalType.Miss: builder.Append("Miss"); break; case CriticalType.Hit: builder.Append(Damages[i]).Append(" Dmg"); break; case CriticalType.Critical: builder.Append(Damages[i]).Append(" Critical!"); break; } } int beforeHP = Math.Max(DefenderHP, 0); int afterHP = Math.Max(DefenderHP - Damages.Sum(), 0); if (beforeHP != afterHP) { builder.AppendFormat(" ( {0} → {1} )", beforeHP, afterHP); } builder.AppendLine(); // damage control if (afterHP <= 0 && DefenderIndex.IsFriend && !Battle.IsPractice && !Battle.IsBaseAirRaid) { var defender = (DefenderIndex.Side == BattleSides.FriendEscort ? Battle.Initial.FriendFleetEscort : Battle.Initial.FriendFleet).MembersInstance[DefenderIndex.Index]; if (defender != null) { int id = defender.DamageControlID; if (id == 42) { builder.AppendFormat(" 应急修理要员发动 HP{0}", (int)(defender.HPMax * 0.2)).AppendLine(); } else if (id == 43) { builder.AppendFormat(" 应急修理女神发动 HP{0}", defender.HPMax).AppendLine(); } } } return(builder.ToString()); }