Exemple #1
0
	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);
 }
Exemple #7
0
 internal virtual FightData.CMStatus IsCM(CombatData combatData, AgentData agentData, FightData fightData)
 {
     return(FightData.CMStatus.NoCM);
 }
Exemple #8
0
        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);
        }
Exemple #9
0
 protected override void Damage(CombatData combatData)
 {
     // ignored
 }
Exemple #10
0
 /// <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);
Exemple #11
0
 /// <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;
 }
Exemple #12
0
 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");
        }
Exemple #14
0
 internal override FightData.CMStatus IsCM(CombatData combatData, AgentData agentData, FightData fightData)
 {
     return(combatData.GetSkills().Contains(38098) ? FightData.CMStatus.CM : FightData.CMStatus.NoCM);
 }
Exemple #15
0
 internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, IReadOnlyCollection <AgentItem> playerAgents)
 {
     fightData.SetSuccess(true, fightData.FightEnd);
 }
    protected virtual void KnockBack(CombatData combatData)
    {

    }
Exemple #17
0
 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);
        }
Exemple #19
0
 public AddEffectCommand(CombatData data, OngoingCondition effect)
 {
     _data   = data;
     _effect = effect;
 }
Exemple #20
0
 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);
 }
Exemple #22
0
 internal override FightData.EncounterMode GetEncounterMode(CombatData combatData, AgentData agentData, FightData fightData)
 {
     return(FightData.EncounterMode.CMNoName);
 }
Exemple #23
0
        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);
        }
Exemple #24
0
        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);
            }
        }
Exemple #25
0
        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);
 }
Exemple #27
0
        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;
            }
        }
Exemple #29
0
        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);
Exemple #31
0
 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()));
 }