/// <summary> /// Addedのログを格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreAddedLog( LogLineEventArgs logInfo) { var match = ConstantKeywords.AddedRegex.Match(logInfo.logLine); if (!match.Success) { return; } var log = new CombatLog() { TimeStamp = logInfo.detectedTime, Raw = logInfo.logLine, Actor = match.Groups["actor"].ToString(), Activity = $"Added", LogType = LogTypes.Added, }; log.Text = $"Add {log.Actor}"; log.SyncKeyword = log.RawWithoutTimestamp.Substring(0, log.RawWithoutTimestamp.IndexOf('.')); if (this.ToStoreActor(log.Actor)) { this.StoreLog(log); } }
/// <summary> /// キャストログを格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreCastStartsUsingLog( LogLineEventArgs logInfo) { var match = ConstantKeywords.StartsUsingRegex.Match(logInfo.logLine); if (!match.Success) { return; } var log = new CombatLog() { TimeStamp = logInfo.detectedTime, Raw = logInfo.logLine, Actor = match.Groups["actor"].ToString(), Activity = $"starts using {match.Groups["skill"].ToString()}", Skill = match.Groups["skill"].ToString(), LogType = LogTypes.CastStart }; log.Text = log.Skill; log.SyncKeyword = log.RawWithoutTimestamp.Substring(6); if (this.ToStoreActor(log.Actor)) { this.StoreLog(log); } }
/// <summary> /// セリフを格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreDialog( LogLineEventArgs logInfo) { var match = ConstantKeywords.DialogRegex.Match(logInfo.logLine); if (!match.Success) { return; } var dialog = match.Groups["dialog"].ToString(); var isSystem = logInfo.logLine.Contains(":0839"); var log = new CombatLog() { TimeStamp = logInfo.detectedTime, Raw = logInfo.logLine, Actor = string.Empty, Activity = isSystem ? "System" : "Dialog", LogType = LogTypes.Dialog }; log.Text = null; log.SyncKeyword = log.RawWithoutTimestamp.Substring(8); this.StoreLog(log); }
/// <summary> /// キャストログを格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreCastLog( XIVLog xivLog) { var match = ConstantKeywords.CastRegex.Match(xivLog.LogLine); if (!match.Success) { match = ConstantKeywords.StartsUsingRegex.Match(xivLog.LogLine); if (!match.Success) { return; } } var log = new CombatLog() { TimeStamp = xivLog.DetectTime, Raw = xivLog.LogLine, Actor = match.Groups["actor"].ToString(), Activity = $"{match.Groups["skill"].ToString()} Start", Skill = match.Groups["skill"].ToString(), LogType = LogTypes.CastStart }; log.Text = log.Skill; log.SyncKeyword = log.RawWithoutTimestamp.Substring(8); if (this.ToStoreActor(log.Actor)) { this.StoreLog(log, xivLog); } }
/// <summary> /// マーカーログを格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreMarkerLog( LogLineEventArgs logInfo) { const string PCIDPlaceholder = "(?<pcid>.{8})"; var log = default(CombatLog); var match = ConstantKeywords.MarkerRegex.Match(logInfo.logLine); if (match.Success) { // ログなしマーカ var id = match.Groups["id"].ToString(); var target = match.Groups["target"].ToString(); var targetJobName = this.ToNameToJob(target); log = new CombatLog() { TimeStamp = logInfo.detectedTime, Raw = logInfo.logLine .Replace(id, PCIDPlaceholder) .Replace(target, targetJobName), Activity = $"Marker:{match.Groups["type"].ToString()}", LogType = LogTypes.Marker }; } else { // マーキング match = ConstantKeywords.MarkingRegex.Match(logInfo.logLine); if (!match.Success) { return; } var target = match.Groups["target"].ToString(); var targetJobName = this.ToNameToJob(target); log = new CombatLog() { TimeStamp = logInfo.detectedTime, Raw = logInfo.logLine .Replace(target, targetJobName), Activity = $"Marking", LogType = LogTypes.Marker }; } if (log != null) { log.Text = log.Activity; log.SyncKeyword = log.RawWithoutTimestamp; if (this.ToStoreActor(log.Actor)) { this.StoreLog(log); } } }
/// <summary> /// 記録用ログを格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreRecordLog( LogLineEventArgs logInfo) { var log = new CombatLog() { TimeStamp = logInfo.detectedTime, Raw = logInfo.logLine, LogType = LogTypes.Unknown }; this.StoreLog(log); }
/// <summary> /// 記録用ログを格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreRecordLog( XIVLog xivLog) { var log = new CombatLog() { TimeStamp = xivLog.DetectTime, Raw = xivLog.LogLine, LogType = LogTypes.Unknown }; this.StoreLog(log, xivLog); }
/// <summary> /// ログを格納する /// </summary> /// <param name="log">ログ</param> /// <param name="logLine">ログイベント引数</param> private void StoreLog( CombatLog log, XIVLog xivLog) { var zone = xivLog.ZoneName; zone = string.IsNullOrEmpty(zone) ? "UNKNOWN" : zone; lock (this.CurrentCombatLogList) { // IDを発番する log.ID = this.id; this.id++; // 今回の分析の連番を付与する log.No = this.no; this.no++; // 経過秒を求める var origin = this.CurrentCombatLogList.FirstOrDefault(x => x.IsOrigin); if (origin != null) { var ts = log.TimeStamp - origin.TimeStamp; if (ts.TotalMinutes <= 60 && ts.TotalMinutes >= -60) { log.TimeStampElapted = ts; } } // アクター別の残HP率をセットする if (this.ActorHPRate.ContainsKey(log.Actor)) { log.HPRate = this.ActorHPRate[log.Actor]; } if (!this.CurrentCombatLogList.Any() && log.RawWithoutTimestamp != ConstantKeywords.ImportLog) { log.IsOrigin = true; } // ゾーンを保存する log.Zone = zone; this.CurrentCombatLogList.Add(log); } }
/// <summary> /// ログに基点をセットする /// </summary> /// <param name="logs">logs</param> /// <param name="origin">origin log</param> public void SetOrigin( IEnumerable <CombatLog> logs, CombatLog origin) { foreach (var log in logs) { log.IsOrigin = false; var ts = log.TimeStamp - origin.TimeStamp; if (ts.TotalMinutes <= 60 && ts.TotalMinutes >= -60) { log.TimeStampElapted = ts; } else { log.TimeStampElapted = TimeSpan.Zero; } } origin.IsOrigin = true; }
/// <summary> /// Effectログを格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreEffectLog( LogLineEventArgs logInfo) { var match = ConstantKeywords.EffectRegex.Match(logInfo.logLine); if (!match.Success) { return; } var victim = match.Groups["victim"].ToString(); var victimJobName = this.ToNameToJob(victim); var effect = match.Groups["effect"].ToString(); var actor = match.Groups["actor"].ToString(); var duration = match.Groups["duration"].ToString(); var log = new CombatLog() { TimeStamp = logInfo.detectedTime, Raw = logInfo.logLine .Replace(victim, victimJobName), Actor = actor, Activity = $"effect {effect}", LogType = LogTypes.Effect }; log.Text = log.Activity; log.SyncKeyword = log.RawWithoutTimestamp; if (victim != actor) { if (this.ToStoreActor(log.Actor)) { this.StoreLog(log); } } }
/// <summary> /// 戦闘終了を格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreEndCombat( LogLineEventArgs logInfo) { var match = ConstantKeywords.CombatEndRegex.Match(logInfo.logLine); if (!match.Success) { return; } var discription = match.Groups["discription"].ToString(); var log = new CombatLog() { TimeStamp = logInfo.detectedTime, Raw = logInfo.logLine, Actor = string.Empty, Activity = LogTypes.CombatEnd.ToString(), LogType = LogTypes.CombatEnd }; this.StoreLog(log); }
/// <summary> /// 戦闘開始を格納する /// </summary> /// <param name="logInfo">ログ情報</param> private void StoreStartCombat( XIVLog xivLog) { var match = ConstantKeywords.CombatStartRegex.Match(xivLog.LogLine); if (!match.Success) { return; } var discription = match.Groups["discription"].ToString(); var log = new CombatLog() { TimeStamp = xivLog.DetectTime, Raw = xivLog.LogLine, Actor = string.Empty, Activity = LogTypes.CombatStart.ToString(), LogType = LogTypes.CombatStart }; this.StoreLog(log, xivLog); }
/// <summary> /// ネットワークログを格納する /// </summary> /// <param name="logInfo">ログ情報</param> /// <param name="keywordType">キーワードのタイプ</param> private void StoreNewwork( LogLineEventArgs logInfo, KewordTypes keywordType) { var log = default(CombatLog); var targetLogLine = logInfo.logLine.Substring(15); var match = keywordType == KewordTypes.NetworkAbility ? ConstantKeywords.NetworkAbility.Match(targetLogLine) : ConstantKeywords.NetworkAOEAbility.Match(targetLogLine); if (match.Success) { var actorID = match.Groups["id"].ToString(); var victimID = match.Groups["victim_id"].ToString(); var actor = match.Groups["actor"].ToString(); var action = match.Groups["skill"].ToString(); var victim = match.Groups["victim"].ToString(); var victimJobName = this.ToNameToJob(victim); if (IgnoreNewworkActions.Any(x => string.Equals(x, action, StringComparison.OrdinalIgnoreCase))) { return; } var raw = logInfo.logLine.Substring(0, 15) + match.Value; raw = raw .Replace(actorID, ActorIDPlaceholder) .Replace(victimID, PCIDPlaceholder); if (!string.IsNullOrEmpty(victim)) { raw = raw.Replace(victim, victimJobName); } log = new CombatLog() { TimeStamp = logInfo.detectedTime, Raw = raw, Actor = actor, Skill = action, Activity = keywordType == KewordTypes.NetworkAbility ? $"{action} Sign" : $"{action} Sign-AOE", LogType = keywordType == KewordTypes.NetworkAbility ? LogTypes.NetworkAbility : LogTypes.NetworkAOEAbility, }; if (!this.ToStoreActor(log.Actor)) { return; } } if (log != null) { if (this.CurrentCombatLogList.Any(x => Math.Abs((x.TimeStamp - log.TimeStamp).TotalSeconds) <= 1.0 && x.RawWithoutTimestamp == log.RawWithoutTimestamp)) { return; } log.Text = log.Activity; log.SyncKeyword = log.RawWithoutTimestamp; this.StoreLog(log); } }