private void SetDeathRecaps(ParsedLog log) { _deathRecaps = new List <DeathRecap>(); List <DeathRecap> res = _deathRecaps; List <CombatItem> deads = log.CombatData.GetStatesData(InstID, ParseEnum.StateChange.ChangeDead, log.FightData.FightStart, log.FightData.FightEnd); List <CombatItem> downs = log.CombatData.GetStatesData(InstID, ParseEnum.StateChange.ChangeDown, log.FightData.FightStart, log.FightData.FightEnd); long lastTime = log.FightData.FightStart; List <DamageLog> damageLogs = GetDamageTakenLogs(null, log, 0, log.FightData.FightDuration); foreach (CombatItem dead in deads) { DeathRecap recap = new DeathRecap() { DeathTime = (int)(log.FightData.ToFightSpace(dead.Time)) }; CombatItem downed = downs.LastOrDefault(x => x.Time <= dead.Time && x.Time >= lastTime); if (downed != null) { List <DamageLog> damageToDown = damageLogs.Where(x => x.Time < log.FightData.ToFightSpace(downed.Time) && x.Damage > 0 && x.Time > log.FightData.ToFightSpace(lastTime)).ToList(); recap.ToDown = damageToDown.Count > 0 ? new List <DeathRecap.DeathRecapDamageItem>() : null; int damage = 0; for (int i = damageToDown.Count - 1; i >= 0; i--) { DamageLog dl = damageToDown[i]; AgentItem ag = log.AgentData.GetAgentByInstID(dl.SrcInstId, log.FightData.ToLogSpace(dl.Time)); DeathRecap.DeathRecapDamageItem item = new DeathRecap.DeathRecapDamageItem() { Time = (int)dl.Time, IndirectDamage = dl.IsIndirectDamage, ID = dl.SkillId, Damage = dl.Damage, Src = ag != null?ag.Name.Replace("\u0000", "").Split(':')[0] : "" }; damage += dl.Damage; recap.ToDown.Add(item); if (damage > 20000) { break; } } List <DamageLog> damageToKill = damageLogs.Where(x => x.Time > log.FightData.ToFightSpace(downed.Time) && x.Time < log.FightData.ToFightSpace(dead.Time) && x.Damage > 0 && x.Time > log.FightData.ToFightSpace(lastTime)).ToList(); recap.ToKill = damageToKill.Count > 0 ? new List <DeathRecap.DeathRecapDamageItem>() : null; for (int i = damageToKill.Count - 1; i >= 0; i--) { DamageLog dl = damageToKill[i]; AgentItem ag = log.AgentData.GetAgentByInstID(dl.SrcInstId, log.FightData.ToLogSpace(dl.Time)); DeathRecap.DeathRecapDamageItem item = new DeathRecap.DeathRecapDamageItem() { Time = (int)dl.Time, IndirectDamage = dl.IsIndirectDamage, ID = dl.SkillId, Damage = dl.Damage, Src = ag != null?ag.Name.Replace("\u0000", "").Split(':')[0] : "" }; recap.ToKill.Add(item); } } else { recap.ToDown = null; List <DamageLog> damageToKill = damageLogs.Where(x => x.Time < log.FightData.ToFightSpace(dead.Time) && x.Damage > 0 && x.Time > log.FightData.ToFightSpace(lastTime)).ToList(); recap.ToKill = damageToKill.Count > 0 ? new List <DeathRecap.DeathRecapDamageItem>() : null; int damage = 0; for (int i = damageToKill.Count - 1; i >= 0; i--) { DamageLog dl = damageToKill[i]; AgentItem ag = log.AgentData.GetAgentByInstID(dl.SrcInstId, log.FightData.ToLogSpace(dl.Time)); DeathRecap.DeathRecapDamageItem item = new DeathRecap.DeathRecapDamageItem() { Time = (int)dl.Time, IndirectDamage = dl.IsIndirectDamage, ID = dl.SkillId, Damage = dl.Damage, Src = ag != null?ag.Name.Replace("\u0000", "").Split(':')[0] : "" }; damage += dl.Damage; recap.ToKill.Add(item); if (damage > 20000) { break; } } } lastTime = dead.Time; res.Add(recap); } }
//covers the special conditions that one might want to check when tracking mechanics public SpecialConditionItem(DamageLog damageLog) { DamageLog = damageLog; CombatItem = null; }