/// <summary> /// 敵連合艦隊戦において、夜戦突入時に敵本隊と戦闘可能な戦況かどうか /// </summary> public bool WillNightBattleWithMainFleet() { if (StartsFromDayBattle && IsEnemyCombined) { var initial = BattleDay.Initial; int score = 0; for (int i = 0; i < initial.EnemyInitialHPsEscort.Length; i++) { if (initial.EnemyMembersEscort[i] > 0) { double rate = (double)BattleDay.ResultHPs[BattleIndex.Get(BattleSides.EnemyEscort, i)] / initial.EnemyMaxHPsEscort[i]; if (rate > 0.5) { score += 10; } else if (rate > 0.25) { score += 7; } if (i == 0 && rate > 0) { score += 10; } } } return(score < 30); } else { return(false); // ? true? } }
/// <summary> /// 勝利ランクを予測します。 /// </summary> /// <param name="friendrate">味方の損害率を出力します。</param> /// <param name="enemyrate">敵の損害率を出力します。</param> public int PredictWinRank(out double friendrate, out double enemyrate) { int friendbefore = 0; int friendafter = 0; int friendcount = 0; int friendsunk = 0; int enemybefore = 0; int enemyafter = 0; int enemycount = 0; int enemysunk = 0; BattleData activeBattle = SecondBattle ?? FirstBattle; var firstInitial = FirstBattle.Initial; var friend = activeBattle.Initial.FriendFleet.MembersWithoutEscaped; var friendescort = activeBattle.Initial.FriendFleetEscort?.MembersWithoutEscaped; var resultHPs = activeBattle.ResultHPs; for (int i = 0; i < firstInitial.FriendInitialHPs.Length; i++) { int initial = firstInitial.FriendInitialHPs[i]; if (initial < 0) { continue; } int result = resultHPs[BattleIndex.Get(BattleSides.FriendMain, i)]; friendbefore += initial; friendafter += Math.Max(result, 0); friendcount++; if (result <= 0) { friendsunk++; } } if (firstInitial.FriendInitialHPsEscort != null) { for (int i = 0; i < firstInitial.FriendInitialHPsEscort.Length; i++) { int initial = firstInitial.FriendInitialHPsEscort[i]; if (initial < 0) { continue; } int result = resultHPs[BattleIndex.Get(BattleSides.FriendEscort, i)]; friendbefore += initial; friendafter += Math.Max(result, 0); friendcount++; if (result <= 0) { friendsunk++; } } } for (int i = 0; i < firstInitial.EnemyInitialHPs.Length; i++) { int initial = firstInitial.EnemyInitialHPs[i]; if (initial < 0) { continue; } int result = resultHPs[BattleIndex.Get(BattleSides.EnemyMain, i)]; enemybefore += initial; enemyafter += Math.Max(result, 0); enemycount++; if (result <= 0) { enemysunk++; } } if (firstInitial.EnemyInitialHPsEscort != null) { for (int i = 0; i < firstInitial.EnemyInitialHPsEscort.Length; i++) { int initial = firstInitial.EnemyInitialHPsEscort[i]; if (initial < 0) { continue; } int result = resultHPs[BattleIndex.Get(BattleSides.EnemyEscort, i)]; enemybefore += initial; enemyafter += Math.Max(result, 0); enemycount++; if (result <= 0) { enemysunk++; } } } friendrate = (double)(friendbefore - friendafter) / friendbefore; enemyrate = (double)(enemybefore - enemyafter) / enemybefore; if ((BattleMode & BattleModes.BattlePhaseMask) == BattleModes.AirRaid) { return(GetWinRankAirRaid(friendcount, friendsunk, friendrate)); } else { return(GetWinRank(friendcount, enemycount, friendsunk, enemysunk, friendrate, enemyrate, friend[0].HPRate <= 0.25, resultHPs[BattleIndex.EnemyMain1] <= 0)); } }