protected void SetBoonStatus(ParsedLog log) { BoonPoints = new Dictionary <long, BoonsGraphModel>(); BoonMap toUse = GetBoonMap(log); long dur = log.FightData.FightDuration; int fightDuration = (int)(dur) / 1000; BoonsGraphModel boonPresenceGraph = new BoonsGraphModel(Boon.BoonsByIds[Boon.NumberOfBoonsID]); BoonsGraphModel condiPresenceGraph = new BoonsGraphModel(Boon.BoonsByIds[Boon.NumberOfConditionsID]); HashSet <long> boonIds = new HashSet <long>(Boon.GetBoonList().Select(x => x.ID)); HashSet <long> condiIds = new HashSet <long>(Boon.GetCondiBoonList().Select(x => x.ID)); InitBoonStatusData(log); long death = GetDeath(log, 0, dur); foreach (Boon boon in TrackedBoons) { long boonid = boon.ID; if (toUse.TryGetValue(boonid, out List <BoonLog> logs) && logs.Count != 0) { if (BoonPoints.ContainsKey(boonid)) { continue; } BoonSimulator simulator = boon.CreateSimulator(log); simulator.Simulate(logs, dur); if (death > 0 && GetCastLogs(log, death + 5000, dur).Count == 0) { simulator.Trim(death); } else { simulator.Trim(dur); } bool updateBoonPresence = boonIds.Contains(boonid); bool updateCondiPresence = condiIds.Contains(boonid); List <BoonsGraphModel.SegmentWithSources> graphSegments = new List <BoonsGraphModel.SegmentWithSources>(); foreach (BoonSimulationItem simul in simulator.GenerationSimulation) { SetBoonStatusGenerationData(log, simul, boonid); BoonsGraphModel.SegmentWithSources segment = simul.ToSegment(); if (graphSegments.Count == 0) { graphSegments.Add(new BoonsGraphModel.SegmentWithSources(0, segment.Start, 0, GeneralHelper.UnknownAgent)); } else if (graphSegments.Last().End != segment.Start) { graphSegments.Add(new BoonsGraphModel.SegmentWithSources(graphSegments.Last().End, segment.Start, 0, GeneralHelper.UnknownAgent)); } graphSegments.Add(segment); } SetBoonStatusCleanseWasteData(log, simulator, boonid, updateCondiPresence); if (graphSegments.Count > 0) { graphSegments.Add(new BoonsGraphModel.SegmentWithSources(graphSegments.Last().End, dur, 0, GeneralHelper.UnknownAgent)); } else { graphSegments.Add(new BoonsGraphModel.SegmentWithSources(0, dur, 0, GeneralHelper.UnknownAgent)); } BoonPoints[boonid] = new BoonsGraphModel(boon, graphSegments); if (updateBoonPresence || updateCondiPresence) { List <BoonsGraphModel.Segment> segmentsToFill = updateBoonPresence ? boonPresenceGraph.BoonChart : condiPresenceGraph.BoonChart; bool firstPass = segmentsToFill.Count == 0; foreach (BoonsGraphModel.Segment seg in BoonPoints[boonid].BoonChart) { long start = seg.Start; long end = seg.End; int value = seg.Value > 0 ? 1 : 0; if (firstPass) { segmentsToFill.Add(new BoonsGraphModel.Segment(start, end, value)); } else { for (int i = 0; i < segmentsToFill.Count; i++) { BoonsGraphModel.Segment curSeg = segmentsToFill[i]; long curEnd = curSeg.End; long curStart = curSeg.Start; int curVal = curSeg.Value; if (curStart > end) { break; } if (curEnd < start) { continue; } if (end <= curEnd) { curSeg.End = start; segmentsToFill.Insert(i + 1, new BoonsGraphModel.Segment(start, end, curVal + value)); segmentsToFill.Insert(i + 2, new BoonsGraphModel.Segment(end, curEnd, curVal)); break; } else { curSeg.End = start; segmentsToFill.Insert(i + 1, new BoonsGraphModel.Segment(start, curEnd, curVal + value)); start = curEnd; i++; } } } } if (updateBoonPresence) { boonPresenceGraph.FuseSegments(); } else { condiPresenceGraph.FuseSegments(); } } } } BoonPoints[Boon.NumberOfBoonsID] = boonPresenceGraph; BoonPoints[Boon.NumberOfConditionsID] = condiPresenceGraph; }
protected BoonMap GetBoonMap(ParsedLog log) { // buff extension ids BoonSourceFinder sourceFinder = log.BoonSourceFinder; // BoonMap boonMap = new BoonMap(); // Fill in Boon Map foreach (CombatItem c in log.CombatData.GetBoonDataByDst(InstID, FirstAware, LastAware)) { long boonId = c.SkillID; if (!boonMap.ContainsKey(boonId)) { if (!Boon.BoonsByIds.ContainsKey(boonId)) { continue; } boonMap.Add(Boon.BoonsByIds[boonId]); } if (c.IsBuffRemove == ParseEnum.BuffRemove.Manual || (c.IsBuffRemove == ParseEnum.BuffRemove.Single && c.IFF == ParseEnum.IFF.Unknown && c.DstInstid == 0) || (c.IsBuffRemove != ParseEnum.BuffRemove.None && c.Value <= 50)) { continue; } long time = log.FightData.ToFightSpace(c.Time); List <BoonLog> loglist = boonMap[boonId]; if (c.IsStateChange == ParseEnum.StateChange.BuffInitial) { ushort src = c.SrcMasterInstid > 0 ? c.SrcMasterInstid : c.SrcInstid; loglist.Add(new BoonApplicationLog(time, log.AgentData.GetAgentByInstID(src, c.Time), c.Value)); } else if (c.IsStateChange != ParseEnum.StateChange.BuffInitial) { if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { ushort src = c.SrcMasterInstid > 0 ? c.SrcMasterInstid : c.SrcInstid; if (c.IsOffcycle > 0) { if (src == 0) { src = sourceFinder.TryFindSrc(this, time, c.Value, log); } loglist.Add(new BoonExtensionLog(time, c.Value, c.OverstackValue - c.Value, log.AgentData.GetAgentByInstID(src, c.Time))); } else { loglist.Add(new BoonApplicationLog(time, log.AgentData.GetAgentByInstID(src, c.Time), c.Value)); } } else if (time < log.FightData.FightDuration - 50) { ushort src = c.DstMasterInstid > 0 ? c.DstMasterInstid : c.DstInstid; loglist.Add(new BoonRemovalLog(time, log.AgentData.GetAgentByInstID(src, c.Time), c.Value, c.IsBuffRemove)); } } } //boonMap.Sort(); foreach (var pair in boonMap) { TrackedBoons.Add(Boon.BoonsByIds[pair.Key]); } return(boonMap); }