private List <JsonMinions> BuildMinions(AbstractMasterActor master) { List <JsonMinions> mins = new List <JsonMinions>(); foreach (Minions minions in master.GetMinions(_log).Values) { List <int> totalDamage = new List <int>(); List <int> totalShieldDamage = new List <int>(); List <int>[] totalTargetDamage = new List <int> [_log.FightData.Logic.Targets.Count]; List <int>[] totalTargetShieldDamage = new List <int> [_log.FightData.Logic.Targets.Count]; foreach (PhaseData phase in _phases) { int tot = 0; int shdTot = 0; foreach (AbstractDamageEvent de in minions.GetDamageLogs(null, _log, phase.Start, phase.End)) { tot += de.Damage; shdTot = de.ShieldDamage; } totalDamage.Add(tot); totalShieldDamage.Add(shdTot); } for (int i = 0; i < _log.FightData.Logic.Targets.Count; i++) { Target tar = _log.FightData.Logic.Targets[i]; List <int> totalTarDamage = new List <int>(); List <int> totalTarShieldDamage = new List <int>(); foreach (PhaseData phase in _phases) { int tot = 0; int shdTot = 0; foreach (AbstractDamageEvent de in minions.GetDamageLogs(tar, _log, phase.Start, phase.End)) { tot += de.Damage; shdTot = de.ShieldDamage; } totalTarDamage.Add(tot); totalTarShieldDamage.Add(shdTot); } totalTargetDamage[i] = totalTarDamage; totalTargetShieldDamage[i] = totalTarShieldDamage; } JsonMinions min = new JsonMinions() { Name = minions.Character, Rotation = BuildRotation(minions.GetCastLogs(_log, 0, _log.FightData.FightDuration)), TotalDamageDist = BuildDamageDist(minions, null), TargetDamageDist = BuildDamageDist(minions), TotalDamage = totalDamage, TotalShieldDamage = totalShieldDamage, TotalTargetShieldDamage = totalTargetShieldDamage, TotalTargetDamage = totalTargetDamage, }; mins.Add(min); } return(mins); }
private List <int>[] BuildTotal1SDamage(AbstractMasterActor p) { List <int>[] list = new List <int> [_statistics.Phases.Count]; for (int i = 0; i < _statistics.Phases.Count; i++) { list[i] = p.Get1SDamageList(_log, i, _statistics.Phases[i], null); } return(list); }
private Dictionary <string, JsonDamageDist>[] BuildDamageTaken(AbstractMasterActor p) { Dictionary <string, JsonDamageDist>[] res = new Dictionary <string, JsonDamageDist> [_statistics.Phases.Count]; for (int i = 0; i < _statistics.Phases.Count; i++) { PhaseData phase = _statistics.Phases[i]; res[i] = BuildDamageDist(p.GetDamageTakenLogs(null, _log, phase.Start, phase.End)); } return(res); }
private Dictionary <string, JsonDamageDist>[] BuildDamageDist(AbstractMasterActor p, Target target) { Dictionary <string, JsonDamageDist>[] res = new Dictionary <string, JsonDamageDist> [_statistics.Phases.Count]; for (int i = 0; i < _statistics.Phases.Count; i++) { PhaseData phase = _statistics.Phases[i]; res[i] = BuildDamageDist(p.GetJustPlayerDamageLogs(target, _log, phase.Start, phase.End)); } return(res); }
private Dictionary <string, JsonDamageDist>[][] BuildDamageDist(AbstractMasterActor p) { Dictionary <string, JsonDamageDist>[][] res = new Dictionary <string, JsonDamageDist> [_log.FightData.Logic.Targets.Count][]; for (int i = 0; i < _log.FightData.Logic.Targets.Count; i++) { Target target = _log.FightData.Logic.Targets[i]; res[i] = BuildDamageDist(p, target); } return(res); }
private List <JsonDamageDist>[] BuildDamageTaken(AbstractMasterActor p) { List <JsonDamageDist>[] res = new List <JsonDamageDist> [_phases.Count]; for (int i = 0; i < _phases.Count; i++) { PhaseData phase = _phases[i]; res[i] = BuildDamageDist(p.GetDamageTakenLogs(null, _log, phase.Start, phase.End)); } return(res); }
private List <JsonDamageDist>[] BuildDamageDist(AbstractMasterActor p, Target target) { List <JsonDamageDist>[] res = new List <JsonDamageDist> [_phases.Count]; for (int i = 0; i < _phases.Count; i++) { PhaseData phase = _phases[i]; res[i] = BuildDamageDist(p.GetJustPlayerDamageLogs(target, _log, phase)); } return(res); }
public override void ComputeMobCombatReplayActors(Mob mob, ParsedLog log, CombatReplay replay) { int start = (int)replay.TimeOffsets.start; int end = (int)replay.TimeOffsets.end; switch (mob.ID) { case (ushort)EntropicDistortion: //sapping surge, red tether List <AbstractBuffEvent> sappingSurge = GetFilteredList(log.CombatData, 56118, mob, true); int surgeStart = 0; AbstractMasterActor source = null; foreach (AbstractBuffEvent c in sappingSurge) { if (c is BuffApplyEvent) { Target qadim = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.PeerlessQadim); surgeStart = (int)c.Time; source = (AbstractMasterActor)log.PlayerList.FirstOrDefault(x => x.AgentItem == c.By) ?? qadim; } else { int surgeEnd = (int)c.Time; if (source != null) { replay.Actors.Add(new LineActor(0, (surgeStart, surgeEnd), "rgba(255, 0, 0, 0.3)", new AgentConnector(mob), new AgentConnector(source))); } } } break; case (ushort)BigKillerTornado: replay.Actors.Add(new CircleActor(true, 0, 450, (start, end), "rgba(255, 150, 0, 0.4)", new AgentConnector(mob))); break; case (ushort)Pylon1: break; case (ushort)Pylon2: break; case (ushort)EnergyOrb: break; default: throw new InvalidOperationException("Unknown ID in ComputeAdditionalData"); } }
private List <JsonMinions> BuildMinions(AbstractMasterActor master) { List <JsonMinions> mins = new List <JsonMinions>(); foreach (Minions minions in master.GetMinions(_log).Values) { JsonMinions min = new JsonMinions() { name = minions.Character, rotation = BuildRotation(minions.GetCastLogs(_log, 0, _log.FightData.FightDuration)), totalDamageDist = BuildDamageDist(minions, null), targetDamageDist = BuildDamageDist(minions), }; mins.Add(min); } return(mins); }
// protected static List <CombatItem> GetFilteredList(CombatData combatData, long skillID, AbstractMasterActor target, bool beginWithStart) { bool needStart = beginWithStart; List <CombatItem> main = combatData.GetBoonData(skillID).Where(x => ((x.DstInstid == target.InstID && x.IsBuffRemove == ParseEnum.BuffRemove.None) || (x.SrcInstid == target.InstID && x.IsBuffRemove == ParseEnum.BuffRemove.Manual)) && x.Time >= target.FirstAware && x.Time <= target.LastAware).ToList(); List <CombatItem> filtered = new List <CombatItem>(); for (int i = 0; i < main.Count; i++) { CombatItem c = main[i]; if (needStart && c.IsBuffRemove == ParseEnum.BuffRemove.None) { needStart = false; filtered.Add(c); } else if (!needStart && c.IsBuffRemove == ParseEnum.BuffRemove.Manual) { // consider only last remove event before another application if ((i == main.Count - 1) || (i < main.Count - 1 && main[i + 1].IsBuffRemove == ParseEnum.BuffRemove.None)) { needStart = true; filtered.Add(c); } } } return(filtered); }
public override void ComputePlayerCombatReplayActors(Player p, ParsedLog log, CombatReplay replay) { // fixated List <AbstractBuffEvent> fixated = GetFilteredList(log.CombatData, 56510, p, true); int fixatedStart = 0; foreach (AbstractBuffEvent c in fixated) { if (c is BuffApplyEvent) { fixatedStart = Math.Max((int)c.Time, 0); } else { int fixatedEnd = (int)c.Time; replay.Actors.Add(new CircleActor(true, 0, 120, (fixatedStart, fixatedEnd), "rgba(255, 80, 255, 0.3)", new AgentConnector(p))); } } // Magma drop List <AbstractBuffEvent> magmaDrop = GetFilteredList(log.CombatData, 56475, p, true); int magmaDropStart = 0; int magmaRadius = 420; int magmaOffset = 4000; foreach (AbstractBuffEvent c in magmaDrop) { if (c is BuffApplyEvent) { magmaDropStart = (int)c.Time; } else { int magmaDropEnd = (int)c.Time; replay.Actors.Add(new CircleActor(true, 0, magmaRadius, (magmaDropStart, magmaDropEnd), "rgba(255, 150, 0, 0.15)", new AgentConnector(p))); replay.Actors.Add(new CircleActor(true, magmaDropEnd, magmaRadius, (magmaDropStart, magmaDropEnd), "rgba(255, 150, 0, 0.25)", new AgentConnector(p))); Point3D magmaNextPos = replay.PolledPositions.FirstOrDefault(x => x.Time >= magmaDropEnd); Point3D magmaPrevPos = replay.PolledPositions.LastOrDefault(x => x.Time <= magmaDropEnd); if (magmaNextPos != null || magmaPrevPos != null) { replay.Actors.Add(new CircleActor(true, 0, magmaRadius, (magmaDropEnd, magmaDropEnd + magmaOffset), "rgba(255, 220, 50, 0.15)", new InterpolatedPositionConnector(magmaPrevPos, magmaNextPos, magmaDropEnd))); replay.Actors.Add(new CircleActor(true, magmaDropEnd + magmaOffset, magmaRadius, (magmaDropEnd, magmaDropEnd + magmaOffset), "rgba(255, 220, 50, 0.25)", new InterpolatedPositionConnector(magmaPrevPos, magmaNextPos, magmaDropEnd))); replay.Actors.Add(new CircleActor(true, 0, magmaRadius, (magmaDropEnd + magmaOffset, (int)log.FightData.FightDuration), "rgba(255, 220, 50, 0.5)", new InterpolatedPositionConnector(magmaPrevPos, magmaNextPos, magmaDropEnd))); } } } //sapping surge, bad red tether List <AbstractBuffEvent> sappingSurge = GetFilteredList(log.CombatData, 56118, p, true); int surgeStart = 0; AbstractMasterActor source = null; foreach (AbstractBuffEvent c in sappingSurge) { if (c is BuffApplyEvent) { Target qadim = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.PeerlessQadim); surgeStart = (int)c.Time; source = (AbstractMasterActor)log.PlayerList.FirstOrDefault(x => x.AgentItem == c.By) ?? qadim; } else { int surgeEnd = (int)c.Time; if (source != null) { replay.Actors.Add(new LineActor(0, (surgeStart, surgeEnd), "rgba(255, 0, 0, 0.4)", new AgentConnector(p), new AgentConnector(source))); } } } // kinetic abundance, good (blue) tether List <AbstractBuffEvent> kineticAbundance = GetFilteredList(log.CombatData, 56609, p, true); int kinStart = 0; AbstractMasterActor kinSource = null; foreach (AbstractBuffEvent c in kineticAbundance) { if (c is BuffApplyEvent) { kinStart = (int)c.Time; //kinSource = log.PlayerList.FirstOrDefault(x => x.AgentItem == c.By); kinSource = (AbstractMasterActor)log.PlayerList.FirstOrDefault(x => x.AgentItem == c.By) ?? TrashMobs.FirstOrDefault(x => x.AgentItem == c.By); } else { int kinEnd = (int)c.Time; if (kinSource != null) { replay.Actors.Add(new LineActor(0, (kinStart, kinEnd), "rgba(0, 0, 255, 0.4)", new AgentConnector(p), new AgentConnector(kinSource))); } } } }
// protected static List <AbstractBuffEvent> GetFilteredList(CombatData combatData, long buffID, AbstractMasterActor target, bool beginWithStart) { bool needStart = beginWithStart; List <AbstractBuffEvent> main = combatData.GetBoonData(buffID).Where(x => x.To == target.AgentItem && (x is BuffApplyEvent || x is BuffRemoveAllEvent)).ToList(); List <AbstractBuffEvent> filtered = new List <AbstractBuffEvent>(); for (int i = 0; i < main.Count; i++) { AbstractBuffEvent c = main[i]; if (needStart && c is BuffApplyEvent) { needStart = false; filtered.Add(c); } else if (!needStart && c is BuffRemoveAllEvent) { // consider only last remove event before another application if ((i == main.Count - 1) || (i < main.Count - 1 && main[i + 1] is BuffApplyEvent)) { needStart = true; filtered.Add(c); } } } return(filtered); }