void Awake () { if (CombatData == null) { CombatData = new CombatData (); } TownManager = GetComponent<TownManager>(); _startupList = new List<IGameManager>(); _startupList.Add(TownManager); if (WorldDataStore == null) { foreach (IGameManager manager in _startupList) { manager.StartUp (); } WorldDataStore = new WorldDataStore (); Manager.WorldDataStore.storeTownsData (Manager.TownManager._towns); } else { Manager.TownManager.setTowns (Manager.WorldDataStore._towns); Manager.TownManager.UpdateTownsBasedOnCombatResults(); } }
internal StatisticsHelper(CombatData combatData, IReadOnlyList <Player> players, BuffsContainer buffs) { IReadOnlyCollection <long> skillIDs = combatData.GetSkills(); // Main boons foreach (Buff boon in buffs.BuffsByClassification[BuffClassification.Boon]) { if (skillIDs.Contains(boon.ID)) { _presentBoons.Add(boon); } } // Main Conditions foreach (Buff condition in buffs.BuffsByClassification[BuffClassification.Condition]) { if (skillIDs.Contains(condition.ID)) { _presentConditions.Add(condition); } } // Important class specific boons foreach (Buff offensiveBuff in buffs.BuffsByClassification[BuffClassification.Offensive]) { if (skillIDs.Contains(offensiveBuff.ID)) { _presentOffbuffs.Add(offensiveBuff); } } foreach (Buff supportBuff in buffs.BuffsByClassification[BuffClassification.Support]) { if (skillIDs.Contains(supportBuff.ID)) { _presentSupbuffs.Add(supportBuff); } } foreach (Buff defensiveBuff in buffs.BuffsByClassification[BuffClassification.Defensive]) { if (skillIDs.Contains(defensiveBuff.ID)) { _presentDefbuffs.Add(defensiveBuff); } } foreach (Buff gearBuff in buffs.BuffsByClassification[BuffClassification.Gear]) { if (skillIDs.Contains(gearBuff.ID)) { _presentGearbuffs.Add(gearBuff); } } foreach (Buff debuff in buffs.BuffsByClassification[BuffClassification.Debuff]) { if (skillIDs.Contains(debuff.ID)) { _presentDebuffs.Add(debuff); } } foreach (Buff fractalInstability in buffs.BuffsBySource[ParserHelper.Source.FractalInstability]) { if (skillIDs.Contains(fractalInstability.ID)) { _presentFractalInstabilities.Add(fractalInstability); } } // All class specific boons var remainingBuffsByIds = buffs.BuffsByClassification[BuffClassification.Other].GroupBy(x => x.ID).ToDictionary(x => x.Key, x => x.ToList().FirstOrDefault()); foreach (Player player in players) { _presentRemainingBuffsPerPlayer[player] = new HashSet <Buff>(); foreach (AbstractBuffEvent item in combatData.GetBuffData(player.AgentItem)) { if (item is BuffApplyEvent && item.To == player.AgentItem && remainingBuffsByIds.TryGetValue(item.BuffID, out Buff boon)) { _presentRemainingBuffsPerPlayer[player].Add(boon); } } } }
public void ComputeMechanics(ParsedLog log) { MechanicData mechData = log.MechanicData; FightData fightData = log.FightData; CombatData combatData = log.CombatData; long start = fightData.FightStart; long end = fightData.FightEnd; Mechanic.CheckSpecialCondition condition; HashSet <ushort> playersIds = new HashSet <ushort>(log.PlayerList.Select(x => x.InstID)); Dictionary <ushort, AbstractMasterPlayer> regroupedMobs = new Dictionary <ushort, AbstractMasterPlayer>(); foreach (Mechanic mech in MechanicList) { switch (mech.MechanicType) { case Mechanic.MechType.PlayerStatus: foreach (Player p in log.PlayerList) { List <CombatItem> cList = new List <CombatItem>(); switch (mech.SkillId) { case -2: cList = combatData.GetStates(p.InstID, ParseEnum.StateChange.ChangeDead, start, end); break; case -3: cList = combatData.GetStates(p.InstID, ParseEnum.StateChange.ChangeDown, start, end); break; case SkillItem.ResurrectId: cList = log.GetCastData(p.InstID).Where(x => x.SkillID == SkillItem.ResurrectId && x.IsActivation.IsCasting()).ToList(); break; } foreach (CombatItem mechItem in cList) { mechData[mech].Add(new MechanicLog(mechItem.Time - start, mech, p)); } } break; case Mechanic.MechType.SkillOnPlayer: foreach (Player p in log.PlayerList) { List <DamageLog> dls = p.GetDamageTakenLogs(log, 0, fightData.FightDuration); condition = mech.SpecialCondition; foreach (DamageLog dLog in dls) { if (condition != null && !condition(new SpecialConditionItem(dLog))) { continue; } if (dLog.SkillId == mech.SkillId && dLog.Result.IsHit()) { mechData[mech].Add(new MechanicLog(dLog.Time, mech, p)); } } } break; case Mechanic.MechType.PlayerBoon: case Mechanic.MechType.PlayerOnPlayer: case Mechanic.MechType.PlayerBoonRemove: foreach (Player p in log.PlayerList) { condition = mech.SpecialCondition; foreach (CombatItem c in log.GetBoonData(mech.SkillId)) { if (condition != null && !condition(new SpecialConditionItem(c))) { continue; } if (mech.MechanicType == Mechanic.MechType.PlayerBoonRemove) { if (c.IsBuffRemove == ParseEnum.BuffRemove.Manual && p.InstID == c.SrcInstid) { mechData[mech].Add(new MechanicLog(c.Time - start, mech, p)); } } else { if (c.IsBuffRemove == ParseEnum.BuffRemove.None && p.InstID == c.DstInstid) { mechData[mech].Add(new MechanicLog(c.Time - start, mech, p)); if (mech.MechanicType == Mechanic.MechType.PlayerOnPlayer) { mechData[mech].Add(new MechanicLog(c.Time - start, mech, log.PlayerList.FirstOrDefault(x => x.InstID == c.SrcInstid))); } } } } } break; case Mechanic.MechType.HitOnEnemy: foreach (Player p in log.PlayerList) { condition = mech.SpecialCondition; IEnumerable <AgentItem> agents = log.AgentData.GetAgentsByID((ushort)mech.SkillId); foreach (AgentItem a in agents) { foreach (DamageLog dl in p.GetDamageLogs(null, log, 0, log.FightData.FightDuration)) { if (dl.DstInstId != a.InstID || dl.IsCondi > 0 || dl.Time < a.FirstAware - start || dl.Time > a.LastAware - start || (condition != null && !condition(new SpecialConditionItem(dl)))) { continue; } mechData[mech].Add(new MechanicLog(dl.Time, mech, p)); } } } break; case Mechanic.MechType.PlayerSkill: foreach (Player p in log.PlayerList) { condition = mech.SpecialCondition; foreach (CombatItem c in log.GetCastDataById(mech.SkillId)) { if (condition != null && !condition(new SpecialConditionItem(c))) { continue; } if (c.IsActivation.IsCasting() && c.SrcInstid == p.InstID) { mechData[mech].Add(new MechanicLog(c.Time - fightData.FightStart, mech, p)); } } } break; case Mechanic.MechType.EnemyBoon: case Mechanic.MechType.EnemyBoonStrip: condition = mech.SpecialCondition; foreach (CombatItem c in log.GetBoonData(mech.SkillId)) { if (condition != null && !condition(new SpecialConditionItem(c))) { continue; } AbstractMasterPlayer amp = null; if (mech.MechanicType == Mechanic.MechType.EnemyBoon && c.IsBuffRemove == ParseEnum.BuffRemove.None) { Boss target = Targets.Find(x => x.InstID == c.DstInstid && x.FirstAware <= c.Time && x.LastAware >= c.Time); if (target != null) { amp = target; } else { AgentItem a = log.AgentData.GetAgent(c.DstAgent); if (playersIds.Contains(a.InstID)) { continue; } else if (a.MasterAgent != 0) { AgentItem m = log.AgentData.GetAgent(a.MasterAgent); if (playersIds.Contains(m.InstID)) { continue; } } if (!regroupedMobs.TryGetValue(a.ID, out amp)) { amp = new DummyPlayer(a); regroupedMobs.Add(a.ID, amp); } } } else if (mech.MechanicType == Mechanic.MechType.EnemyBoonStrip && c.IsBuffRemove == ParseEnum.BuffRemove.Manual) { Boss target = Targets.Find(x => x.InstID == c.SrcInstid && x.FirstAware <= c.Time && x.LastAware >= c.Time); if (target != null) { amp = target; } else { AgentItem a = log.AgentData.GetAgent(c.SrcAgent); if (playersIds.Contains(a.InstID)) { continue; } else if (a.MasterAgent != 0) { AgentItem m = log.AgentData.GetAgent(a.MasterAgent); if (playersIds.Contains(m.InstID)) { continue; } } if (!regroupedMobs.TryGetValue(a.ID, out amp)) { amp = new DummyPlayer(a); regroupedMobs.Add(a.ID, amp); } } } if (amp != null) { mechData[mech].Add(new MechanicLog(c.Time - fightData.FightStart, mech, amp)); } } break; case Mechanic.MechType.EnemyCastEnd: case Mechanic.MechType.EnemyCastStart: condition = mech.SpecialCondition; foreach (CombatItem c in log.GetCastDataById(mech.SkillId)) { if (condition != null && !condition(new SpecialConditionItem(c))) { continue; } AbstractMasterPlayer amp = null; if ((mech.MechanicType == Mechanic.MechType.EnemyCastStart && c.IsActivation.IsCasting()) || (mech.MechanicType == Mechanic.MechType.EnemyCastEnd && !c.IsActivation.IsCasting())) { Boss target = Targets.Find(x => x.InstID == c.SrcInstid && x.FirstAware <= c.Time && x.LastAware >= c.Time); if (target != null) { amp = target; } else { AgentItem a = log.AgentData.GetAgent(c.SrcAgent); if (playersIds.Contains(a.InstID)) { continue; } else if (a.MasterAgent != 0) { AgentItem m = log.AgentData.GetAgent(a.MasterAgent); if (playersIds.Contains(m.InstID)) { continue; } } if (!regroupedMobs.TryGetValue(a.ID, out amp)) { amp = new DummyPlayer(a); regroupedMobs.Add(a.ID, amp); } } } if (amp != null) { mechData[mech].Add(new MechanicLog(c.Time - fightData.FightStart, mech, amp)); } } break; case Mechanic.MechType.Spawn: foreach (AgentItem a in log.AgentData.GetAgentByType(AgentItem.AgentType.NPC).Where(x => x.ID == mech.SkillId)) { if (!regroupedMobs.TryGetValue(a.ID, out AbstractMasterPlayer amp)) { amp = new DummyPlayer(a); regroupedMobs.Add(a.ID, amp); } mechData[mech].Add(new MechanicLog(a.FirstAware - fightData.FightStart, mech, amp)); } break; } } mechData.ComputePresentMechanics(log); }
public static List <IEffect> getCommand(FullCombatCharacter source, List <FullCombatCharacter> targets, CombatData combatData) { if (source.className == "Goblin") { return(Goblins.GoblinAbilityProcessing.getCommand(source, targets, combatData)); } return(new List <IEffect>()); }
internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, IReadOnlyCollection <AgentItem> playerAgents) { SetSuccessByDeath(combatData, fightData, playerAgents, true, (int)ArcDPSEnums.TargetID.BrokenKing); }
internal override FightData.CMStatus IsCM(CombatData combatData, AgentData agentData, FightData fightData) { return(FightData.CMStatus.CMnoName); }
internal virtual FightData.CMStatus IsCM(CombatData combatData, AgentData agentData, FightData fightData) { return(FightData.CMStatus.NoCM); }
private void update_power() { List <string> strs = new List <string>(); strs.AddRange(HTML.GetHead(this.fPower.Name, "", DisplaySize.Small)); strs.Add("<BODY>"); strs.Add("<P class=table>"); strs.Add("<TABLE>"); strs.AddRange(this.fPower.AsHTML(null, CardMode.View, false)); strs.Add("</TABLE>"); strs.Add("</P>"); strs.Add("<P class=instruction align=left>"); strs.Add("Click to add an attack roll for:"); string str = ""; foreach (Hero hero in Session.Project.Heroes) { CombatData combatData = hero.CombatData; if (this.roll_exists(hero.ID) || hero.GetState(combatData.Damage) == CreatureState.Defeated) { continue; } if (str != "") { str = string.Concat(str, " | "); } object obj = str; object[] d = new object[] { obj, "<A href=hero:", hero.ID, ">", hero.Name, "</A>" }; str = string.Concat(d); } if (str != "") { strs.Add("<BR>"); strs.Add(str); } string str1 = ""; foreach (EncounterSlot slot in this.fEncounter.Slots) { foreach (CombatData combatDatum in slot.CombatData) { if (this.roll_exists(combatDatum.ID) || slot.GetState(combatDatum) == CreatureState.Defeated) { continue; } if (str1 != "") { str1 = string.Concat(str1, " | "); } object obj1 = str1; object[] objArray = new object[] { obj1, "<A href=opponent:", combatDatum.ID, ">", combatDatum.DisplayName, "</A>" }; str1 = string.Concat(objArray); } } if (str1 != "") { strs.Add("<BR>"); strs.Add(str1); } strs.Add("<BR>"); strs.Add("<A href=target:blank>An unnamed target</A>"); strs.Add("</P>"); strs.Add("</BODY>"); strs.Add("</HTML>"); this.PowerBrowser.DocumentText = HTML.Concatenate(strs); }
protected override void Damage(CombatData combatData) { // ignored }
/// <summary> /// Applies this an attack effect to an instance of CombatData /// </summary> /// <param name="cd">The combat data to modify</param> public abstract void Apply(ref CombatData cd);
/// <summary> /// Applies the unblockable modifier to this attack - removes the defender's Blocking modifier. /// </summary> /// <param name="cd">The defender's combat data</param> public override void Apply(ref CombatData cd) { cd.Blocking = false; }
internal override string GetLogicName(CombatData combatData, AgentData agentData) { return("Bandit Trio"); }
/*protected override CombatReplayMap GetCombatMapInternal() * { * return new CombatReplayMap("https://i.imgur.com/RZbs21b.png", * (1099, 1114), * (-5467, 8069, -2282, 11297), * (-12288, -27648, 12288, 27648), * (1920, 12160, 2944, 14464)); * }*/ internal override string GetLogicName(CombatData combatData, AgentData agentData) { return("Escort"); }
internal override FightData.CMStatus IsCM(CombatData combatData, AgentData agentData, FightData fightData) { return(combatData.GetSkills().Contains(38098) ? FightData.CMStatus.CM : FightData.CMStatus.NoCM); }
internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, IReadOnlyCollection <AgentItem> playerAgents) { fightData.SetSuccess(true, fightData.FightEnd); }
protected virtual void KnockBack(CombatData combatData) { }
protected override void KnockBack(CombatData combatData) { base.KnockBack(combatData); }
void update_power() { List <string> lines = new List <string>(); lines.AddRange(HTML.GetHead(fPower.Name, "", Session.Preferences.TextSize)); lines.Add("<BODY>"); lines.Add("<P class=table>"); lines.Add("<TABLE>"); lines.AddRange(fPower.AsHTML(null, CardMode.View, false)); lines.Add("</TABLE>"); lines.Add("</P>"); lines.Add("<P class=instruction align=left>"); lines.Add("Click to add an attack roll for:"); string heroes = ""; foreach (Hero hero in Session.Project.Heroes) { CombatData cd = hero.CombatData; if ((!roll_exists(hero.ID)) && (hero.GetState(cd.Damage) != CreatureState.Defeated)) { if (heroes != "") { heroes += " | "; } heroes += "<A href=hero:" + hero.ID + ">" + hero.Name + "</A>"; } } if (heroes != "") { lines.Add("<BR>"); lines.Add(heroes); } string creatures = ""; foreach (EncounterSlot slot in fEncounter.Slots) { foreach (CombatData cd in slot.CombatData) { if ((!roll_exists(cd.ID)) && (slot.GetState(cd) != CreatureState.Defeated)) { if (creatures != "") { creatures += " | "; } creatures += "<A href=opponent:" + cd.ID + ">" + cd.DisplayName + "</A>"; } } } if (creatures != "") { lines.Add("<BR>"); lines.Add(creatures); } lines.Add("<BR>"); lines.Add("<A href=target:blank>An unnamed target</A>"); lines.Add("</P>"); lines.Add("</BODY>"); lines.Add("</HTML>"); PowerBrowser.DocumentText = HTML.Concatenate(lines); }
public AddEffectCommand(CombatData data, OngoingCondition effect) { _data = data; _effect = effect; }
internal virtual void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents) { SetSuccessByDeath(combatData, fightData, playerAgents, true, GenericTriggerID); }
internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents) { fightData.SetSuccess(true, fightData.FightEnd); }
internal override FightData.EncounterMode GetEncounterMode(CombatData combatData, AgentData agentData, FightData fightData) { return(FightData.EncounterMode.CMNoName); }
protected void SetSuccessByCombatExit(HashSet <int> targetIds, CombatData combatData, FightData fightData, HashSet <AgentItem> playerAgents) { var targets = Targets.Where(x => targetIds.Contains(x.ID)).ToList(); SetSuccessByCombatExit(targets, combatData, fightData, playerAgents); }
public static void AttachMasterToRangerGadgets(IReadOnlyList <Player> players, CombatData combatData) { var playerAgents = new HashSet <AgentItem>(players.Select(x => x.AgentItem)); // entangle works fine already HashSet <AgentItem> jacarandaEmbraces = ProfHelper.GetOffensiveGadgetAgents(combatData, 1286, playerAgents); HashSet <AgentItem> blackHoles = ProfHelper.GetOffensiveGadgetAgents(combatData, 31436, playerAgents); var rangers = players.Where(x => x.BaseSpec == Spec.Ranger).ToList(); // if only one ranger, could only be that one if (rangers.Count == 1) { Player ranger = rangers[0]; ProfHelper.SetGadgetMaster(jacarandaEmbraces, ranger.AgentItem); ProfHelper.SetGadgetMaster(blackHoles, ranger.AgentItem); } else if (rangers.Count > 1) { ProfHelper.AttachMasterToGadgetByCastData(combatData, jacarandaEmbraces, new List <long> { 44980 }, 1000); ProfHelper.AttachMasterToGadgetByCastData(combatData, blackHoles, new List <long> { 31503 }, 1000); } }
void init(OngoingCondition condition, CombatData current_actor, int current_round) { fHeights[ConditionBtn] = ConditionPanel.Height; fHeights[DamageBtn] = DamagePanel.Height; fHeights[DefenceBtn] = DefencePanel.Height; fHeights[DamageModBtn] = DamageModPanel.Height; fHeights[RegenBtn] = RegenPanel.Height; fHeights[AuraBtn] = AuraPanel.Height; fCondition = condition.Copy(); fCurrentActor = current_actor; fCurrentRound = current_round; ConditionBtn.Checked = (fCondition.Type == OngoingType.Condition); ConditionBox.Text = (fCondition.Data != "") ? fCondition.Data : BLANK_EFFECT; DamageBtn.Checked = (fCondition.Type == OngoingType.Damage); DamageBox.Value = fCondition.Value; DamageTypeBox.SelectedItem = fCondition.DamageType; DefenceBtn.Checked = (fCondition.Type == OngoingType.DefenceModifier); DefenceModBox.Value = fCondition.DefenceMod; if (fCondition.Defences.Count == 0) { fCondition.Defences.Add(DefenceType.AC); } ACBox.Checked = fCondition.Defences.Contains(DefenceType.AC); FortBox.Checked = fCondition.Defences.Contains(DefenceType.Fortitude); RefBox.Checked = fCondition.Defences.Contains(DefenceType.Reflex); WillBox.Checked = fCondition.Defences.Contains(DefenceType.Will); if (fCondition.DamageModifier.Value < 0) { DamageModDirBox.SelectedItem = RESIST; } if (fCondition.DamageModifier.Value > 0) { DamageModDirBox.SelectedItem = VULNERABLE; } if (fCondition.DamageModifier.Value == 0) { DamageModDirBox.SelectedItem = IMMUNE; } DamageModValueBox.Value = Math.Abs(fCondition.DamageModifier.Value); DamageModTypeBox.SelectedItem = fCondition.DamageModifier.Type; RegenValueBox.Value = fCondition.Regeneration.Value; RegenConditionsBox.Text = fCondition.Regeneration.Details; AuraRadiusBox.Value = fCondition.Aura.Radius; AuraDetailsBox.Text = fCondition.Aura.Description; switch (fCondition.Duration) { case DurationType.Encounter: DurationBox.SelectedItem = ENCOUNTER; break; case DurationType.SaveEnds: DurationBox.SelectedItem = SAVE_ENDS; ModBox.Value = fCondition.SavingThrowModifier; break; case DurationType.BeginningOfTurn: DurationBox.SelectedItem = START; break; case DurationType.EndOfTurn: DurationBox.SelectedItem = END; break; } if (fCondition.DurationCreatureID != Guid.Empty) { DurationCreatureBox.SelectedItem = get_item(fCondition.DurationCreatureID); } else { if (fCurrentActor != null) { DurationCreatureBox.SelectedItem = get_item(fCurrentActor.ID); } else { DurationCreatureBox.SelectedItem = DurationCreatureBox.Items[0]; } } }
internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, HashSet <AgentItem> playerAgents) { SetSuccessByDeath(combatData, fightData, playerAgents, true, (int)ArcDPSEnums.TargetID.SoulEater); }
private FinalStatsAll GetFinalStats(Player p, int phaseIndex) { PhaseData phase = _statistics.Phases[phaseIndex]; long start = _log.FightData.ToLogSpace(phase.Start); long end = _log.FightData.ToLogSpace(phase.End); Dictionary <Target, FinalStats> targetDict = new Dictionary <Target, FinalStats>(); foreach (Target target in _log.FightData.Logic.Targets) { if (!_statistics.StatsTarget.ContainsKey(target)) { _statistics.StatsTarget[target] = new Dictionary <Player, FinalStats[]>(); } Dictionary <Player, FinalStats[]> targetStats = _statistics.StatsTarget[target]; if (!targetStats.ContainsKey(p)) { targetStats[p] = new FinalStats[_statistics.Phases.Count]; } targetStats[p][phaseIndex] = new FinalStats(); targetDict[target] = targetStats[p][phaseIndex]; } FinalStatsAll final = new FinalStatsAll(); FillFinalStats(p.GetJustPlayerDamageLogs(null, _log, phase.Start, phase.End), final, targetDict); if (p.Account == ":Conjured Sword") { return(final); } foreach (CastLog cl in p.GetCastLogs(_log, phase.Start, phase.End)) { if (cl.EndActivation == ParseEnum.Activation.CancelCancel) { final.Wasted++; final.TimeWasted += cl.ActualDuration; } if (cl.EndActivation == ParseEnum.Activation.CancelFire) { if (cl.ActualDuration < cl.ExpectedDuration) { final.Saved++; final.TimeSaved += cl.ExpectedDuration - cl.ActualDuration; } } } final.TimeSaved = Math.Round(final.TimeSaved / 1000.0, 3); final.TimeWasted = Math.Round(final.TimeWasted / 1000.0, 3); double avgBoons = 0; foreach (long duration in p.GetBoonPresence(_log, phaseIndex).Values) { avgBoons += duration; } final.AvgBoons = avgBoons / phase.GetDuration(); double avgCondis = 0; foreach (long duration in p.GetCondiPresence(_log, phaseIndex).Values) { avgCondis += duration; } final.AvgConditions = avgCondis / phase.GetDuration(); // Counts CombatData combatData = _log.CombatData; final.SwapCount = p.GetCastLogs(_log, 0, _log.FightData.FightDuration).Count(x => x.SkillId == SkillItem.WeaponSwapId); if (_settings.ParseCombatReplay && _log.FightData.Logic.CanCombatReplay) { if (_statistics.StackCenterPositions == null) { _statistics.StackCenterPositions = new List <Point3D>(); List <List <Point3D> > GroupsPosList = new List <List <Point3D> >(); foreach (Player player in _log.PlayerList) { if (player.Account == ":Conjured Sword") { continue; } GroupsPosList.Add(player.CombatReplay.GetActivePositions()); } for (int time = 0; time < GroupsPosList[0].Count; time++) { float x = 0; float y = 0; float z = 0; int activePlayers = GroupsPosList.Count; foreach (List <Point3D> points in GroupsPosList) { Point3D point = points[time]; if (point != null) { x += point.X; y += point.Y; z += point.Z; } else { activePlayers--; } } x = x / activePlayers; y = y / activePlayers; z = z / activePlayers; _statistics.StackCenterPositions.Add(new Point3D(x, y, z, _settings.PollingRate * time)); } } List <Point3D> positions = p.CombatReplay.Positions.Where(x => x.Time >= phase.Start && x.Time <= phase.End).ToList(); int offset = p.CombatReplay.Positions.Count(x => x.Time < phase.Start); if (positions.Count > 1) { List <float> distances = new List <float>(); for (int time = 0; time < positions.Count; time++) { float deltaX = positions[time].X - _statistics.StackCenterPositions[time + offset].X; float deltaY = positions[time].Y - _statistics.StackCenterPositions[time + offset].Y; //float deltaZ = positions[time].Z - StackCenterPositions[time].Z; distances.Add((float)Math.Sqrt(deltaX * deltaX + deltaY * deltaY)); } final.StackDist = distances.Sum() / distances.Count; } else { final.StackDist = -1; } } return(final); }
private void calculateStats() { foreach (Player player in log.getPlayerList()) { Statistics.FinalStats[] phaseStats = new Statistics.FinalStats[phases.Count]; for (int phaseIndex = 0; phaseIndex < phases.Count; phaseIndex++) { Statistics.FinalStats final = new Statistics.FinalStats(); PhaseData phase = phases[phaseIndex]; long start = phase.getStart() + log.getBossData().getFirstAware(); long end = phase.getEnd() + log.getBossData().getFirstAware(); List <DamageLog> damageLogs = player.getDamageLogs(0, log, phase.getStart(), phase.getEnd()); List <DamageLog> damageLogsBoss = player.getDamageLogs(log.getBoss().getInstid(), log, phase.getStart(), phase.getEnd()); List <CastLog> castLogs = player.getCastLogs(log, phase.getStart(), phase.getEnd()); int instid = player.getInstid(); final.powerLoopCount = 0; final.criticalRate = 0; final.criticalDmg = 0; final.scholarRate = 0; final.scholarDmg = 0; final.movingRate = 0; final.flankingRate = 0; final.glanceRate = 0; final.missed = 0; final.interupts = 0; final.invulned = 0; final.wasted = 0; final.timeWasted = 0; final.saved = 0; final.timeSaved = 0; final.powerLoopCountBoss = 0; final.criticalRateBoss = 0; final.criticalDmgBoss = 0; final.scholarRateBoss = 0; final.scholarDmgBoss = 0; final.movingRateBoss = 0; final.flankingRateBoss = 0; final.glanceRateBoss = 0; final.missedBoss = 0; final.interuptsBoss = 0; final.invulnedBoss = 0; foreach (DamageLog log in damageLogs) { if (log.isCondi() == 0) { if (log.getResult() == ParseEnum.Result.Crit) { final.criticalRate++; final.criticalDmg += log.getDamage(); } if (log.isNinety() > 0) { final.scholarRate++; final.scholarDmg += (int)(log.getDamage() / 11.0); //regular+10% damage } final.movingRate += log.isMoving(); final.flankingRate += log.isFlanking(); if (log.getResult() == ParseEnum.Result.Glance) { final.glanceRate++; } if (log.getResult() == ParseEnum.Result.Blind) { final.missed++; } if (log.getResult() == ParseEnum.Result.Interrupt) { final.interupts++; } if (log.getResult() == ParseEnum.Result.Absorb) { final.invulned++; } final.powerLoopCount++; } } foreach (DamageLog log in damageLogsBoss) { if (log.isCondi() == 0) { if (log.getResult() == ParseEnum.Result.Crit) { final.criticalRateBoss++; final.criticalDmgBoss += log.getDamage(); } if (log.isNinety() > 0) { final.scholarRateBoss++; final.scholarDmgBoss += (int)(log.getDamage() / 11.0); //regular+10% damage } final.movingRateBoss += log.isMoving(); final.flankingRateBoss += log.isFlanking(); if (log.getResult() == ParseEnum.Result.Glance) { final.glanceRateBoss++; } if (log.getResult() == ParseEnum.Result.Blind) { final.missedBoss++; } if (log.getResult() == ParseEnum.Result.Interrupt) { final.interuptsBoss++; } if (log.getResult() == ParseEnum.Result.Absorb) { final.invulnedBoss++; } final.powerLoopCountBoss++; } } foreach (CastLog cl in castLogs) { if (cl.endActivation() == ParseEnum.Activation.CancelCancel) { final.wasted++; final.timeWasted += cl.getActDur(); } if (cl.endActivation() == ParseEnum.Activation.CancelFire) { final.saved++; if (cl.getActDur() < cl.getExpDur()) { final.timeSaved += cl.getExpDur() - cl.getActDur(); } } } final.timeSaved = final.timeSaved / 1000f; final.timeWasted = final.timeWasted / 1000f; final.totalDmg = damageLogs.Sum(x => x.getDamage()); final.powerLoopCount = final.powerLoopCount == 0 ? 1 : final.powerLoopCount; final.totalDmgBoss = damageLogsBoss.Sum(x => x.getDamage()); final.powerLoopCountBoss = final.powerLoopCountBoss == 0 ? 1 : final.powerLoopCountBoss; // Counts CombatData combatData = log.getCombatData(); final.swapCount = combatData.getStates(instid, ParseEnum.StateChange.WeaponSwap, start, end).Count(); final.downCount = combatData.getStates(instid, ParseEnum.StateChange.ChangeDown, start, end).Count(); final.dodgeCount = combatData.getSkillCount(instid, 65001, start, end) + combatData.getBuffCount(instid, 40408, start, end); //dodge = 65001 mirage cloak =40408 final.ressCount = combatData.getSkillCount(instid, 1066, start, end); //Res = 1066 // R.I.P List <CombatItem> dead = combatData.getStates(instid, ParseEnum.StateChange.ChangeDead, start, end); final.died = 0.0; if (dead.Count() > 0) { final.died = dead[0].getTime() - start; } List <CombatItem> disconect = combatData.getStates(instid, ParseEnum.StateChange.Despawn, start, end); final.dcd = 0.0; if (disconect.Count() > 0) { final.dcd = disconect[0].getTime() - start; } phaseStats[phaseIndex] = final; } statistics.stats[player] = phaseStats; } }
internal BuffsContainer(ulong build, CombatData combatData, ParserController operation) { var AllBuffs = new List <List <Buff> >() { Boons, Conditions, Commons, Gear, NormalFoods, AscendedFood, FoodProcs, Utilities, Potions, Writs, FightSpecific, FractalInstabilities, // RevenantHelper.Buffs, HeraldHelper.Buffs, RenegadeHelper.Buffs, VindicatorHelper.Buffs, // WarriorHelper.Buffs, BerserkerHelper.Buffs, SpellbreakerHelper.Buffs, BladeswornHelper.Buffs, // GuardianHelper.Buffs, DragonhunterHelper.Buffs, FirebrandHelper.Buffs, WillbenderHelper.Buffs, // RangerHelper.Buffs, DruidHelper.Buffs, SoulbeastHelper.Buffs, UntamedHelper.Buffs, // ThiefHelper.Buffs, DaredevilHelper.Buffs, DeadeyeHelper.Buffs, SpecterHelper.Buffs, // EngineerHelper.Buffs, ScrapperHelper.Buffs, HolosmithHelper.Buffs, MechanistHelper.Buffs, // MesmerHelper.Buffs, ChronomancerHelper.Buffs, MirageHelper.Buffs, VirtuosoHelper.Buffs, // NecromancerHelper.Buffs, ReaperHelper.Buffs, ScourgeHelper.Buffs, HarbingerHelper.Buffs, // ElementalistHelper.Buffs, TempestHelper.Buffs, WeaverHelper.Buffs, CatalystHelper.Buffs, }; var currentBuffs = new List <Buff>(); foreach (List <Buff> buffs in AllBuffs) { currentBuffs.AddRange(buffs.Where(x => x.Available(build))); } _buffsByName = currentBuffs.GroupBy(x => x.Name).ToDictionary(x => x.Key, x => { var list = x.ToList(); if (list.Count > 1) { throw new InvalidDataException("Same name present multiple times in buffs - " + x.First().Name); } return(x.First()); }); // Unknown consumables var buffIDs = new HashSet <long>(currentBuffs.Select(x => x.ID)); var foodAndUtility = new List <BuffInfoEvent>(combatData.GetBuffInfoEvent(BuffCategory.Enhancement)); foodAndUtility.AddRange(combatData.GetBuffInfoEvent(BuffCategory.Food)); foreach (BuffInfoEvent buffInfoEvent in foodAndUtility) { if (!buffIDs.Contains(buffInfoEvent.BuffID)) { string name = buffInfoEvent.Category == BuffCategory.Enhancement ? "Utility" : "Food"; string link = buffInfoEvent.Category == BuffCategory.Enhancement ? "https://wiki.guildwars2.com/images/2/23/Nourishment_utility.png" : "https://wiki.guildwars2.com/images/c/ca/Nourishment_food.png"; operation.UpdateProgressWithCancellationCheck("Creating consumable " + name + " " + buffInfoEvent.BuffID); currentBuffs.Add(CreateCustomConsumable(name, buffInfoEvent.BuffID, link, buffInfoEvent.MaxStacks)); } } // BuffsByIds = currentBuffs.GroupBy(x => x.ID).ToDictionary(x => x.Key, x => { var list = x.ToList(); if (list.Count > 1 && x.Key != SkillIDs.NoBuff && x.Key != SkillIDs.Unknown) { throw new InvalidDataException("Same id present multiple times in buffs - " + x.First().ID); } return(x.First()); }); operation.UpdateProgressWithCancellationCheck("Adjusting Buffs"); BuffInfoSolver.AdjustBuffs(combatData, BuffsByIds, operation, build); foreach (Buff buff in currentBuffs) { BuffInfoEvent buffInfoEvt = combatData.GetBuffInfoEvent(buff.ID); if (buffInfoEvt != null) { foreach (BuffFormula formula in buffInfoEvt.Formulas) { if (formula.Attr1 == BuffAttribute.Unknown) { operation.UpdateProgressWithCancellationCheck("Unknown Formula for " + buff.Name + ": " + formula.GetDescription(true, BuffsByIds)); } } } } BuffsByClassification = currentBuffs.GroupBy(x => x.Classification).ToDictionary(x => x.Key, x => (IReadOnlyList <Buff>)x.ToList()); BuffsBySource = currentBuffs.GroupBy(x => x.Source).ToDictionary(x => x.Key, x => (IReadOnlyList <Buff>)x.ToList()); // _buffSourceFinder = GetBuffSourceFinder(build, new HashSet <long>(BuffsByClassification[BuffClassification.Boon].Select(x => x.ID))); }
// Performs the skill and all its effects protected abstract bool performSkill(List <AbstractCreature> target, CombatData data);
protected override Dictionary <AgentItem, List <EffectEvent> > GetEffectEventDict(EffectGUIDEvent effectGUIDEvent, CombatData combatData) { return(combatData.GetEffectEvents(effectGUIDEvent.ContentID).Where(x => x.IsAroundDst).GroupBy(x => x.Dst).ToDictionary(x => x.Key, x => x.ToList())); }