Inheritance: ModelBase
Exemple #1
0
        void InheritFromPreviousStage(BattleStage rpStage)
        {
            if (rpStage.FriendEscort == null)
            {
                for (var i = 0; i < rpStage.FriendMain.Count; i++)
                {
                    rpStage.FriendMain[i].DamageGivenToOpponent += CurrentStage.FriendMain[i].DamageGivenToOpponent;
                    rpStage.FriendMain[i].Inaccurate             = CurrentStage.FriendMain[i].Inaccurate;
                }
            }

            for (var i = 0; i < rpStage.Enemy.Count; i++)
            {
                rpStage.Enemy[i].DamageGivenToOpponent += CurrentStage.Enemy[i].DamageGivenToOpponent;
            }

            if (rpStage.FriendEscort != null)
            {
                for (var i = 0; i < rpStage.FriendEscort.Count; i++)
                {
                    rpStage.FriendEscort[i].DamageGivenToOpponent += CurrentStage.FriendEscort[i].DamageGivenToOpponent;
                    rpStage.FriendEscort[i].Inaccurate             = CurrentStage.FriendEscort[i].Inaccurate;
                }
            }
        }
        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 Process(ApiInfo rpInfo, BattleStage rpFirstStage = null)
        {
            var rData = rpInfo.Data as RawBattleBase;
            var rCombinedFleetData = rData as IRawCombinedFleet;

            FriendAndEnemy = new BattleParticipantSnapshot[rCombinedFleetData == null ? 12 : 24];

            for (var i = 1; i < rData.CurrentHPs.Length; i++)
                if (rData.MaximumHPs[i] != -1)
                    FriendAndEnemy[i - 1] = new BattleParticipantSnapshot(rData.MaximumHPs[i], rData.CurrentHPs[i]);

            FriendMain = FriendAndEnemy.Take(6).TakeWhile(r => r != null).ToArray();
            for (var i = 0; i < FriendMain.Count; i++)
                FriendMain[i].Participant = Owner.Participants.FriendMain[i];

            EnemyMain = FriendAndEnemy.Skip(6).TakeWhile(r => r != null).ToArray();
            for (var i = 0; i < EnemyMain.Count; i++)
                EnemyMain[i].Participant = Owner.Participants.EnemyMain[i];

            if (rCombinedFleetData != null)
            {
                BattleParticipantSnapshot[] rFriendAndEnemyEscort;

                if (rpFirstStage == null)
                    rFriendAndEnemyEscort = rCombinedFleetData.EscortFleetCurrentHPs.Zip(rCombinedFleetData.EscortFleetMaximumHPs,
                        (rpCurrent, rpMaximum) => rpMaximum != -1 ? new BattleParticipantSnapshot(rpMaximum, rpCurrent) : null).Skip(1).ToArray();
                else
                {
                    IEnumerable<BattleParticipantSnapshot> rFriendEscort = rpFirstStage.FriendEscort;
                    if (rFriendEscort == null)
                        rFriendEscort = Enumerable.Repeat<BattleParticipantSnapshot>(null, 6);

                    IEnumerable<BattleParticipantSnapshot> rEnemyEscort = rpFirstStage.EnemyEscort;
                    if (rEnemyEscort == null)
                        rEnemyEscort = Enumerable.Repeat<BattleParticipantSnapshot>(null, 6);

                    rFriendAndEnemyEscort = rFriendEscort.Concat(rEnemyEscort).Select(r => r != null ? new BattleParticipantSnapshot(r.Maximum, r.Current) : null).ToArray();
                }

                if (rFriendAndEnemyEscort[0] != null)
                {
                    FriendEscort = rFriendAndEnemyEscort.Take(6).TakeWhile(r => r != null).ToArray();

                    for (var i = 0; i < FriendEscort.Count; i++)
                    {
                        FriendEscort[i].Participant = Owner.Participants.FriendEscort[i];
                        FriendAndEnemy[i + 12] = FriendEscort[i];
                    }
                }

                if ((rpFirstStage == null && rFriendAndEnemyEscort.Length > 6) || (rpFirstStage != null && rpFirstStage.EnemyEscort != null))
                {
                    EnemyEscort = rFriendAndEnemyEscort.Skip(6).ToArray();

                    for (var i = 0; i < EnemyEscort.Count; i++)
                    {
                        EnemyEscort[i].Participant = Owner.Participants.EnemyEscort[i];
                        FriendAndEnemy[i + 18] = EnemyEscort[i];
                    }
                }
            }

            if (FriendEscort == null)
                Friend = FriendMain;
            else
                Friend = FriendMain.Concat(FriendEscort).ToArray();

            if (EnemyEscort == null)
                Enemy = EnemyMain;
            else
                Enemy = EnemyMain.Concat(EnemyEscort).ToArray();

            foreach (var rPhase in Phases)
                rPhase.Process();

            if (!Owner.IsPractice)
                foreach (var rSnapshot in Friend)
                {
                    var rParticipant = (FriendShip)rSnapshot.Participant;
                    if (rSnapshot.State == BattleParticipantState.HeavilyDamaged && rParticipant.EquipedEquipment.Any(r => r.Info.Type == EquipmentType.DamageControl))
                    {
                        rParticipant.IsDamageControlConsumed = false;
                        rParticipant.IsDamageControlVisible = true;
                    }
                }
        }
        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);
        }
Exemple #5
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));
        }
Exemple #6
0
        internal void Process(ApiInfo rpInfo, BattleStage rpFirstStage = null)
        {
            var rData = rpInfo.Data as RawBattleBase;
            var rCombinedFleetData = rData as IRawCombinedFleet;

            FriendAndEnemy = new BattleParticipantSnapshot[rCombinedFleetData == null ? 12 : 24];

            for (var i = 1; i < rData.CurrentHPs.Length; i++)
            {
                if (rData.MaximumHPs[i] != -1)
                {
                    FriendAndEnemy[i - 1] = new BattleParticipantSnapshot(rData.MaximumHPs[i], rData.CurrentHPs[i]);
                }
            }

            FriendMain = FriendAndEnemy.Take(6).TakeWhile(r => r != null).ToArray();
            for (var i = 0; i < FriendMain.Count; i++)
            {
                FriendMain[i].Participant = Owner.Participants.FriendMain[i];
            }

            EnemyMain = FriendAndEnemy.Skip(6).TakeWhile(r => r != null).ToArray();
            for (var i = 0; i < EnemyMain.Count; i++)
            {
                EnemyMain[i].Participant = Owner.Participants.EnemyMain[i];
            }

            if (rCombinedFleetData != null)
            {
                BattleParticipantSnapshot[] rFriendAndEnemyEscort;

                if (rpFirstStage == null)
                {
                    rFriendAndEnemyEscort = rCombinedFleetData.EscortFleetCurrentHPs.Zip(rCombinedFleetData.EscortFleetMaximumHPs,
                                                                                         (rpCurrent, rpMaximum) => rpMaximum != -1 ? new BattleParticipantSnapshot(rpMaximum, rpCurrent) : null).Skip(1).ToArray();
                }
                else
                {
                    IEnumerable <BattleParticipantSnapshot> rFriendEscort = rpFirstStage.FriendEscort;
                    if (rFriendEscort == null)
                    {
                        rFriendEscort = Enumerable.Repeat <BattleParticipantSnapshot>(null, 6);
                    }

                    IEnumerable <BattleParticipantSnapshot> rEnemyEscort = rpFirstStage.EnemyEscort;
                    if (rEnemyEscort == null)
                    {
                        rEnemyEscort = Enumerable.Repeat <BattleParticipantSnapshot>(null, 6);
                    }

                    rFriendAndEnemyEscort = rFriendEscort.Concat(rEnemyEscort).Select(r => r != null ? new BattleParticipantSnapshot(r.Maximum, r.Current) : null).ToArray();
                }

                if (rFriendAndEnemyEscort[0] != null)
                {
                    FriendEscort = rFriendAndEnemyEscort.Take(6).TakeWhile(r => r != null).ToArray();

                    for (var i = 0; i < FriendEscort.Count; i++)
                    {
                        FriendEscort[i].Participant = Owner.Participants.FriendEscort[i];
                        FriendAndEnemy[i + 12]      = FriendEscort[i];
                    }
                }

                if ((rpFirstStage == null && rFriendAndEnemyEscort.Length > 6) || (rpFirstStage != null && rpFirstStage.EnemyEscort != null))
                {
                    EnemyEscort = rFriendAndEnemyEscort.Skip(6).ToArray();

                    for (var i = 0; i < EnemyEscort.Count; i++)
                    {
                        EnemyEscort[i].Participant = Owner.Participants.EnemyEscort[i];
                        FriendAndEnemy[i + 18]     = EnemyEscort[i];
                    }
                }
            }

            if (FriendEscort == null)
            {
                Friend = FriendMain;
            }
            else
            {
                Friend = FriendMain.Concat(FriendEscort).ToArray();
            }

            if (EnemyEscort == null)
            {
                Enemy = EnemyMain;
            }
            else
            {
                Enemy = EnemyMain.Concat(EnemyEscort).ToArray();
            }

            foreach (var rPhase in Phases)
            {
                rPhase.Process();
            }

            if (!Owner.IsPractice)
            {
                foreach (var rSnapshot in Friend)
                {
                    var rParticipant = (FriendShip)rSnapshot.Participant;
                    if (rSnapshot.State == BattleParticipantState.HeavilyDamaged && rParticipant.EquipedEquipment.Any(r => r.Info.Type == EquipmentType.DamageControl))
                    {
                        rParticipant.IsDamageControlConsumed = false;
                        rParticipant.IsDamageControlVisible  = true;
                    }
                }
            }
        }
        void InheritFromPreviousStage(BattleStage rpStage)
        {
            if (rpStage.FriendEscort == null)
                for (var i = 0; i < rpStage.FriendMain.Count; i++)
                {
                    rpStage.FriendMain[i].DamageGivenToOpponent += CurrentStage.FriendMain[i].DamageGivenToOpponent;
                    rpStage.FriendMain[i].Inaccurate = CurrentStage.FriendMain[i].Inaccurate;
                }

            for (var i = 0; i < rpStage.Enemy.Count; i++)
                rpStage.Enemy[i].DamageGivenToOpponent += CurrentStage.Enemy[i].DamageGivenToOpponent;

            if (rpStage.FriendEscort != null)
                for (var i = 0; i < rpStage.FriendEscort.Count; i++)
                {
                    rpStage.FriendEscort[i].DamageGivenToOpponent += CurrentStage.FriendEscort[i].DamageGivenToOpponent;
                    rpStage.FriendEscort[i].Inaccurate = CurrentStage.FriendEscort[i].Inaccurate;
                }
        }
Exemple #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);
        }