internal DamageModifier(string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, string icon, GainComputer gainComputer, DamageLogChecker dlChecker, ulong minBuild, ulong maxBuild, DamageModifierMode mode) { Tooltip = tooltip; Name = name; ID = Name.GetHashCode(); _dmgSrc = damageSource; GainPerStack = gainPerStack; _compareType = compareType; _srcType = srctype; Src = src; Icon = icon; GainComputer = gainComputer; DLChecker = dlChecker; _maxBuild = maxBuild; _minBuild = minBuild; Mode = mode; switch (_dmgSrc) { case DamageSource.All: Tooltip += "<br>Actor + Minions"; break; case DamageSource.NoPets: Tooltip += "<br>No Minions"; break; } switch (_srcType) { case DamageType.All: Tooltip += "<br>All Damage type"; break; case DamageType.Power: Tooltip += "<br>Power Damage only"; break; case DamageType.Condition: Tooltip += "<br>Condition Damage only"; break; } switch (_compareType) { case DamageType.All: Tooltip += "<br>Compared against All Damage"; break; case DamageType.Power: Tooltip += "<br>Compared against Power Damage"; break; case DamageType.Condition: Tooltip += "<br>Compared against Condition Damage"; break; } if (!Multiplier) { Tooltip += "<br>Non multiplier"; } }
protected double ComputeGain(int stack, AbstractHealthDamageEvent dl, ParsedEvtcLog log) { if (DLChecker != null && !DLChecker(dl, log)) { return(-1.0); } double gain = GainComputer.ComputeGain(GainPerStack, stack); return(gain > 0.0 ? gain * dl.HealthDamage : -1.0); }
protected double ComputeGain(int stack, AbstractDamageEvent dl) { if (DLChecker != null && !DLChecker(dl)) { return(-1.0); } double gain = GainComputer.ComputeGain(GainPerStack, stack); return(gain > 0.0 ? gain * dl.Damage : -1.0); }
protected double ComputeGain(int stack, AbstractHealthDamageEvent dl, ParsedEvtcLog log) { if (DLChecker != null && !DLChecker(dl, log)) { return(-1.0); } // When gain per stack is 0, we only count hits done under the buff or in its absence double gain = GainComputer.ComputeGain(GainPerStack == 0.0 ? 1.0 : GainPerStack, stack); return(gain > 0.0 ? (GainPerStack == 0.0 ? 0.0 : gain *dl.HealthDamage) : -1.0); }
internal override List <DamageModifierEvent> ComputeDamageModifier(AbstractSingleActor actor, ParsedEvtcLog log) { var res = new List <DamageModifierEvent>(); double gain = GainComputer.ComputeGain(GainPerStack, 1); IReadOnlyList <AbstractHealthDamageEvent> typeHits = GetHitDamageEvents(actor, log, null, 0, log.FightData.FightEnd); foreach (AbstractHealthDamageEvent evt in typeHits) { if (DLChecker(evt, log)) { res.Add(new DamageModifierEvent(evt, this, gain * evt.HealthDamage)); } } return(res); }
internal override void ComputeDamageModifier(Dictionary <string, List <DamageModifierStat> > data, Dictionary <NPC, Dictionary <string, List <DamageModifierStat> > > dataTarget, Player p, ParsedEvtcLog log) { IReadOnlyList <PhaseData> phases = log.FightData.GetPhases(log); double gain = GainComputer.ComputeGain(GainPerStack, 1); if (!p.GetHitDamageEvents(null, log, phases[0].Start, phases[0].End).Any(x => DLChecker(x))) { return; } foreach (NPC target in log.FightData.Logic.Targets) { if (!dataTarget.TryGetValue(target, out Dictionary <string, List <DamageModifierStat> > extra)) { dataTarget[target] = new Dictionary <string, List <DamageModifierStat> >(); } Dictionary <string, List <DamageModifierStat> > dict = dataTarget[target]; if (!dict.TryGetValue(Name, out List <DamageModifierStat> list)) { var extraDataList = new List <DamageModifierStat>(); foreach (PhaseData phase in phases) { int totalDamage = GetTotalDamage(p, log, target, phase.Start, phase.End); IReadOnlyList <AbstractHealthDamageEvent> typeHits = GetHitDamageEvents(p, log, target, phase.Start, phase.End); var effect = typeHits.Where(x => DLChecker(x)).ToList(); extraDataList.Add(new DamageModifierStat(effect.Count, typeHits.Count, gain * effect.Sum(x => x.HealthDamage), totalDamage)); } dict[Name] = extraDataList; } } data[Name] = new List <DamageModifierStat>(); foreach (PhaseData phase in phases) { int totalDamage = GetTotalDamage(p, log, null, phase.Start, phase.End); IReadOnlyList <AbstractHealthDamageEvent> typeHits = GetHitDamageEvents(p, log, null, phase.Start, phase.End); var effect = typeHits.Where(x => DLChecker(x)).ToList(); data[Name].Add(new DamageModifierStat(effect.Count, typeHits.Count, gain * effect.Sum(x => x.HealthDamage), totalDamage)); } }
internal DamageLogApproximateDamageModifier(string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, string icon, DamageLogChecker checker, GainComputer gainComputer, ulong minBuild, ulong maxBuild, DamageModifierMode mode) : base(name, tooltip, damageSource, gainPerStack, srctype, compareType, src, icon, checker, gainComputer, minBuild, maxBuild, mode) { Approximate = true; Tooltip += "<br>Approximate"; }
internal BuffDamageModifier(long[] ids, string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, GainComputer gainComputer, string icon, ulong minBuild, ulong maxBuild, DamageModifierMode mode, DamageLogChecker dlChecker = null) : base(name, tooltip, damageSource, gainPerStack, srctype, compareType, src, icon, gainComputer, dlChecker, minBuild, maxBuild, mode) { Tracker = new BuffsTrackerMulti(new List <long>(ids)); }
internal BuffDamageModifier(long id, string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, GainComputer gainComputer, string icon, DamageModifierMode mode, DamageLogChecker dlChecker = null) : base(name, tooltip, damageSource, gainPerStack, srctype, compareType, src, icon, gainComputer, dlChecker, ulong.MinValue, ulong.MaxValue, mode) { Tracker = new BuffsTrackerSingle(id); }
internal DamageLogDamageModifier(string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, string icon, DamageLogChecker checker, GainComputer gainComputer, DamageModifierMode mode) : base(name, tooltip, damageSource, gainPerStack, srctype, compareType, src, icon, gainComputer, checker, ulong.MinValue, ulong.MaxValue, mode) { }
internal DamageLogDamageModifier(string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, string icon, DamageLogChecker checker, GainComputer gainComputer, DamageModifierMode mode) : base(name, tooltip, damageSource, gainPerStack, srctype, compareType, src, icon, gainComputer, checker, GW2Builds.StartOfLife, GW2Builds.EndOfLife, mode) { }
internal BuffDamageModifierTarget(long[] ids, long[] playerIds, string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, GainComputer gainComputer, GainComputer gainComputerPlayer, string icon, ulong minBuild, ulong maxBuild, DamageModifierMode mode, DamageLogChecker dlChecker = null) : this(ids, name, tooltip, damageSource, gainPerStack, srctype, compareType, src, gainComputer, icon, minBuild, maxBuild, mode, dlChecker) { _trackerPlayer = new BuffsTrackerMulti(new List <long>(playerIds)); _gainComputerPlayer = gainComputerPlayer; }
internal BuffDamageModifierTarget(long id, long playerId, string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, GainComputer gainComputer, GainComputer gainComputerPlayer, string icon, DamageModifierMode mode, DamageLogChecker dlChecker = null) : this(id, name, tooltip, damageSource, gainPerStack, srctype, compareType, src, gainComputer, icon, mode, dlChecker) { _trackerPlayer = new BuffsTrackerSingle(playerId); _gainComputerPlayer = gainComputerPlayer; }
internal BuffDamageModifierTarget(long[] ids, string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, GainComputer gainComputer, string icon, ulong minBuild, ulong maxBuild, DamageModifierMode mode, DamageLogChecker dlChecker = null) : base(ids, name, tooltip, damageSource, gainPerStack, srctype, compareType, src, gainComputer, icon, minBuild, maxBuild, mode, dlChecker) { }
internal DamageModifier(string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, string icon, GainComputer gainComputer, DamageLogChecker dlChecker, ulong minBuild, ulong maxBuild, DamageModifierMode mode) { Tooltip = tooltip; Name = name; ID = Name.GetHashCode(); _dmgSrc = damageSource; GainPerStack = gainPerStack; _compareType = compareType; _srcType = srctype; Src = src; Icon = icon; GainComputer = gainComputer; DLChecker = dlChecker; _maxBuild = maxBuild; _minBuild = minBuild; Mode = mode; switch (_dmgSrc) { case DamageSource.All: Tooltip += "<br>Actor + Minions"; break; case DamageSource.NoPets: Tooltip += "<br>No Minions"; break; } switch (_srcType) { case DamageType.All: Tooltip += "<br>All Damage"; throw new InvalidDataException("No known damage modifier that modifies every outgoing damage"); case DamageType.Power: Tooltip += "<br>Power Damage"; break; case DamageType.Strike: Tooltip += "<br>Strike Damage"; break; case DamageType.StrikeAndCondition: Tooltip += "<br>Strike and Condition Damage"; break; case DamageType.StrikeAndConditionAndLifeLeech: Tooltip += "<br>Strike, Condition and Life Leech Damage"; break; case DamageType.Condition: Tooltip += "<br>Condition Damage"; break; default: throw new NotImplementedException("Not implemented damage type " + _srcType); } switch (_compareType) { case DamageType.All: Tooltip += "<br>Compared against All Damage"; break; case DamageType.Power: Tooltip += "<br>Compared against Power Damage"; break; case DamageType.Strike: Tooltip += "<br>Compared against Strike Damage"; break; case DamageType.StrikeAndCondition: Tooltip += "<br>Compared against Strike and Condition Damage"; break; case DamageType.StrikeAndConditionAndLifeLeech: Tooltip += "<br>Compared against Strike, Condition and Life Leech Damage"; break; case DamageType.Condition: Tooltip += "<br>Compared against Condition Damage"; break; default: throw new NotImplementedException("Not implemented damage type " + _compareType); } if (!Multiplier) { Tooltip += "<br>Non multiplier"; } }
internal BuffApproximateDamageModifier(long id, string name, string tooltip, DamageSource damageSource, double gainPerStack, DamageType srctype, DamageType compareType, ParserHelper.Source src, GainComputer gainComputer, string icon, DamageModifierMode mode, DamageLogChecker dlChecker = null) : base(id, name, tooltip, damageSource, gainPerStack, srctype, compareType, src, gainComputer, icon, mode, dlChecker) { Approximate = true; Tooltip += "<br>Approximate"; }