public string DamageReport(Force force, Force enemy, List<Effect> boosts, bool isEpicBoss, string prefix = "") { var sb = new StringBuilder(); sb.AppendFormat(prefix + "{0} [{1}]\r\n", Name, CalculateTotalDamageContribution(force, enemy, boosts, isEpicBoss).ToSimpleString()); foreach (var ability in Abilities) { sb.AppendFormat(prefix + " * {0} [{1}]\r\n", ability.Name, ability.CalculateTotalDamageContribution(this.ID, force, enemy, null, isEpicBoss).ToSimpleString()); foreach (var reinforcement in force.GetReinforcedUnits(ID)) { sb.AppendFormat(prefix + " * Reinforced - {0}", reinforcement.DamageReport(force, enemy, boosts, isEpicBoss, prefix + "\t ")); } if(ability.HasEffect(EffectType.Boost)) { sb.AppendFormat(prefix + " * Boosts units in this force for a total bonus of {0}\r\n", CalculateBoostToForce(force, enemy, isEpicBoss)); } if(ability.HasEffect(EffectType.Rally)) { sb.AppendFormat(prefix + " * Rallies units in this force for a total bonus of {0}\r\n", CalculateBoostToForce(force, enemy, isEpicBoss)); } } return sb.ToString(); }
public string DamageReport(Force force, Force enemy, List<Effect> boosts, bool isEpicBoss, string prefix = "", bool hideNamePrefix = false, double reinforcementRate = 0.0) { var sb = new StringBuilder(); if (reinforcementRate > 0.0) // TODO: Better fix for this { var contrib = CalculateTotalDamageContribution(force, enemy, boosts, isEpicBoss); sb.AppendFormat((hideNamePrefix ? "" : prefix) + "{0} [{1}] at {2}% = [{3}]\r\n", Name, contrib.ToSimpleString(), reinforcementRate * 100, contrib.AdjustToProcChance(reinforcementRate).ToSimpleString()); } else { sb.AppendFormat((hideNamePrefix ? "" : prefix) + "{0} [{1}]\r\n", Name, CalculateTotalDamageContribution(force, enemy, boosts, isEpicBoss).ToSimpleString()); } var useableBoosts = new List<Effect>(); if (boosts != null) { useableBoosts.AddRange(boosts.Where(effect => effect.IsBoostEffect() && this.IsClassification(effect.TargetType)).ToList()); } foreach (var ability in Abilities) { var dmg = ability.CalculateTotalDamageContribution(this.ID, force, enemy, useableBoosts, isEpicBoss); sb.AppendFormat(prefix + " * {0} [{1}]\r\n", ability.Name, dmg.ToSimpleString()); if(dmg.DoneAnything() && useableBoosts.Count > 0) { sb.AppendFormat(prefix + " * Base [{0}]\r\n", ability.CalculateTotalDamageContribution(this.ID, force, enemy, null, isEpicBoss).ToSimpleString()); } foreach (var effect in useableBoosts) { if(IsClassification(effect.TargetType)) { sb.AppendFormat(prefix + " + {0} {1} {2}\r\n", ability.CalculateBoostBonus(force, enemy, effect, isEpicBoss), effect.ParentsName, effect.Type == EffectType.Boost ? "Boost" : "Rally"); } } var repeatedReinforcements = new List<Guid>(); foreach (var reinforcement in force.GetReinforcedUnits(ID)) { if (repeatedReinforcements.Contains(reinforcement.ID)) { continue; } var count = force.GetReinforcedUnits(ID).Count(x => x.ID == reinforcement.ID); if (reinforcement.Abilities.Any(x => x.HasEffect(EffectType.Reinforce)) == false && count > 1) { repeatedReinforcements.Add(reinforcement.ID); sb.AppendFormat(prefix + " * {0}x Reinforced - {1}", count, reinforcement.DamageReport(force, enemy, boosts, isEpicBoss, prefix + "\t ", hideNamePrefix: true, reinforcementRate: 0.5)); // TODO: Better fix for this } else { sb.AppendFormat(prefix + " * Reinforced - {0}", reinforcement.DamageReport(force, enemy, boosts, isEpicBoss, prefix + "\t ", hideNamePrefix: true)); } } if (ability.HasEffect(EffectType.Boost)) { sb.AppendFormat(prefix + " * Boosts units in this force for a total bonus of {0}\r\n", CalculateBoostToForce(force, enemy, isEpicBoss)); } if (ability.HasEffect(EffectType.Rally)) { sb.AppendFormat(prefix + " * Rallies units in this force for a total bonus of {0}\r\n", CalculateBoostToForce(force, enemy, isEpicBoss)); } } return sb.ToString(); }