コード例 #1
0
        private void SetDotSpace(FFXIVLogDataSet.AnaylzedRow arow)
        {
            if (!arow.IsEffectOn)
                return ;

            FFXIVLogDataSet.ActionRow action = ds.Action.FindByName(arow.EffectName);
            if (action == null && arow.EffectName == "桜花狂咲")
            {
                action = ds.Action.FindByName("桜華狂咲");
            }

            if (action == null || action.Dot威力 == 0)
            {
                return;//DOT以外は除外
            }

            arow.IsDot = true;
            arow.Dot_Iryoku = action.Dot威力;
            arow.DotSecs = action.効果時間;
            DotRowList.Add(arow);

            if (arow.IsFromNull() || arow.From == "" || arow.From == FF14LogParser.UnknownName)
                return ;
            FFXIVLogDataSet.ActorRow actor = ds.Actor.FindByName(arow.From);
            ////DDダメージを取得
            if (!actor.IsDamageBaseNull())
            {
                arow.DamageBase = actor.DamageBase;
            }
            if (actor.IsNPC || actor.IsOther)
            {
                arow.DotSecs = action.効果時間;//NPC, OTHER はMAXのデフォルトの効果時間
                return ;
            }

           //上書き、効果時間の判定         
            //効果時間内の同じアクション
            FFXIVLogDataSet.AnaylzedRow[] sames = (FFXIVLogDataSet.AnaylzedRow[])ds.Anaylzed.Select(String.Format("ID < {0} and IsEffecton = true and EffectName = '{1}' and To = '{2}' and TotalSeconds > {3} and From = '{4}'",
                arow.ID,
                action.Name,
                arow.To.Replace("'", "''"),
                arow.TotalSeconds - action.効果時間,
                arow.From.Replace("'", "''")));
            if (sames.Length > 0)
            {
                FFXIVLogDataSet.AnaylzedRow[] rows = (FFXIVLogDataSet.AnaylzedRow[])ds.Anaylzed.Select(String.Format("IsKo = false and ToType = 3 and To = '{0}' and EnemyGroupID = {1} and ID >= {2}",
            arow.To, arow.EnemyGroupID,sames[0].ID), "ID");
                FFXIVLogDataSet.AnaylzedRow[] ko_rows = (FFXIVLogDataSet.AnaylzedRow[])ds.Anaylzed.Select(String.Format("IsKo = true and To = '{0}' and EnemyGroupID = {1} and ID > {2}",
                    arow.To, arow.EnemyGroupID, sames[0].ID), "ID");
                arow.DotSpace = sames[0].DotSpace + rows.Length - ko_rows.Length - 1;
                if (arow.DotSpace < 0)
                {
                    arow.DotSpace = 0;
                    sames[sames.Length-1].IsOverride = true;//上書きされた
                    sames[sames.Length-1].DotEndSeconds = arow.TotalSeconds;
                }
            }
            else
            {
                FFXIVLogDataSet.EnemyGroupRow eg = ds.EnemyGroup.FindByName(arow.To);
                if (eg == null)
                {
                    arow.DotSpace = 0;
                    return;
                }
                arow.DotSpace = eg.Count - eg.KOCount - 1;
                if (arow.DotSpace < 0)
                {
                    arow.DotSpace = 0;
                }
                else if (arow.DotSpace > 0)
                {
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// ダメージ系のアナライズ
        /// </summary>
        /// <param name="arow"></param>
        /// <param name="log"></param>
        private void HitAnalyze(FFXIVLogDataSet.AnaylzedRow arow, FFXIVLog log)
        {
            //敵視UPの場合
            if (log.LogBodyReplaceTabCode.Contains("敵視をアップ"))
            {
                Regex HateRegex = new Regex(@":  ⇒ (?<to>.+)の敵視をアップ。");
                Match match = HateRegex.Match(log.LogBodyReplaceTabCode.Replace("{022705CF01010103}", "").Replace("{0227050101010103}", ""));// System.Diagnostics.Debug.Write(log.LogBody);
                arow.To = NameConvertTo(log,match.Groups["to"].Value);
                arow.IsDamage = true;
                arow.IsHate = true;
                SearchAction(arow, log);
                return;
            }

            else
            {
                Regex HitRegex = new Regex(@":(\s|(?<from>.+)の(?<action>攻撃))\s⇒\s(|(?<crit>クリティカル!)\s)(?<to>[^!]+)[はに](|(?<dodge>[^\d\s]*)\s)(?<dmg>\d+)(|\((?<bonus>[+-]\d+)\%\))ダメージ");

                arow.IsDamage = true;//ダメージタイプである
                arow.IsHP = true;//HPに影響する

                Match match = HitRegex.Match(log.LogBodyReplaceTabCode.Replace("{022705CF01010103}", "").Replace("{0227050101010103}", "")); //System.Diagnostics.Debug.Write(log.LogBody);
                arow.From = NameConvertFrom(log,match.Groups["from"].Value);
                arow.To = NameConvertTo(log,match.Groups["to"].Value);
                arow.ActionName = match.Groups["action"].Value;
                if (match.Groups["dmg"].Value != "")
                {
                    arow.Numeric = Convert.ToInt32(match.Groups["dmg"].Value,10);
                }
                arow.IsCritical = match.Groups["crit"].Value != "";
                if (match.Groups["bonus"].Value != "")
                {
                    arow.BonusRate = Convert.ToInt32(match.Groups["bonus"].Value);
                }
                if (match.Groups["dodge"].Value.Contains("ブロック"))
                {
                    arow.IsBlock = true;
                }
                if (match.Groups["dodge"].Value.Contains("受け流し"))
                {
                    arow.IsParry = true;
                }
            }
            if (arow.From == "")
            {
                SearchAction(arow, log);
            }

            if (arow.IsFromNull()) arow.From = FF14LogParser.UnknownName;
            if (arow.IsActionNameNull()) arow.ActionName = FF14LogParser.UnknownName;

            //int damage = Convert.ToInt32(match.Groups["damage"].Value,10);
            //int bonus = Convert.ToInt32(match.Groups["bonus"].Value,10);
            //string to = match.Groups["to"].Value;
        }