public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { // generic method for fractals long start = 0; long end = 0; long fightDuration = log.FightData.FightDuration; List <PhaseData> phases = GetInitialPhase(log); Target mainTarget = Targets.Find(x => x.ID == TriggerID); if (mainTarget == null) { throw new InvalidOperationException("Main target of the fight not found"); } phases[0].Targets.Add(mainTarget); if (!requirePhases) { return(phases); } List <CombatItem> invulsTarget = GetFilteredList(log, 762, mainTarget); for (int i = 0; i < invulsTarget.Count; i++) { CombatItem c = invulsTarget[i]; if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { end = log.FightData.ToFightSpace(c.Time); phases.Add(new PhaseData(start, end)); if (i == invulsTarget.Count - 1) { mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(fightDuration - end), ParseEnum.Activation.None, (int)(fightDuration - end), ParseEnum.Activation.None), log); } } else { start = log.FightData.ToFightSpace(c.Time); mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(start - end), ParseEnum.Activation.None, (int)(start - end), ParseEnum.Activation.None), log); } } if (fightDuration - start > 5000 && start >= phases.Last().End) { phases.Add(new PhaseData(start, fightDuration)); } phases.RemoveAll(x => x.GetDuration() < 1000); for (int i = 1; i < phases.Count; i++) { phases[i].Name = "Phase " + i; phases[i].Targets.Add(mainTarget); } return(phases); }
public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { long start = 0; long fightDuration = log.FightData.FightDuration; List <PhaseData> phases = GetInitialPhase(log); Target mainTarget = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.Xera); if (mainTarget == null) { throw new InvalidOperationException("Main target of the fight not found"); } phases[0].Targets.Add(mainTarget); if (!requirePhases) { return(phases); } // split happened if (log.FightData.PhaseData.Count == 1) { CombatItem invulXera = log.GetBoonData(762).Find(x => x.DstInstid == mainTarget.InstID); if (invulXera == null) { invulXera = log.GetBoonData(34113).Find(x => x.DstInstid == mainTarget.InstID); } long end = log.FightData.ToFightSpace(invulXera.Time); phases.Add(new PhaseData(start, end)); start = log.FightData.ToFightSpace(log.FightData.PhaseData[0]); mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(start - end), ParseEnum.Activation.None, (int)(start - end), ParseEnum.Activation.None), log); } if (fightDuration - start > 5000 && start >= phases.Last().End) { phases.Add(new PhaseData(start, fightDuration)); } for (int i = 1; i < phases.Count; i++) { phases[i].Name = "Phase " + i; phases[i].Targets.Add(mainTarget); } return(phases); }
public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { long start = 0; long end = 0; long fightDuration = log.FightData.FightDuration; List <PhaseData> phases = GetInitialPhase(log); Target mainTarget = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.Sabetha); if (mainTarget == null) { throw new InvalidOperationException("Main target of the fight not found"); } phases[0].Targets.Add(mainTarget); if (!requirePhases) { return(phases); } // Invul check List <CombatItem> invulsSab = GetFilteredList(log, 757, mainTarget); for (int i = 0; i < invulsSab.Count; i++) { CombatItem c = invulsSab[i]; if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { end = log.FightData.ToFightSpace(c.Time); phases.Add(new PhaseData(start, end)); if (i == invulsSab.Count - 1) { mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(fightDuration - end), ParseEnum.Activation.None, (int)(fightDuration - end), ParseEnum.Activation.None), log); } } else { start = log.FightData.ToFightSpace(c.Time); phases.Add(new PhaseData(end, start)); mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(start - end), ParseEnum.Activation.None, (int)(start - end), ParseEnum.Activation.None), log); } } if (fightDuration - start > 5000 && start >= phases.Last().End) { phases.Add(new PhaseData(start, fightDuration)); } string[] namesSab = new [] { "Phase 1", "Kernan", "Phase 2", "Knuckles", "Phase 3", "Karde", "Phase 4" }; for (int i = 1; i < phases.Count; i++) { PhaseData phase = phases[i]; phase.Name = namesSab[i - 1]; if (i == 2 || i == 4 || i == 6) { List <ushort> ids = new List <ushort> { (ushort)Kernan, (ushort)Knuckles, (ushort)Karde, }; AddTargetsToPhase(phase, ids, log); } else { phase.Targets.Add(mainTarget); Target addTarget; switch (i) { case 3: addTarget = Targets.Find(x => x.ID == (ushort)Kernan); if (addTarget == null) { throw new InvalidOperationException("Kernan not found when we should have been able to"); } phase.Targets.Add(addTarget); break; case 5: addTarget = Targets.Find(x => x.ID == (ushort)Knuckles); if (addTarget == null) { throw new InvalidOperationException("Knuckles not found when we should have been able to"); } phase.Targets.Add(addTarget); break; case 7: addTarget = Targets.Find(x => x.ID == (ushort)Karde); if (addTarget == null) { throw new InvalidOperationException("Karde not found when we should have been able to"); } phase.Targets.Add(addTarget); break; } } } return(phases); }
public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { long start = 0; long end = 0; long fightDuration = log.FightData.FightDuration; List <PhaseData> phases = GetInitialPhase(log); Target mainTarget = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.ValeGuardian); if (mainTarget == null) { throw new InvalidOperationException("Main target of the fight not found"); } phases[0].Targets.Add(mainTarget); if (!requirePhases) { return(phases); } // Invul check List <CombatItem> invulsVG = GetFilteredList(log, 757, mainTarget); for (int i = 0; i < invulsVG.Count; i++) { CombatItem c = invulsVG[i]; if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { end = log.FightData.ToFightSpace(c.Time); phases.Add(new PhaseData(start, end)); if (i == invulsVG.Count - 1) { mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(fightDuration - end), ParseEnum.Activation.None, (int)(fightDuration - end), ParseEnum.Activation.None), log); } } else { start = log.FightData.ToFightSpace(c.Time); phases.Add(new PhaseData(end, start)); mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(start - end), ParseEnum.Activation.None, (int)(start - end), ParseEnum.Activation.None), log); } } if (fightDuration - start > 5000 && start >= phases.Last().End) { phases.Add(new PhaseData(start, fightDuration)); } string[] namesVG = new[] { "Phase 1", "Split 1", "Phase 2", "Split 2", "Phase 3" }; for (int i = 1; i < phases.Count; i++) { PhaseData phase = phases[i]; phase.Name = namesVG[i - 1]; if (i == 2 || i == 4) { List <ushort> ids = new List <ushort> { (ushort)BlueGuardian, (ushort)GreenGuardian, (ushort)RedGuardian }; AddTargetsToPhase(phase, ids, log); } else { phase.Targets.Add(mainTarget); } } return(phases); }
public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { long start = 0; long end = 0; long fightDuration = log.FightData.FightDuration; List <PhaseData> phases = GetInitialPhase(log); Target mainTarget = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.Gorseval); if (mainTarget == null) { throw new InvalidOperationException("Main target of the fight not found"); } phases[0].Targets.Add(mainTarget); if (!requirePhases) { return(phases); } // Ghostly protection check List <CombatItem> invulsGorse = log.GetBoonData(31877).Where(x => x.IsBuffRemove != ParseEnum.BuffRemove.Manual).ToList(); for (int i = 0; i < invulsGorse.Count; i++) { CombatItem c = invulsGorse[i]; if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { end = log.FightData.ToFightSpace(c.Time); phases.Add(new PhaseData(start, end)); if (i == invulsGorse.Count - 1) { mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(fightDuration - end), ParseEnum.Activation.None, (int)(fightDuration - end), ParseEnum.Activation.None), log); } } else { start = log.FightData.ToFightSpace(c.Time); phases.Add(new PhaseData(end, start)); mainTarget.AddCustomCastLog(new CastLog(end, -5, (int)(start - end), ParseEnum.Activation.None, (int)(start - end), ParseEnum.Activation.None), log); } } if (fightDuration - start > 5000 && start >= phases.Last().End) { phases.Add(new PhaseData(start, fightDuration)); } string[] namesGorse = new [] { "Phase 1", "Split 1", "Phase 2", "Split 2", "Phase 3" }; for (int i = 1; i < phases.Count; i++) { PhaseData phase = phases[i]; phase.Name = namesGorse[i - 1]; if (i == 1 || i == 3 || i == 5) { phase.Targets.Add(mainTarget); } else { List <ushort> ids = new List <ushort> { (ushort)ChargedSoul }; AddTargetsToPhase(phase, ids, log); } } return(phases); }
public override List <PhaseData> GetPhases(ParsedLog log, bool requirePhases) { long start = 0; long end = 0; long fightDuration = log.FightData.FightDuration; List <PhaseData> phases = GetInitialPhase(log); Target mainTarget = Targets.Find(x => x.ID == (ushort)ParseEnum.TargetIDS.Deimos); if (mainTarget == null) { throw new InvalidOperationException("Main target of the fight not found"); } phases[0].Targets.Add(mainTarget); if (!requirePhases) { return(phases); } // Determined + additional data on inst change CombatItem invulDei = log.GetBoonData(762).Find(x => x.IsBuffRemove == ParseEnum.BuffRemove.None && x.DstInstid == mainTarget.InstID); if (invulDei != null) { end = log.FightData.ToFightSpace(invulDei.Time); phases.Add(new PhaseData(start, end)); start = (log.FightData.PhaseData.Count == 1 ? log.FightData.ToFightSpace(log.FightData.PhaseData[0]) : fightDuration); mainTarget.AddCustomCastLog(new CastLog(end, -6, (int)(start - end), ParseEnum.Activation.None, (int)(start - end), ParseEnum.Activation.None), log); } if (fightDuration - start > 5000 && start >= phases.Last().End) { phases.Add(new PhaseData(start, fightDuration)); } for (int i = 1; i < phases.Count; i++) { phases[i].Name = "Phase " + i; phases[i].Targets.Add(mainTarget); } int offsetDei = phases.Count; CombatItem teleport = log.GetBoonData(38169).FirstOrDefault(x => x.Time > log.FightData.FightStart + 5000); int splits = 0; while (teleport != null && splits < 3) { start = log.FightData.ToFightSpace(teleport.Time); CombatItem teleportBack = log.GetBoonData(38169).FirstOrDefault(x => log.FightData.ToFightSpace(x.Time) > start + 10000); if (teleportBack != null) { end = Math.Min(log.FightData.ToFightSpace(teleportBack.Time), fightDuration); } else { end = fightDuration; } phases.Add(new PhaseData(start, end)); splits++; teleport = log.GetBoonData(38169).FirstOrDefault(x => log.FightData.ToFightSpace(x.Time) > end + 10000); } string[] namesDeiSplit = new [] { "Thief", "Gambler", "Drunkard" }; for (int i = offsetDei; i < phases.Count; i++) { PhaseData phase = phases[i]; phase.Name = namesDeiSplit[i - offsetDei]; List <ushort> ids = new List <ushort> { (ushort)Thief, (ushort)Drunkard, (ushort)Gambler, }; AddTargetsToPhase(phase, ids, log); } phases.Sort((x, y) => (x.Start < y.Start) ? -1 : 1); phases.RemoveAll(x => x.Targets.Count == 0); return(phases); }