Example #1
0
        private Color GetRankColor(BattleRank ResultRank)
        {
            switch (ResultRank)
            {
            case BattleRank.에러: return(Color.Red);

            case BattleRank.완전승리S: return(Color.FromArgb(0xFF, 0xE5, 0x58));

            case BattleRank.S승리: return(Color.Gold);

            case BattleRank.A승리: return(Color.FromArgb(0xD1, 0x00, 0x00));

            case BattleRank.B승리: return(Color.FromArgb(0xD4, 0x33, 0x53));

            case BattleRank.C패배: return(Color.FromArgb(0x42, 0x42, 0x8F));

            case BattleRank.D패배: return(Color.FromArgb(0x42, 0x42, 0x8F));

            case BattleRank.E패배: return(Color.FromArgb(0x42, 0x42, 0x8F));

            case BattleRank.공습전: return(Color.FromArgb(0x52, 0xA6, 0x61));

            case BattleRank.없음:
            default:
                return(Color.Transparent);
            }
        }
        internal void Update(BattleStage rpFirst, BattleStage rpSecond)
        {
            var rCurrentStage = rpSecond ?? rpFirst;

            var rEnemyTotalHPBefore = (double)rpFirst.Enemy.Sum(r => r.Before);
            var rFriendTotalHPBefore = (double)rpFirst.FriendMain.Sum(r => r.Before);

            if (rpFirst.FriendEscort != null)
                rFriendTotalHPBefore += rpFirst.FriendEscort.Sum(r => r.Before);

            var rEnemyFinalSnapshot = rpSecond == null ? rpFirst.Enemy : rpSecond.Enemy;
            var rEnemyTotalHPAfter = (double)rEnemyFinalSnapshot.Sum(r => Math.Max(r.Current, 0));

            var rFriendTotalHPAfter = (double)(rpSecond == null ? rpFirst.FriendMain : rpSecond.FriendMain ?? rpFirst.FriendMain).Sum(r => Math.Max(r.Current, 0));

            var rFriendEscortFinalSnapshot = rpSecond == null ? rpFirst.FriendEscort : rpSecond.FriendEscort ?? rpFirst.FriendEscort;
            if (rFriendEscortFinalSnapshot != null)
                rFriendTotalHPAfter += rFriendEscortFinalSnapshot.Sum(r => Math.Max(r.Current, 0));

            FriendDamageRate = (rFriendTotalHPBefore - rFriendTotalHPAfter) / rFriendTotalHPBefore * 100;
            EnemyDamageRate = (rEnemyTotalHPBefore - rEnemyTotalHPAfter) / rEnemyTotalHPBefore * 100;

            var rEnemySunkCount = rEnemyFinalSnapshot.Count(r => r.State == BattleParticipantState.Sunk);
            var rIsEnemyFlagshipSunk = rEnemyFinalSnapshot[0].State == BattleParticipantState.Sunk;

            if (rCurrentStage is AerialAttackStage)
            {
                if (FriendDamageRate == .0)
                    Rank = BattleRank.SS;
                else if (FriendDamageRate < 10.0)
                    Rank = BattleRank.A;
                else if (FriendDamageRate < 20.0)
                    Rank = BattleRank.B;
                else if (FriendDamageRate < 50.0)
                    Rank = BattleRank.C;
                else if (FriendDamageRate < 80.0)
                    Rank = BattleRank.D;
                else
                    Rank = BattleRank.E;
            }
            else
            {
                if (EnemyDamageRate >= 100)
                    Rank = FriendDamageRate <= 0 ? BattleRank.SS : BattleRank.S;
                else if (rEnemySunkCount >= Math.Round(rEnemyFinalSnapshot.Count * 0.6))
                    Rank = BattleRank.A;
                else if (rIsEnemyFlagshipSunk || EnemyDamageRate > FriendDamageRate * 2.5)
                    Rank = BattleRank.B;
                else if (EnemyDamageRate > FriendDamageRate || EnemyDamageRate >= 50.0)
                    Rank = BattleRank.C;
                else
                    Rank = BattleRank.D;
            }

            OnPropertyChanged(nameof(FriendDamageRate));
            OnPropertyChanged(nameof(EnemyDamageRate));
            OnPropertyChanged(nameof(Rank));
        }
        internal void Update(BattleStage rpFirst, BattleStage rpSecond)
        {
            var rCurrentStage = rpSecond ?? rpFirst;

            var rFriendInitialTotalHP = 0;
            var rFriendTotalHP = 0;
            var rFriendCount = rpFirst.Friend.Count;
            var rFriendSunkCount = 0;

            for (var i = 0; i < rFriendCount; i++)
            {
                if (rpFirst.Friend[i].IsEvacuated)
                    continue;

                if (rCurrentStage.Friend[i].Current <= 0)
                    rFriendSunkCount++;

                rFriendInitialTotalHP += rpFirst.Friend[i].Before;
                rFriendTotalHP += Math.Max(rCurrentStage.Friend[i].Current, 0);
            }
            var rEnemyInitialTotalHP = 0;
            var rEnemyTotalHP = 0;
            var rEnemyCount = rpFirst.Enemy.Count;
            var rEnemySunkCount = 0;
            var rIsEnemyFlagshipSunk = rCurrentStage.Enemy[0].Current <= 0;

            for (var i = 0; i < rEnemyCount; i++)
            {
                if (rCurrentStage.Enemy[i].Current <= 0)
                    rEnemySunkCount++;

                rEnemyInitialTotalHP += rpFirst.Enemy[i].Before;
                rEnemyTotalHP += Math.Max(rCurrentStage.Enemy[i].Current, 0);
            }

            FriendDamageRate = (rFriendInitialTotalHP - rFriendTotalHP) / (double)rFriendInitialTotalHP * 100.0;
            EnemyDamageRate = (rEnemyInitialTotalHP - rEnemyTotalHP) / (double)rEnemyInitialTotalHP * 100.0;

            if (rCurrentStage is AerialAttackStage)
            {
                if (FriendDamageRate == .0)
                    Rank = BattleRank.SS;
                else if (FriendDamageRate < 10.0)
                    Rank = BattleRank.A;
                else if (FriendDamageRate < 20.0)
                    Rank = BattleRank.B;
                else if (FriendDamageRate < 50.0)
                    Rank = BattleRank.C;
                else if (FriendDamageRate < 80.0)
                    Rank = BattleRank.D;
                else
                    Rank = BattleRank.E;
            }
            else
            {
                if (rFriendSunkCount == 0 && rEnemySunkCount == rEnemyCount)
                    Rank = FriendDamageRate <= .0 ? BattleRank.SS : BattleRank.S;
                else if (rFriendSunkCount == 0 && rEnemySunkCount >= (int)(rEnemyCount * .7))
                    Rank = BattleRank.A;
                else if ((rFriendSunkCount < rEnemySunkCount && rIsEnemyFlagshipSunk) || EnemyDamageRate > FriendDamageRate * 2.5)
                    Rank = BattleRank.B;
                else if (EnemyDamageRate > FriendDamageRate * .9)
                    Rank = BattleRank.C;
                else if (rFriendCount == 1 && rCurrentStage.Friend[0].State == BattleParticipantState.HeavilyDamaged)
                    Rank = BattleRank.D;
                else if (rFriendCount > 1 && rFriendSunkCount == rFriendCount - 1)
                    Rank = BattleRank.E;
                else
                    Rank = BattleRank.D;
            }

            OnPropertyChanged(string.Empty);
        }
 protected BossTargetProgress(int[] rpMapIDs, BattleRank rpLowestRank)
 {
     MapIDs = rpMapIDs == null ? null : new HashSet<int>(rpMapIDs);
     LowestRank = rpLowestRank;
 }
 protected BossTargetWithRequirement(int[] rpMapIDs, BattleRank rpLowestRank)
     : base(rpMapIDs, rpLowestRank)
 {
 }
Example #6
0
        internal void Update(BattleStage rpFirst, BattleStage rpSecond)
        {
            var rCurrentStage = rpSecond ?? rpFirst;

            var rEnemyTotalHPBefore  = (double)rpFirst.Enemy.Sum(r => r.Before);
            var rFriendTotalHPBefore = (double)rpFirst.FriendMain.Sum(r => r.Before);

            if (rpFirst.FriendEscort != null)
            {
                rFriendTotalHPBefore += rpFirst.FriendEscort.Sum(r => r.Before);
            }

            var rEnemyFinalSnapshot = rpSecond == null ? rpFirst.Enemy : rpSecond.Enemy;
            var rEnemyTotalHPAfter  = (double)rEnemyFinalSnapshot.Sum(r => Math.Max(r.Current, 0));

            var rFriendTotalHPAfter = (double)(rpSecond == null ? rpFirst.FriendMain : rpSecond.FriendMain ?? rpFirst.FriendMain).Sum(r => Math.Max(r.Current, 0));

            var rFriendEscortFinalSnapshot = rpSecond == null ? rpFirst.FriendEscort : rpSecond.FriendEscort ?? rpFirst.FriendEscort;

            if (rFriendEscortFinalSnapshot != null)
            {
                rFriendTotalHPAfter += rFriendEscortFinalSnapshot.Sum(r => Math.Max(r.Current, 0));
            }

            FriendDamageRate = (rFriendTotalHPBefore - rFriendTotalHPAfter) / rFriendTotalHPBefore * 100;
            EnemyDamageRate  = (rEnemyTotalHPBefore - rEnemyTotalHPAfter) / rEnemyTotalHPBefore * 100;

            var rEnemySunkCount      = rEnemyFinalSnapshot.Count(r => r.State == BattleParticipantState.Sunk);
            var rIsEnemyFlagshipSunk = rEnemyFinalSnapshot[0].State == BattleParticipantState.Sunk;

            if (rCurrentStage is AerialAttackStage)
            {
                if (FriendDamageRate == .0)
                {
                    Rank = BattleRank.SS;
                }
                else if (FriendDamageRate < 10.0)
                {
                    Rank = BattleRank.A;
                }
                else if (FriendDamageRate < 20.0)
                {
                    Rank = BattleRank.B;
                }
                else if (FriendDamageRate < 50.0)
                {
                    Rank = BattleRank.C;
                }
                else if (FriendDamageRate < 80.0)
                {
                    Rank = BattleRank.D;
                }
                else
                {
                    Rank = BattleRank.E;
                }
            }
            else
            {
                if (EnemyDamageRate >= 100)
                {
                    Rank = FriendDamageRate <= 0 ? BattleRank.SS : BattleRank.S;
                }
                else if (rEnemySunkCount >= Math.Round(rEnemyFinalSnapshot.Count * 0.6))
                {
                    Rank = BattleRank.A;
                }
                else if (rIsEnemyFlagshipSunk || EnemyDamageRate > FriendDamageRate * 2.5)
                {
                    Rank = BattleRank.B;
                }
                else if (EnemyDamageRate > FriendDamageRate || EnemyDamageRate >= 50.0)
                {
                    Rank = BattleRank.C;
                }
                else
                {
                    Rank = BattleRank.D;
                }
            }

            OnPropertyChanged(nameof(FriendDamageRate));
            OnPropertyChanged(nameof(EnemyDamageRate));
            OnPropertyChanged(nameof(Rank));
        }
 protected DefeatBoss(int[] rpMapIDs, BattleRank rpLowestRank)
 {
     MapIDs     = rpMapIDs == null ? null : new HashSet <int>(rpMapIDs);
     LowestRank = rpLowestRank;
 }
Example #8
0
        internal void Update(BattleStage rpFirst, BattleStage rpSecond)
        {
            var rCurrentStage = rpSecond ?? rpFirst;

            var rFriendInitialTotalHP = 0;
            var rFriendTotalHP        = 0;
            var rFriendCount          = rpFirst.Friend.Count;
            var rFriendSunkCount      = 0;

            for (var i = 0; i < rFriendCount; i++)
            {
                if (rpFirst.Friend[i].IsEvacuated)
                {
                    continue;
                }

                if (rCurrentStage.Friend[i].Current <= 0)
                {
                    rFriendSunkCount++;
                }

                rFriendInitialTotalHP += rpFirst.Friend[i].Before;
                rFriendTotalHP        += Math.Max(rCurrentStage.Friend[i].Current, 0);
            }
            var rEnemyInitialTotalHP = 0;
            var rEnemyTotalHP        = 0;
            var rEnemyCount          = rpFirst.Enemy.Count;
            var rEnemySunkCount      = 0;
            var rIsEnemyFlagshipSunk = rCurrentStage.Enemy[0].Current <= 0;

            for (var i = 0; i < rEnemyCount; i++)
            {
                if (rCurrentStage.Enemy[i].Current <= 0)
                {
                    rEnemySunkCount++;
                }

                rEnemyInitialTotalHP += rpFirst.Enemy[i].Before;
                rEnemyTotalHP        += Math.Max(rCurrentStage.Enemy[i].Current, 0);
            }

            FriendDamageRate = (rFriendInitialTotalHP - rFriendTotalHP) / (double)rFriendInitialTotalHP * 100.0;
            EnemyDamageRate  = (rEnemyInitialTotalHP - rEnemyTotalHP) / (double)rEnemyInitialTotalHP * 100.0;

            if (rCurrentStage is AerialAttackStage)
            {
                if (FriendDamageRate == .0)
                {
                    Rank = BattleRank.SS;
                }
                else if (FriendDamageRate < 10.0)
                {
                    Rank = BattleRank.A;
                }
                else if (FriendDamageRate < 20.0)
                {
                    Rank = BattleRank.B;
                }
                else if (FriendDamageRate < 50.0)
                {
                    Rank = BattleRank.C;
                }
                else if (FriendDamageRate < 80.0)
                {
                    Rank = BattleRank.D;
                }
                else
                {
                    Rank = BattleRank.E;
                }
            }
            else
            {
                if (rFriendSunkCount == 0 && rEnemySunkCount == rEnemyCount)
                {
                    Rank = FriendDamageRate <= .0 ? BattleRank.SS : BattleRank.S;
                }
                else if (rFriendSunkCount == 0 && rEnemySunkCount >= (int)(rEnemyCount * .7))
                {
                    Rank = BattleRank.A;
                }
                else if ((rFriendSunkCount < rEnemySunkCount && rIsEnemyFlagshipSunk) || EnemyDamageRate > FriendDamageRate * 2.5)
                {
                    Rank = BattleRank.B;
                }
                else if (EnemyDamageRate > FriendDamageRate * .9)
                {
                    Rank = BattleRank.C;
                }
                else if (rFriendCount == 1 && rCurrentStage.Friend[0].State == BattleParticipantState.HeavilyDamaged)
                {
                    Rank = BattleRank.D;
                }
                else if (rFriendCount > 1 && rFriendSunkCount == rFriendCount - 1)
                {
                    Rank = BattleRank.E;
                }
                else
                {
                    Rank = BattleRank.D;
                }
            }

            OnPropertyChanged(string.Empty);
        }
 protected DefeatBoss(int[] rpMapIDs, BattleRank rpLowestRank)
 {
     MapIDs = rpMapIDs == null ? null : new HashSet<int>(rpMapIDs);
     LowestRank = rpLowestRank;
 }