/// <summary> /// 戦闘終了時に各種データの収集を行います。 /// </summary> private void BattleFinished() { //敵編成記録 EnemyFleetRecord.EnemyFleetElement enemyFleetData = EnemyFleetRecord.EnemyFleetElement.CreateFromCurrentState(); if (enemyFleetData != null) { RecordManager.Instance.EnemyFleet.Update(enemyFleetData); } // ロギング if (IsPractice) { Utility.Logger.Add(2, string.Format("演習 で「{0}」{1}の「{2}」と交戦しました。( ランク: {3}, 提督Exp+{4}, 艦娘Exp+{5} )", EnemyAdmiralName, EnemyAdmiralRank, Result.EnemyFleetName, Result.Rank, Result.AdmiralExp, Result.BaseExp)); } else { Utility.Logger.Add(2, string.Format("{0}-{1}-{2} で「{3}」と交戦しました。( ランク: {4}, 提督Exp+{5}, 艦娘Exp+{6} )", Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, Result.EnemyFleetName, Result.Rank, Result.AdmiralExp, Result.BaseExp)); } //ドロップ艦記録 if (!IsPractice) { //checkme: とてもアレな感じ int shipID = Result.DroppedShipID; int itemID = Result.DroppedItemID; int eqID = Result.DroppedEquipmentID; bool showLog = Utility.Configuration.Config.Log.ShowSpoiler; if (shipID != -1) { ShipDataMaster ship = KCDatabase.Instance.MasterShips[shipID]; DroppedShipCount++; var defaultSlot = ship.DefaultSlot; if (defaultSlot != null) { DroppedEquipmentCount += defaultSlot.Count(id => id != -1); } if (showLog) { Utility.Logger.Add(2, string.Format("{0}「{1}」が戦列に加わりました。", ship.ShipTypeName, ship.NameWithClass)); } } if (itemID != -1) { if (!DroppedItemCount.ContainsKey(itemID)) { DroppedItemCount.Add(itemID, 0); } DroppedItemCount[itemID]++; if (showLog) { var item = KCDatabase.Instance.UseItems[itemID]; var itemmaster = KCDatabase.Instance.MasterUseItems[itemID]; Utility.Logger.Add(2, string.Format("アイテム「{0}」を入手しました。( 合計: {1}個 )", itemmaster != null ? itemmaster.Name : ("不明なアイテム - ID:" + itemID), (item != null ? item.Count : 0) + DroppedItemCount[itemID])); } } if (eqID != -1) { EquipmentDataMaster eq = KCDatabase.Instance.MasterEquipments[eqID]; DroppedEquipmentCount++; if (showLog) { Utility.Logger.Add(2, string.Format("{0}「{1}」を入手しました。", eq.CategoryTypeInstance.Name, eq.Name)); } } // 満員判定 if (shipID == -1 && ( KCDatabase.Instance.Admiral.MaxShipCount - (KCDatabase.Instance.Ships.Count + DroppedShipCount) <= 0 || KCDatabase.Instance.Admiral.MaxEquipmentCount - (KCDatabase.Instance.Equipments.Count + DroppedEquipmentCount) <= 0)) { shipID = -2; } RecordManager.Instance.ShipDrop.Add(shipID, itemID, eqID, Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, Compass.MapInfo.EventDifficulty, Compass.EventID == 5, enemyFleetData.FleetID, Result.Rank, KCDatabase.Instance.Admiral.Level); } //DEBUG /*/ * if ( Utility.Configuration.Config.Log.LogLevel <= 1 && Utility.Configuration.Config.Connection.SaveReceivedData ) { * IEnumerable<int> damages; * switch ( BattleMode & BattleModes.BattlePhaseMask ) { * case BattleModes.Normal: * case BattleModes.AirBattle: * case BattleModes.Practice: * default: * damages = ( (BattleData)BattleNight ?? BattleDay ).AttackDamages; * break; * case BattleModes.NightOnly: * case BattleModes.NightDay: * damages = ( (BattleData)BattleDay ?? BattleNight ).AttackDamages; * break; * } * * damages = damages.Take( 6 ).Where( i => i > 0 ); * * if ( damages.Count( i => i == damages.Max() ) > 1 ) { * Utility.Logger.Add( 1, "MVP候補が複数存在します。ログを確認してください。" ); * } * } * //*/ }
public override void LoadFromResponse(string apiname, dynamic data) { //base.LoadFromResponse( apiname, data ); //不要 switch (apiname) { case "api_req_map/start": case "api_req_map/next": BattleDay = null; BattleNight = null; Result = null; BattleMode = BattleModes.Undefined; Compass = new CompassData(); Compass.LoadFromResponse(apiname, data); break; case "api_req_sortie/battle": BattleMode = BattleModes.Normal; BattleDay = new BattleNormalDay(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_battle_midnight/battle": BattleNight = new BattleNormalNight(); BattleNight.TakeOverParameters(BattleDay); BattleNight.LoadFromResponse(apiname, data); break; case "api_req_battle_midnight/sp_midnight": BattleMode = BattleModes.NightOnly; BattleNight = new BattleNightOnly(); BattleNight.LoadFromResponse(apiname, data); break; case "api_req_sortie/airbattle": BattleMode = BattleModes.AirBattle; BattleDay = new BattleAirBattle(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_sortie/ld_airbattle": BattleMode = BattleModes.AirRaid; BattleDay = new BattleAirRaid(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/battle": BattleMode = BattleModes.Normal | BattleModes.CombinedTaskForce; BattleDay = new BattleCombinedNormalDay(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/midnight_battle": BattleNight = new BattleCombinedNormalNight(); //BattleNight.TakeOverParameters( BattleDay ); //checkme: 連合艦隊夜戦では昼戦での与ダメージがMVPに反映されない仕様? BattleNight.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/sp_midnight": BattleMode = BattleModes.NightOnly | BattleModes.CombinedMask; BattleNight = new BattleCombinedNightOnly(); BattleNight.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/airbattle": BattleMode = BattleModes.AirBattle | BattleModes.CombinedTaskForce; BattleDay = new BattleCombinedAirBattle(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/battle_water": BattleMode = BattleModes.Normal | BattleModes.CombinedSurface; BattleDay = new BattleCombinedWater(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/ld_airbattle": BattleMode = BattleModes.AirRaid | BattleModes.CombinedTaskForce; BattleDay = new BattleCombinedAirRaid(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/ec_battle": BattleMode = BattleModes.Normal | BattleModes.EnemyCombinedFleet; BattleDay = new BattleEnemyCombinedDay(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/ec_midnight_battle": BattleNight = new BattleEnemyCombinedNight(); //BattleNight.TakeOverParameters( BattleDay ); //undone: これで正しいかは未検証 BattleNight.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/each_battle": BattleMode = BattleModes.Normal | BattleModes.CombinedTaskForce | BattleModes.EnemyCombinedFleet; BattleDay = new BattleCombinedEachDay(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_combined_battle/each_battle_water": BattleMode = BattleModes.Normal | BattleModes.CombinedSurface | BattleModes.EnemyCombinedFleet; BattleDay = new BattleCombinedEachWater(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_member/get_practice_enemyinfo": EnemyAdmiralName = data.api_nickname; EnemyAdmiralRank = Constants.GetAdmiralRank((int)data.api_rank); break; case "api_req_practice/battle": BattleMode = BattleModes.Practice; BattleDay = new BattlePracticeDay(); BattleDay.LoadFromResponse(apiname, data); break; case "api_req_practice/midnight_battle": BattleNight = new BattlePracticeNight(); BattleNight.TakeOverParameters(BattleDay); BattleNight.LoadFromResponse(apiname, data); break; case "api_req_sortie/battleresult": case "api_req_combined_battle/battleresult": case "api_req_practice/battle_result": Result = new BattleResultData(); Result.LoadFromResponse(apiname, data); BattleFinished(); break; case "api_port/port": Compass = null; BattleDay = null; BattleNight = null; Result = null; BattleMode = BattleModes.Undefined; DroppedShipCount = DroppedEquipmentCount = 0; DroppedItemCount.Clear(); break; case "api_get_member/slot_item": DroppedEquipmentCount = 0; break; } }
/// <summary> /// 戦闘終了時に各種データの収集を行います。 /// </summary> private void BattleFinished() { //敵編成記録 EnemyFleetRecord.EnemyFleetElement enemyFleetData = EnemyFleetRecord.EnemyFleetElement.CreateFromCurrentState(); if (enemyFleetData != null) { RecordManager.Instance.EnemyFleet.Update(enemyFleetData); } // ロギング if (IsPractice) { Utility.Logger.Add(2, "", "同", string.Format("「{0}」[{1}]", EnemyAdmiralName, EnemyAdmiralRank), "的舰队", string.Format("「{0}」", Result.EnemyFleetName), string.Format("进行了演习。( 结果 : {0}, 提督经验 +{1}, 舰娘经验 +{2} )", Result.Rank, Result.AdmiralExp, Result.BaseExp)); } else if (IsBaseAirRaid) { var initialHPs = BattleDay.Initial.FriendInitialHPs.TakeWhile(hp => hp >= 0); var damage = initialHPs.Zip(BattleDay.ResultHPs.Take(initialHPs.Count()), (initial, result) => initial - result).Sum(); Utility.Logger.Add(2, "", string.Format("在 {0}-{1}-{2} 海域,基地受到了空袭。( 受损合计 : {3}, {4} )", Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, damage, Constants.GetAirRaidDamage(Compass.AirRaidDamageKind))); } else { Utility.Logger.Add(2, "", string.Format("在 {0}-{1}-{2} 海域与", Compass.MapAreaID, Compass.MapInfoID, Compass.Destination), string.Format("「{0}」", Result.EnemyFleetName), string.Format("进行了战斗。( 结果 : {0}, 提督经验 +{1}, 舰娘经验 +{2} )", Result.Rank, Result.AdmiralExp, Result.BaseExp)); } // Level up if (!IsBaseAirRaid) { var exps = Result.ExpList; var lvup = Result.LevelUpList; for (int i = 0; i < lvup.Length; i++) { if (lvup[i].Length >= 2 && i < exps.Length && lvup[i][0] + exps[i] >= lvup[i][1]) { var ship = FirstBattle.Initial.FriendFleet.MembersInstance[i]; int increment = Math.Max(lvup[i].Length - 2, 1); Utility.Logger.Add(2, ship.Name, string.Format(" 的等级达到了 Lv. {0} 。", ship.Level + increment)); } } if (IsCombinedBattle) { exps = Result.ExpListCombined; lvup = Result.LevelUpListCombined; for (int i = 0; i < lvup.Length; i++) { if (lvup[i].Length >= 2 && i < exps.Length && lvup[i][0] + exps[i] >= lvup[i][1]) { var ship = FirstBattle.Initial.FriendFleetEscort.MembersInstance[i]; int increment = Math.Max(lvup[i].Length - 2, 1); Utility.Logger.Add(2, ship.Name, string.Format(" 的等级达到了 Lv. {0} 。", ship.Level + increment)); } } } } //ドロップ艦記録 if (!IsPractice && !IsBaseAirRaid) { //checkme: とてもアレな感じ int shipID = Result.DroppedShipID; int itemID = Result.DroppedItemID; int eqID = Result.DroppedEquipmentID; bool showLog = Utility.Configuration.Config.Log.ShowSpoiler; if (itemID != -1) { if (!DroppedItemCount.ContainsKey(itemID)) { DroppedItemCount.Add(itemID, 0); } DroppedItemCount[itemID]++; if (showLog && shipID == -1) { var item = KCDatabase.Instance.UseItems[itemID]; var itemmaster = KCDatabase.Instance.MasterUseItems[itemID]; Utility.Logger.Add(2, "", "获得了", string.Format("「{0}」。", itemmaster?.Name ?? ("不明なアイテム - ID:" + itemID)), string.Format("( 合计 : {0} 个 )", (item?.Count ?? 0) + DroppedItemCount[itemID])); } } if (shipID != -1) { ShipDataMaster ship = KCDatabase.Instance.MasterShips[shipID]; DroppedShipCount++; var defaultSlot = ship.DefaultSlot; if (defaultSlot != null) { DroppedEquipmentCount += defaultSlot.Count(id => id != -1); } if (showLog) { if (itemID != -1) { var item = KCDatabase.Instance.UseItems[itemID]; var itemmaster = KCDatabase.Instance.MasterUseItems[itemID]; Utility.Logger.Add(2, string.Format("{0}「{1}」", ship.ShipTypeName, ship.NameWithClass), "加入了队伍。获得了", string.Format("「{0}」。", itemmaster?.Name ?? ("不明なアイテム - ID:" + itemID)), string.Format("( 合计 : {0} 个 )", (item?.Count ?? 0) + DroppedItemCount[itemID])); } else { Utility.Logger.Add(2, string.Format("{0}「{1}」", ship.ShipTypeName, ship.NameWithClass), "加入了队伍。"); } } } if (eqID != -1) { EquipmentDataMaster eq = KCDatabase.Instance.MasterEquipments[eqID]; DroppedEquipmentCount++; if (showLog) { Utility.Logger.Add(2, "", "获得了 ", string.Format("{0}「{1}」。", eq.CategoryTypeInstance.Name, eq.Name)); } } // 満員判定 if (shipID == -1 && ( KCDatabase.Instance.Admiral.MaxShipCount - (KCDatabase.Instance.Ships.Count + DroppedShipCount) <= 0 || KCDatabase.Instance.Admiral.MaxEquipmentCount - (KCDatabase.Instance.Equipments.Count + DroppedEquipmentCount) <= 0)) { shipID = -2; } RecordManager.Instance.ShipDrop.Add(shipID, itemID, eqID, Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, Compass.MapInfo.EventDifficulty, Compass.EventID == 5, enemyFleetData.FleetID, Result.Rank, KCDatabase.Instance.Admiral.Level); } WriteBattleLog(); /*//DEBUG * if (!IsBaseAirRaid && Utility.Configuration.Config.Log.LogLevel <= 1) * { * var battle = SecondBattle ?? FirstBattle; * * for (int i = 0; i < battle.Initial.EnemyMaxHPs.Length; i++) * { * if (battle.Initial.EnemyMaxHPs[i] > 0 && battle.ResultHPs[BattleIndex.Get(BattleSides.EnemyMain, i)] == 0) * Utility.Logger.Add(1, "justkill #" + (i + 1)); * } * * int rank = PredictWinRank(out var friend, out var enemy); * * // SS -> S * if (Constants.GetWinRank(rank).Substring(0, 1) != Result.Rank) * { * Utility.Logger.Add(1, $"勝利ランク予測が誤っています。予想 {Constants.GetWinRank(rank)} -> 実際 {Result.Rank}"); * } * } * //*/ }
/// <summary> /// 戦闘終了時に各種データの収集を行います。 /// </summary> private void BattleFinished() { //敵編成記録 EnemyFleetRecord.EnemyFleetElement enemyFleetData = EnemyFleetRecord.EnemyFleetElement.CreateFromCurrentState(); if (enemyFleetData != null) { RecordManager.Instance.EnemyFleet.Update(enemyFleetData); } // ロギング if (IsPractice) { Utility.Logger.Add(2, string.Format("演習 で「{0}」{1}の「{2}」と交戦しました。( ランク: {3}, 提督Exp+{4}, 艦娘Exp+{5} )", EnemyAdmiralName, EnemyAdmiralRank, Result.EnemyFleetName, Result.Rank, Result.AdmiralExp, Result.BaseExp)); } else if (IsBaseAirRaid) { var initialHPs = BattleDay.Initial.FriendInitialHPs.TakeWhile(hp => hp >= 0); var damage = initialHPs.Zip(BattleDay.ResultHPs.Take(initialHPs.Count()), (initial, result) => initial - result).Sum(); var airraid = ((BattleBaseAirRaid)BattleDay).BaseAirRaid; Utility.Logger.Add(2, string.Format("{0}-{1}-{2} で基地に空襲を受けました。( {3}, 被ダメージ合計: {4}, {5} )", Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, Constants.GetAirSuperiority(airraid.IsAvailable ? airraid.AirSuperiority : -1), damage, Constants.GetAirRaidDamage(Compass.AirRaidDamageKind))); } else { Utility.Logger.Add(2, string.Format("{0}-{1}-{2} で「{3}」と交戦しました。( ランク: {4}, 提督Exp+{5}, 艦娘Exp+{6} )", Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, Result.EnemyFleetName, Result.Rank, Result.AdmiralExp, Result.BaseExp)); } // Level up if (!IsBaseAirRaid) { var exps = Result.ExpList; var lvup = Result.LevelUpList; for (int i = 0; i < lvup.Length; i++) { if (lvup[i].Length >= 2 && i < exps.Length && lvup[i][0] + exps[i] >= lvup[i][1]) { var ship = FirstBattle.Initial.FriendFleet.MembersInstance[i]; int increment = Math.Max(lvup[i].Length - 2, 1); Utility.Logger.Add(2, string.Format("{0} が Lv. {1} になりました。", ship.Name, ship.Level + increment)); } } if (IsCombinedBattle) { exps = Result.ExpListCombined; lvup = Result.LevelUpListCombined; for (int i = 0; i < lvup.Length; i++) { if (lvup[i].Length >= 2 && i < exps.Length && lvup[i][0] + exps[i] >= lvup[i][1]) { var ship = FirstBattle.Initial.FriendFleetEscort.MembersInstance[i]; int increment = Math.Max(lvup[i].Length - 2, 1); Utility.Logger.Add(2, string.Format("{0} が Lv. {1} になりました。", ship.Name, ship.Level + increment)); } } } } //ドロップ艦記録 if (!IsPractice && !IsBaseAirRaid) { //checkme: とてもアレな感じ int shipID = Result.DroppedShipID; int itemID = Result.DroppedItemID; int eqID = Result.DroppedEquipmentID; bool showLog = Utility.Configuration.Config.Log.ShowSpoiler; if (shipID != -1) { ShipDataMaster ship = KCDatabase.Instance.MasterShips[shipID]; DroppedShipCount++; var defaultSlot = ship.DefaultSlot; if (defaultSlot != null) { DroppedEquipmentCount += defaultSlot.Count(id => id != -1); } if (showLog) { Utility.Logger.Add(2, string.Format("{0}「{1}」が戦列に加わりました。", ship.ShipTypeName, ship.NameWithClass)); } } if (itemID != -1) { if (!DroppedItemCount.ContainsKey(itemID)) { DroppedItemCount.Add(itemID, 0); } DroppedItemCount[itemID]++; if (showLog) { var item = KCDatabase.Instance.UseItems[itemID]; var itemmaster = KCDatabase.Instance.MasterUseItems[itemID]; Utility.Logger.Add(2, string.Format("アイテム「{0}」を入手しました。( 合計: {1}個 )", itemmaster?.Name ?? ("不明なアイテム - ID:" + itemID), (item?.Count ?? 0) + DroppedItemCount[itemID])); } } if (eqID != -1) { EquipmentDataMaster eq = KCDatabase.Instance.MasterEquipments[eqID]; DroppedEquipmentCount++; if (showLog) { Utility.Logger.Add(2, string.Format("{0}「{1}」を入手しました。", eq.CategoryTypeInstance.Name, eq.Name)); } } // 満員判定 if (shipID == -1 && ( KCDatabase.Instance.Admiral.MaxShipCount - (KCDatabase.Instance.Ships.Count + DroppedShipCount) <= 0 || KCDatabase.Instance.Admiral.MaxEquipmentCount - (KCDatabase.Instance.Equipments.Count + DroppedEquipmentCount) <= 0)) { shipID = -2; } RecordManager.Instance.ShipDrop.Add(shipID, itemID, eqID, Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, Compass.MapInfo.EventDifficulty, Compass.EventID == 5, enemyFleetData.FleetID, Result.Rank, KCDatabase.Instance.Admiral.Level); } void IncrementSpecialAttack(BattleData bd) { if (bd == null) { return; } foreach (var phase in bd.GetPhases()) { foreach (var detail in phase.BattleDetails) { int kind = detail.AttackType; if (detail.AttackerIndex.IsFriend && TracedSpecialAttack.Contains(kind)) { if (SpecialAttackCount.ContainsKey(kind)) { SpecialAttackCount[kind]++; } else { SpecialAttackCount.Add(kind, 1); } } } } } IncrementSpecialAttack(FirstBattle); IncrementSpecialAttack(SecondBattle); WriteBattleLog(); /*//DEBUG * if (!IsBaseAirRaid && Utility.Configuration.Config.Log.LogLevel <= 1) * { * var battle = SecondBattle ?? FirstBattle; * * for (int i = 0; i < battle.Initial.EnemyMaxHPs.Length; i++) * { * if (battle.Initial.EnemyMaxHPs[i] > 0 && battle.ResultHPs[BattleIndex.Get(BattleSides.EnemyMain, i)] == 0) * Utility.Logger.Add(1, "justkill #" + (i + 1)); * } * * int rank = PredictWinRank(out var friend, out var enemy); * * // SS -> S * if (Constants.GetWinRank(rank).Substring(0, 1) != Result.Rank) * { * Utility.Logger.Add(1, $"勝利ランク予測が誤っています。予想 {Constants.GetWinRank(rank)} -> 実際 {Result.Rank}"); * } * } * //*/ }
/// <summary> /// 戦闘終了時に各種データの収集を行います。 /// </summary> private void BattleFinished() { //敵編成記録 EnemyFleetRecord.EnemyFleetElement enemyFleetData = EnemyFleetRecord.EnemyFleetElement.CreateFromCurrentState(); if (enemyFleetData != null) { RecordManager.Instance.EnemyFleet.Update(enemyFleetData); } // ロギング if (IsPractice) { Utility.Logger.Add(2, string.Format("Practiced with {1} {0}'s {2} fleet (Rank: {3}, Admiral exp+{4}, Ship exp+{5}).", EnemyAdmiralName, EnemyAdmiralRank, Result.EnemyFleetName, Result.Rank, Result.AdmiralExp, Result.BaseExp)); } else if (IsBaseAirRaid) { var initialHPs = BattleDay.Initial.FriendInitialHPs.TakeWhile(hp => hp >= 0); var damage = initialHPs.Zip(BattleDay.ResultHPs.Take(initialHPs.Count()), (initial, result) => initial - result).Sum(); var airraid = ((BattleBaseAirRaid)BattleDay).BaseAirRaid; Utility.Logger.Add(2, string.Format("Encountered air raid at {0}-{1}-{2} ({3}, Damage taken: {4}, {5}).", Compass.MapAreaID, Compass.MapInfoID, Compass.DestinationID, Constants.GetAirSuperiority(airraid.IsAvailable ? airraid.AirSuperiority : -1), damage, Constants.GetAirRaidDamage(Compass.AirRaidDamageKind))); } else { Utility.Logger.Add(2, string.Format("Battled with 「{3}」 in {0}-{1}-{2} (Rank: {4}, Admiral exp+{5}, Ship exp+{6}).", Compass.MapAreaID, Compass.MapInfoID, Compass.DestinationID, Result.EnemyFleetName, Result.Rank, Result.AdmiralExp, Result.BaseExp)); } // Level up if (!IsBaseAirRaid) { var exps = Result.ExpList; var lvup = Result.LevelUpList; for (int i = 0; i < lvup.Length; i++) { if (lvup[i].Length >= 2 && i < exps.Length && lvup[i][0] + exps[i] >= lvup[i][1]) { var ship = FirstBattle.Initial.FriendFleet.MembersInstance[i]; int increment = Math.Max(lvup[i].Length - 2, 1); Utility.Logger.Add(2, string.Format("{0} has leveled up to lv{1}.", ship.Name, ship.Level + increment)); } } if (IsCombinedBattle) { exps = Result.ExpListCombined; lvup = Result.LevelUpListCombined; for (int i = 0; i < lvup.Length; i++) { if (lvup[i].Length >= 2 && i < exps.Length && lvup[i][0] + exps[i] >= lvup[i][1]) { var ship = FirstBattle.Initial.FriendFleetEscort.MembersInstance[i]; int increment = Math.Max(lvup[i].Length - 2, 1); Utility.Logger.Add(2, string.Format("{0} has leveled up to lv{1}.", ship.Name, ship.Level + increment)); } } } } //ドロップ艦記録 if (!IsPractice && !IsBaseAirRaid) { //checkme: とてもアレな感じ int shipID = Result.DroppedShipID; int itemID = Result.DroppedItemID; int eqID = Result.DroppedEquipmentID; bool showLog = Utility.Configuration.Config.Log.ShowSpoiler; if (shipID != -1) { ShipDataMaster ship = KCDatabase.Instance.MasterShips[shipID]; DroppedShipCount++; var defaultSlot = ship.DefaultSlot; if (defaultSlot != null) { DroppedEquipmentCount += defaultSlot.Count(id => id != -1); } if (showLog) { Utility.Logger.Add(2, string.Format(LoggerRes.ShipAdded, ship.ShipTypeName, ship.NameWithClass)); } } if (itemID != -1) { if (!DroppedItemCount.ContainsKey(itemID)) { DroppedItemCount.Add(itemID, 0); } DroppedItemCount[itemID]++; if (showLog) { var item = KCDatabase.Instance.UseItems[itemID]; var itemmaster = KCDatabase.Instance.MasterUseItems[itemID]; Utility.Logger.Add(2, string.Format(LoggerRes.ItemObtained, itemmaster?.Name ?? ("Unknown item - ID: " + itemID), (item?.Count ?? 0) + DroppedItemCount[itemID])); } } if (eqID != -1) { EquipmentDataMaster eq = KCDatabase.Instance.MasterEquipments[eqID]; DroppedEquipmentCount++; if (showLog) { Utility.Logger.Add(2, string.Format(LoggerRes.EquipmentObtained, eq.CategoryTypeInstance.Name, eq.Name)); } } // 満員判定 if (shipID == -1 && ( KCDatabase.Instance.Admiral.MaxShipCount - (KCDatabase.Instance.Ships.Count + DroppedShipCount) <= 0 || KCDatabase.Instance.Admiral.MaxEquipmentCount - (KCDatabase.Instance.Equipments.Count + DroppedEquipmentCount) <= 0)) { shipID = -2; } RecordManager.Instance.ShipDrop.Add(shipID, itemID, eqID, Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, Compass.MapInfo.EventDifficulty, Compass.EventID == 5, enemyFleetData.FleetID, Result.Rank, KCDatabase.Instance.Admiral.Level); } WriteBattleLog(); /*//DEBUG * if (!IsBaseAirRaid && Utility.Configuration.Config.Log.LogLevel <= 1) * { * var battle = SecondBattle ?? FirstBattle; * * for (int i = 0; i < battle.Initial.EnemyMaxHPs.Length; i++) * { * if (battle.Initial.EnemyMaxHPs[i] > 0 && battle.ResultHPs[BattleIndex.Get(BattleSides.EnemyMain, i)] == 0) * Utility.Logger.Add(1, "justkill #" + (i + 1)); * } * * int rank = PredictWinRank(out var friend, out var enemy); * * // SS -> S * if (Constants.GetWinRank(rank).Substring(0, 1) != Result.Rank) * { * Utility.Logger.Add(1, $"勝利ランク予測が誤っています。予想 {Constants.GetWinRank(rank)} -> 実際 {Result.Rank}"); * } * } * //*/ }
/// <summary> /// 戦闘終了時に各種データの収集を行います。 /// </summary> private void BattleFinished() { //敵編成記録 EnemyFleetRecord.EnemyFleetElement enemyFleetData = EnemyFleetRecord.EnemyFleetElement.CreateFromCurrentState(); if (enemyFleetData != null) RecordManager.Instance.EnemyFleet.Update(enemyFleetData); // ロギング if (IsPractice) { Utility.Logger.Add(2, string.Format("演習 で「{0}」{1}の「{2}」と交戦しました。( ランク: {3}, 提督Exp+{4}, 艦娘Exp+{5} )", EnemyAdmiralName, EnemyAdmiralRank, Result.EnemyFleetName, Result.Rank, Result.AdmiralExp, Result.BaseExp)); } else { Utility.Logger.Add(2, string.Format("{0}-{1}-{2} で「{3}」と交戦しました。( ランク: {4}, 提督Exp+{5}, 艦娘Exp+{6} )", Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, Result.EnemyFleetName, Result.Rank, Result.AdmiralExp, Result.BaseExp)); } // Level up { var exps = Result.ExpList; var lvup = Result.LevelUpList; for (int i = 0; i < lvup.Length; i++) { if (lvup[i].Length >= 2 && lvup[i][0] + exps[i] >= lvup[i][1]) { var ship = FirstBattle.Initial.FriendFleet.MembersInstance[i]; int increment = Math.Max(lvup[i].Length - 2, 1); Utility.Logger.Add(2, string.Format("{0} が Lv. {1} になりました。", ship.Name, ship.Level + increment)); } } if (IsCombinedBattle) { exps = Result.ExpListCombined; lvup = Result.LevelUpListCombined; for (int i = 0; i < lvup.Length; i++) { if (lvup[i].Length >= 2 && lvup[i][0] + exps[i] >= lvup[i][1]) { var ship = FirstBattle.Initial.FriendFleetEscort.MembersInstance[i]; int increment = Math.Max(lvup[i].Length - 2, 1); Utility.Logger.Add(2, string.Format("{0} が Lv. {1} になりました。", ship.Name, ship.Level + increment)); } } } } //ドロップ艦記録 if (!IsPractice) { //checkme: とてもアレな感じ int shipID = Result.DroppedShipID; int itemID = Result.DroppedItemID; int eqID = Result.DroppedEquipmentID; bool showLog = Utility.Configuration.Config.Log.ShowSpoiler; if (shipID != -1) { ShipDataMaster ship = KCDatabase.Instance.MasterShips[shipID]; DroppedShipCount++; var defaultSlot = ship.DefaultSlot; if (defaultSlot != null) DroppedEquipmentCount += defaultSlot.Count(id => id != -1); if (showLog) Utility.Logger.Add(2, string.Format("{0}「{1}」が戦列に加わりました。", ship.ShipTypeName, ship.NameWithClass)); } if (itemID != -1) { if (!DroppedItemCount.ContainsKey(itemID)) DroppedItemCount.Add(itemID, 0); DroppedItemCount[itemID]++; if (showLog) { var item = KCDatabase.Instance.UseItems[itemID]; var itemmaster = KCDatabase.Instance.MasterUseItems[itemID]; Utility.Logger.Add(2, string.Format("アイテム「{0}」を入手しました。( 合計: {1}個 )", itemmaster?.Name ?? ("不明なアイテム - ID:" + itemID), (item?.Count ?? 0) + DroppedItemCount[itemID])); } } if (eqID != -1) { EquipmentDataMaster eq = KCDatabase.Instance.MasterEquipments[eqID]; DroppedEquipmentCount++; if (showLog) { Utility.Logger.Add(2, string.Format("{0}「{1}」を入手しました。", eq.CategoryTypeInstance.Name, eq.Name)); } } // 満員判定 if (shipID == -1 && ( KCDatabase.Instance.Admiral.MaxShipCount - (KCDatabase.Instance.Ships.Count + DroppedShipCount) <= 0 || KCDatabase.Instance.Admiral.MaxEquipmentCount - (KCDatabase.Instance.Equipments.Count + DroppedEquipmentCount) <= 0)) { shipID = -2; } RecordManager.Instance.ShipDrop.Add(shipID, itemID, eqID, Compass.MapAreaID, Compass.MapInfoID, Compass.Destination, Compass.MapInfo.EventDifficulty, Compass.EventID == 5, enemyFleetData.FleetID, Result.Rank, KCDatabase.Instance.Admiral.Level); } WriteBattleLog(); //DEBUG /*/ if ( Utility.Configuration.Config.Log.LogLevel <= 1 && Utility.Configuration.Config.Connection.SaveReceivedData ) { IEnumerable<int> damages; switch ( BattleMode & BattleModes.BattlePhaseMask ) { case BattleModes.Normal: case BattleModes.AirBattle: case BattleModes.Practice: default: damages = ( (BattleData)BattleNight ?? BattleDay ).AttackDamages; break; case BattleModes.NightOnly: case BattleModes.NightDay: damages = ( (BattleData)BattleDay ?? BattleNight ).AttackDamages; break; } damages = damages.Take( 6 ).Where( i => i > 0 ); if ( damages.Count( i => i == damages.Max() ) > 1 ) { Utility.Logger.Add( 1, "MVP候補が複数存在します。ログを確認してください。" ); } } //*/ }