예제 #1
0
        /// <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));
            }
        }