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) { } } }
/// <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; }