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); }
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; } } } }
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 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); }