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