using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Windows; using System.Windows.Forms; using Advanced_Combat_Tracker; using System.IO; using System.Reflection; using System.Xml; using System.Text.RegularExpressions; using System.Globalization; using System.Threading; [assembly: AssemblyTitle("Russian Parsing Engine")] [assembly: AssemblyDescription("Plugin based parsing engine for Russian EQ2 servers")] [assembly: AssemblyCompany("Aditu of Skyfire w/ Localization by Karich of Barren Sky")] [assembly: AssemblyVersion("1.5.0.12")] namespace ACT_Plugin { public class ACT_Russian_Parser : UserControl, IActPluginV1 { #region Designer generated code (Avoid editing) /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose (bool disposing) { if (disposing && (components != null)) { components.Dispose (); } base.Dispose (disposing); } #region Component Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent () { this.cbMultiDamageIsOne = new System.Windows.Forms.CheckBox (); this.cbSwarmIsMaster = new System.Windows.Forms.CheckBox (); this.cbRecalcWardedHits = new System.Windows.Forms.CheckBox (); this.cbSParseConsider = new System.Windows.Forms.CheckBox (); this.cbLocalize = new System.Windows.Forms.CheckBox (); this.cbIncludeInterceptFocus = new System.Windows.Forms.CheckBox (); this.lblAncestralSentry = new System.Windows.Forms.Label (); this.tbFixAncestralSentry = new System.Windows.Forms.TextBox (); this.SuspendLayout (); // // cbMultiDamageIsOne // this.cbMultiDamageIsOne.AutoSize = true; this.cbMultiDamageIsOne.Checked = true; this.cbMultiDamageIsOne.CheckState = System.Windows.Forms.CheckState.Checked; this.cbMultiDamageIsOne.Location = new System.Drawing.Point (20, 7); this.cbMultiDamageIsOne.Name = "cbMultiDamageIsOne"; this.cbMultiDamageIsOne.Size = new System.Drawing.Size (496, 17); this.cbMultiDamageIsOne.TabIndex = 5; this.cbMultiDamageIsOne.Text = "Записывать удар с разными типами повреждений как один удар. (Не имеет обратной си" + "лы)"; this.cbMultiDamageIsOne.MouseHover += new System.EventHandler (this.cbMultiDamageIsOne_MouseHover); // // cbSwarmIsMaster // this.cbSwarmIsMaster.AutoSize = true; this.cbSwarmIsMaster.Checked = true; this.cbSwarmIsMaster.CheckState = System.Windows.Forms.CheckState.Checked; this.cbSwarmIsMaster.Font = new System.Drawing.Font ("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (0))); this.cbSwarmIsMaster.Location = new System.Drawing.Point (20, 27); this.cbSwarmIsMaster.Name = "cbSwarmIsMaster"; this.cbSwarmIsMaster.Size = new System.Drawing.Size (404, 17); this.cbSwarmIsMaster.TabIndex = 6; this.cbSwarmIsMaster.Text = "Объединять атаки петов с данными их хозяев. (Не имеет обратной силы)"; this.cbSwarmIsMaster.MouseHover += new System.EventHandler (this.cbSwarmIsMaster_MouseHover); // // cbRecalcWardedHits // this.cbRecalcWardedHits.AutoSize = true; this.cbRecalcWardedHits.Checked = true; this.cbRecalcWardedHits.CheckState = System.Windows.Forms.CheckState.Checked; this.cbRecalcWardedHits.Location = new System.Drawing.Point (20, 47); this.cbRecalcWardedHits.Name = "cbRecalcWardedHits"; this.cbRecalcWardedHits.Size = new System.Drawing.Size (492, 17); this.cbRecalcWardedHits.TabIndex = 7; this.cbRecalcWardedHits.Text = "Пересчитывать варды и снижение урона в их истинные величины. (Не имеет обратной си" + "лы)"; this.cbRecalcWardedHits.MouseHover += new System.EventHandler (this.cbRecalcWardedHits_MouseHover); // // cbSParseConsider // this.cbSParseConsider.AutoSize = true; this.cbSParseConsider.Checked = true; this.cbSParseConsider.CheckState = System.Windows.Forms.CheckState.Checked; this.cbSParseConsider.Location = new System.Drawing.Point (20, 67); this.cbSParseConsider.Margin = new System.Windows.Forms.Padding (3, 1, 3, 1); this.cbSParseConsider.Name = "cbSParseConsider"; this.cbSParseConsider.Size = new System.Drawing.Size (563, 17); this.cbSParseConsider.TabIndex = 8; this.cbSParseConsider.Text = "Добавлять персонажей выделенные командами /con, /whogroup, /whoraid в окно Выборо" + "чного парсинга."; this.cbSParseConsider.MouseHover += new System.EventHandler (this.cbSParseConsider_MouseHover); // // cbLocalize // this.cbLocalize.AutoSize = true; this.cbLocalize.Checked = true; this.cbLocalize.CheckState = System.Windows.Forms.CheckState.Checked; this.cbLocalize.Location = new System.Drawing.Point (20, 107); this.cbLocalize.Margin = new System.Windows.Forms.Padding (3, 1, 3, 1); this.cbLocalize.Name = "cbLocalize"; this.cbLocalize.Size = new System.Drawing.Size (605, 17); this.cbLocalize.TabIndex = 9; this.cbLocalize.Text = "Включить русский перевод столбцов и переменных. После отключения данной опции тре" + "буется перезапуск АСТ."; // // cbIncludeInterceptFocus // this.cbIncludeInterceptFocus.AutoSize = true; this.cbIncludeInterceptFocus.Location = new System.Drawing.Point (20, 87); this.cbIncludeInterceptFocus.Margin = new System.Windows.Forms.Padding (3, 1, 3, 1); this.cbIncludeInterceptFocus.Name = "cbIncludeInterceptFocus"; this.cbIncludeInterceptFocus.Size = new System.Drawing.Size (651, 17); this.cbIncludeInterceptFocus.TabIndex = 19; this.cbIncludeInterceptFocus.Text = "Парсить урон сосредоточением, нанесённый пету медиума. (Искажает DPS/ToHit% атакую" + "щего, Не имеет обратной силы)"; // // lblAncestralSentry // this.lblAncestralSentry.AutoSize = true; this.lblAncestralSentry.Location = new System.Drawing.Point (20, 127); this.lblAncestralSentry.Margin = new System.Windows.Forms.Padding (3, 1, 3, 1); this.lblAncestralSentry.Name = "lblAncestralSentry"; this.lblAncestralSentry.Size = new System.Drawing.Size (362, 13); this.lblAncestralSentry.TabIndex = 20; this.lblAncestralSentry.Text = "\"Древний часовой\" - введите имя мистика, у которого это заклинание будет отображено" + " как лечение:"; // // tbFixAncestralSentry // this.tbFixAncestralSentry.Location = new System.Drawing.Point (570, 127); this.tbFixAncestralSentry.Name = "tbFixAncestralSentry"; this.tbFixAncestralSentry.Size = new System.Drawing.Size (161, 20); this.tbFixAncestralSentry.TabIndex = 21; this.tbFixAncestralSentry.Text = "Древний часовой"; // // ACT_Russian_Parser // this.AutoScaleDimensions = new System.Drawing.SizeF (6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSize = true; this.Controls.Add (this.tbFixAncestralSentry); this.Controls.Add (this.lblAncestralSentry); this.Controls.Add (this.cbIncludeInterceptFocus); this.Controls.Add (this.cbLocalize); this.Controls.Add (this.cbSParseConsider); this.Controls.Add (this.cbMultiDamageIsOne); this.Controls.Add (this.cbSwarmIsMaster); this.Controls.Add (this.cbRecalcWardedHits); this.Name = "ACT_Russian_Parser"; this.Size = new System.Drawing.Size (704, 182); this.ResumeLayout (false); this.PerformLayout (); } #endregion private CheckBox cbMultiDamageIsOne; private CheckBox cbSwarmIsMaster; private CheckBox cbRecalcWardedHits; private CheckBox cbLocalize; private CheckBox cbIncludeInterceptFocus; private Label lblAncestralSentry; private TextBox tbFixAncestralSentry; private CheckBox cbSParseConsider; #endregion public ACT_Russian_Parser () { InitializeComponent (); } // StringComparer objects for case sensitive and case insensitive string comparisons. // StringComparer.Ordinal and StringComparer.OrdinalIgnoreCase - fast comparer and thus we'll use them. // As alternative for parsing of the log lines can be used StringComparer.InvariantCulture and StringComparer.InvariantCultureIgnoreCase. static readonly StringComparer StrCmpCS = StringComparer.Ordinal; static readonly StringComparer StrCmpCI = StringComparer.OrdinalIgnoreCase; TreeNode optionsNode = null; Label lblStatus; // The status label that appears in ACT's Plugin tab string settingsFile = Path.Combine (ActGlobals.oFormActMain.AppDataFolder.FullName, "Config\\ACT_Russian_Parser.config.xml"); SettingsSerializer xmlSettings; public void InitPlugin (TabPage pluginScreenSpace, Label pluginStatusText) { lblStatus = pluginStatusText; // Hand the status label's reference to our local var pluginScreenSpace.Controls.Add (this); this.Dock = DockStyle.Fill; lblStatus.Text = "Плагин включен"; int dcIndex = -1; // Find the Data Correction node in the Options tab for (int i = 0; i < ActGlobals.oFormActMain.OptionsTreeView.Nodes.Count; i++) { if (StrCmpCI.Equals (ActGlobals.oFormActMain.OptionsTreeView.Nodes[i].Text, "Data Correction")) dcIndex = i; } if (dcIndex != -1) { // Add our own node to the Data Correction node optionsNode = ActGlobals.oFormActMain.OptionsTreeView.Nodes[dcIndex].Nodes.Add ("EQ2 Russian Settings"); // Register our user control(this) to our newly create node path. All controls added to the list will be laid out left to right, top to bottom ActGlobals.oFormActMain.OptionsControlSets.Add (@"Data Correction\EQ2 Russian Settings", new List { this }); Label lblConfig = new Label (); lblConfig.AutoSize = true; lblConfig.Text = "Опции настройки парсера можно найти в закладке Опции, секция Data Correction (Коррекция Данных)."; pluginScreenSpace.Controls.Add (lblConfig); } xmlSettings = new SettingsSerializer (this); // Create a new settings serializer and pass it this instance LoadSettings (); PopulateRegexArray (); if (cbLocalize.Checked) { SetupEQ2RussianEnvironment (); } else { SetupEQ2EnglishEnvironment (); } ActGlobals.oFormActMain.BeforeLogLineRead += new LogLineEventDelegate (oFormActMain_BeforeLogLineRead); ActGlobals.oFormActMain.BeforeCombatAction += new CombatActionDelegate (oFormActMain_BeforeCombatAction); ActGlobals.oFormActMain.AfterCombatAction += new CombatActionDelegate (oFormActMain_AfterCombatAction); ActGlobals.oFormActMain.UpdateCheckClicked += new FormActMain.NullDelegate (oFormActMain_UpdateCheckClicked); ActGlobals.oFormActMain.OnLogLineRead += new LogLineEventDelegate (oFormActMain_OnLogLineRead); if (ActGlobals.oFormActMain.GetAutomaticUpdatesAllowed ()) // If ACT is set to automatically check for updates, check for updates to the plugin { new Thread (new ThreadStart (oFormActMain_UpdateCheckClicked)).Start (); // If we don't put this on a separate thread, web latency will delay the plugin init phase } } public void DeInitPlugin () { ActGlobals.oFormActMain.BeforeLogLineRead -= oFormActMain_BeforeLogLineRead; ActGlobals.oFormActMain.BeforeCombatAction -= oFormActMain_BeforeCombatAction; ActGlobals.oFormActMain.AfterCombatAction -= oFormActMain_AfterCombatAction; ActGlobals.oFormActMain.UpdateCheckClicked -= oFormActMain_UpdateCheckClicked; ActGlobals.oFormActMain.OnLogLineRead -= oFormActMain_OnLogLineRead; if (optionsNode != null) // If we added our user control to the Options tab, remove it { optionsNode.Remove (); ActGlobals.oFormActMain.OptionsControlSets.Remove (@"Data Correction\EQ2 Russian Settings"); } SaveSettings (); lblStatus.Text = "Плагин выключен"; } void oFormActMain_UpdateCheckClicked () { int pluginId = 53; try { DateTime localDate = ActGlobals.oFormActMain.PluginGetSelfDateUtc (this); DateTime remoteDate = ActGlobals.oFormActMain.PluginGetRemoteDateUtc (pluginId); if (localDate.AddHours (2) < remoteDate) { DialogResult result = MessageBox.Show ("Появилась новая версия EQ2 Russian Parsing Plugin. Обновить сейчас?\n\n(Если есть обновление для АСТ, нужно нажать НЕТ и сначала обновить АСТ)", "Новая Версия", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { FileInfo updatedFile = ActGlobals.oFormActMain.PluginDownload (pluginId); ActPluginData pluginData = ActGlobals.oFormActMain.PluginGetSelfData (this); pluginData.pluginFile.Delete (); updatedFile.MoveTo (pluginData.pluginFile.FullName); ThreadInvokes.CheckboxSetChecked (ActGlobals.oFormActMain, pluginData.cbEnabled, false); Application.DoEvents (); ThreadInvokes.CheckboxSetChecked (ActGlobals.oFormActMain, pluginData.cbEnabled, true); } } } catch (Exception ex) { ActGlobals.oFormActMain.WriteExceptionLog (ex, "Plugin Update Check"); } } #region Parsing readonly char[] chrApos = new char[] { '\'', '’' }; readonly char[] chrSpaceApos = new char[] { ' ', '\'', '’' }; readonly char[] chrSlash = new char[] { '/' }; static readonly string[] strCommaSplit = new string[] { ", " }; Regex[] regexArray; const string logTimeStampRegexStr = @"\(\d{10}\)\[.{24}\] "; DateTime lastWardTime = DateTime.MinValue; long lastWardAmount = 0; string lastWardedTarget = string.Empty; DateTime lastInterceptTime = DateTime.MinValue; long lastInterceptAmount = 0; string lastInterceptTarget = string.Empty; string lastIntercepter = string.Empty; Regex mobLocSplit = new Regex ("(?.+?) в зоне .+", RegexOptions.Compiled | RegexOptions.CultureInvariant); Regex regexConsider = new Regex (logTimeStampRegexStr + @".+?Вы оцениваете персонажа? (?.+?)\.\.\. .+", RegexOptions.Compiled | RegexOptions.CultureInvariant); Regex regexWhogroup = new Regex (logTimeStampRegexStr + @"(?[^ ]+) ур. \d+ .+", RegexOptions.Compiled | RegexOptions.CultureInvariant); Regex regexWhoraid = new Regex (logTimeStampRegexStr + @"\[\d+ [^\]]+\] (?[^ ]+) \([^\)]+\)", RegexOptions.Compiled | RegexOptions.CultureInvariant); CombatActionEventArgs lastDamage = null; CombatActionEventArgs lastAsIntercede = null; private void PopulateRegexArray () { regexArray = new Regex[14]; regexArray[0] = new Regex ( /* skill attacks */ logTimeStampRegexStr + @"(?Ваше)? ?[Зз]аклинание (?.+?) (?:персонажа (?.+?))? ?наносит (?:персонажу )? ?(?.+?) (?\d.+?) повреждений\.(?: \((?.+)\))?", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[1] = new Regex ( /* melee attacks */ logTimeStampRegexStr + @"(?:Персонаж)? ?(?.+?) атакуете? (?:персонаж[ае]?)? ?(?.+?) и наносите? (?.+) повреждений\.(?: \((?.+)\))?", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[2] = new Regex ( /* healing */ logTimeStampRegexStr + @"(?Ваше)? ?[Зз]аклинание (?.+?) (?:персонажа (?.+?))? ?(?исцеляет|лечит) (?:персонаж)? ?(?.+?) (?критически.*)? ?на (?\d+) HP\.$", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[3] = new Regex ( /* threat */ logTimeStampRegexStr + @"(?Ваше)? ?[Зз]аклинание (?.+?) (?:персонажа (?.+?))? ?(?повышает|понижает).+(?:позицию в списке|уровень) ненависти с (?.+?)? ?(?критически.*)? ?на (?\d+) (?ненависть|поз\.)\.$", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[4] = new Regex ( /* power replenish */ logTimeStampRegexStr + @"(?Ваше)? ?[Зз]аклинание (?.+?) (?:персонажа (?.+?))? ?(?исцеляет|лечит) (?:персонаж)? ?(?.+?) (?критически.*)? ?на (?\d+) энергия\.$", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[5] = new Regex ( /* failed attack */ logTimeStampRegexStr + @"(?:Персонаж)? ?(?.+?) пытает(?:ся|есь) атаковать (?:персонаж[ае]?)? ?(?.+?) ?(?:, используя (?.+?))?, но (?.+)\.(?: \((?.+)\))?", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[6] = new Regex ( /* ward absorption */ logTimeStampRegexStr + @"(?Ваше)? ?[Зз]аклинание (?.+?) (?:персонажа (?.+?))? ?поглощает (?\d+) ед\. (?:повреждений,)? ?предназначенных (?:персонажу)? ?(?.+?)(?: повреждений)?\.$", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[7] = new Regex ( /* power drain */ logTimeStampRegexStr + @"(?Вы)? ?(?:применяете)? ?[Зз]аклинание (?.+?) ?(?:персонажа (?.+?))? (?:высасывает)? ?(?:к персонажу|из персонажа) (?.+?) ?(?:и высасываете)? (?\d+) ед\. энергии\.(?: \((?.+)\))?", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[8] = new Regex ( /* dispel/cure */ logTimeStampRegexStr + @"(?Ваше)? ?[Зз]аклинание (?.+?) (?:персонажа (?.+?))? ?(?исцеляет|снимает) эффект (?.+?) (?:с персонажа|на персонаже|на) (?.+)\.$", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[9] = new Regex ( /* killing */ logTimeStampRegexStr + @"(?.+?) (?:убивает:?|убили) (?:персонажа?)? ?(?.+?)(?: в зоне .+)?\.$", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[10] = new Regex ( /* damage interception */ logTimeStampRegexStr + @"(?.+?) снижаете? урон от (?.+?) по (?:персонажу)? (?.+) на (?\d+)\.", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[11] = new Regex ( /* no-damage hit */ logTimeStampRegexStr + @"(?.+?) (?бьете?|критическим ударом поражаете?) (?:персонажа? )?(?.+?), но не может нанести никаких повреждений\.$", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[12] = new Regex ( /* zone change */ logTimeStampRegexStr + @"You have entered (?::.+?:)?(?.+)\.$", RegexOptions.Compiled | RegexOptions.CultureInvariant); regexArray[13] = new Regex ( /* act commands */ logTimeStampRegexStr + @"Неизвестная команда: 'act (.+)'", RegexOptions.Compiled | RegexOptions.CultureInvariant); } static readonly string[] matchKeywords = new string[] { "повреждений", "HP", "энерг", ", но", "ненавист", "эффект", "снижает", "убивает", "убили", "entered", "команда" }; private static bool NotQuickFail (LogLineEventArgs logInfo) { for (int i = 0; i < matchKeywords.Length; i++) { if (logInfo.logLine.Contains (matchKeywords[i])) return true; } return false; } void oFormActMain_BeforeLogLineRead (bool isImport, LogLineEventArgs logInfo) { if (!string.IsNullOrEmpty (logInfo.logLine) && NotQuickFail (logInfo)) { for (int i = 0; i < regexArray.Length; i++) { // Regex matched groups later used to get data from the log line. // Thus we can optimize parsing of the log lines by using result of Regex.Match with several benefits: // - matched groups values already computed and no additinal parsing required; // - we can get matched groups values directly by index or group name. System.Text.RegularExpressions.Match reMatch = regexArray[i].Match (logInfo.logLine); if (reMatch.Success) //if (regexArray[i].IsMatch (logInfo.logLine)) { switch (i) { case 0: case 1: logInfo.detectedType = Color.Red.ToArgb (); break; case 2: logInfo.detectedType = Color.DarkRed.ToArgb (); break; case 13: case 3: logInfo.detectedType = Color.Blue.ToArgb (); break; case 4: logInfo.detectedType = Color.DarkOrange.ToArgb (); break; case 5: logInfo.detectedType = Color.DodgerBlue.ToArgb (); break; case 10: case 6: logInfo.detectedType = Color.DarkOrchid.ToArgb (); break; default: logInfo.detectedType = Color.Black.ToArgb (); break; } LogExeRussian (reMatch, i + 1, logInfo.logLine, isImport); break; } } } } void oFormActMain_BeforeCombatAction (bool isImport, CombatActionEventArgs actionInfo) { // Ancestral Sentry - Древний часовой if (actionInfo.swingType != (int) SwingTypeEnum.Healing && actionInfo.damage > 0) { if (lastAsIntercede != null) { //if (lastAsIntercede.attacker == actionInfo.attacker && actionInfo.victim != "Древний часовой") if (StrCmpCS.Equals (lastAsIntercede.attacker, actionInfo.attacker) && !StrCmpCS.Equals (actionInfo.victim, "Древний часовой")) ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.Healing, false, "None", tbFixAncestralSentry.Text, "Древний часовой", (long) actionInfo.damage, actionInfo.time, actionInfo.timeSorter, actionInfo.victim, "перехват урона"); lastAsIntercede = null; } //if (actionInfo.swingType == (int) SwingTypeEnum.Melee && actionInfo.victim == "Древний часовой") if (actionInfo.swingType == (int) SwingTypeEnum.Melee && StrCmpCS.Equals (actionInfo.victim, "Древний часовой")) lastAsIntercede = actionInfo; } // Riposte/kontert/отвечает & Reflect/отражает if (lastDamage != null && lastDamage.time == actionInfo.time) { if ((long) lastDamage.damage == (long) Dnum.Unknown && lastDamage.damage.DamageString.Contains ("отвечает")) { //if (actionInfo.swingType == (int) SwingTypeEnum.Melee && actionInfo.victim == lastDamage.attacker) if (actionInfo.swingType == (int) SwingTypeEnum.Melee && StrCmpCS.Equals (actionInfo.victim, lastDamage.attacker)) { actionInfo.special = "отвечает"; lastDamage.damage.DamageString2 = String.Format ("({0} отв.удар)", actionInfo.damage.ToString ()); } } if ((long) actionInfo.damage == (long) Dnum.Unknown && actionInfo.damage.DamageString.Contains ("отражает")) { //if (actionInfo.theAttackType == lastDamage.theAttackType && actionInfo.victim == lastDamage.attacker) if (actionInfo.theAttackType == lastDamage.theAttackType && StrCmpCS.Equals (actionInfo.victim, lastDamage.attacker)) { //lastDamage.special = "отражает"; // Too late to take effect actionInfo.damage.DamageString2 = String.Format (" ({0} отв.удар)", lastDamage.damage.ToString ()); } } } } void oFormActMain_AfterCombatAction (bool isImport, CombatActionEventArgs actionInfo) { if (actionInfo.swingType == (int) SwingTypeEnum.Melee || actionInfo.swingType == (int) SwingTypeEnum.NonMelee) lastDamage = actionInfo; } bool captureWhoraid = false; void oFormActMain_OnLogLineRead (bool isImport, LogLineEventArgs logInfo) { if (cbSParseConsider.Checked) { if (logInfo.logLine.Contains ("Результаты поиска /whoraid")) captureWhoraid = true; if (logInfo.logLine.EndsWith ("Найдено:")) captureWhoraid = false; if (captureWhoraid && regexWhoraid.IsMatch (logInfo.logLine)) { string outputName = regexWhoraid.Replace (logInfo.logLine, "$1"); ActGlobals.oFormActMain.SelectiveListAdd (outputName); } if (regexWhogroup.IsMatch (logInfo.logLine)) { string outputName = regexWhogroup.Replace (logInfo.logLine, "$1"); ActGlobals.oFormActMain.SelectiveListAdd (outputName); } if (regexConsider.IsMatch (logInfo.logLine)) { string outputName = regexConsider.Replace (logInfo.logLine, "$1"); if (outputName.StartsWith ("{f}")) outputName = outputName.Substring (3); ActGlobals.oFormActMain.SelectiveListAdd (outputName); if (!isImport) System.Media.SystemSounds.Beep.Play (); } } } private void LogExeRussian (System.Text.RegularExpressions.Match reMatch, int logMatched, string logLine, bool isImport) { string attacker, victim, damage, skillType, why, crit, special, attackType, direction; string critStr; //Regex rE = regexArray[logMatched - 1]; // obsolete. use reMatch instead. bool critical; int sposIndex, aposIndex; DateTime time = ActGlobals.oFormActMain.LastKnownTime; List damageAndTypeArr; Dnum failType; int gts = ActGlobals.oFormActMain.GlobalTimeSorter; if (logLine.Contains ("падает повреждений.")) logMatched = 0; switch (logMatched) { #region Case 1 [skill attacks] case 1: attacker = reMatch.Groups[1].Value; skillType = reMatch.Groups[2].Value; victim = reMatch.Groups[3].Value; damage = reMatch.Groups[4].Value; special = reMatch.Groups[5].Value; attacker = String.IsNullOrEmpty (attacker) ? "Неизвестно" : attacker; damageAndTypeArr = RusGetDamageAndTypeArr (damage); RusParseCriticalType (special, out critStr, out critical); special = RusGetSpecialString (special); attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); } } //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet //if (skillType == "Травмирующий удар силача") if (StrCmpCS.Equals (skillType, "Травмирующий удар силача")) ActGlobals.oFormSpellTimers.ApplyTimerMod (attacker, victim, skillType, 0.5F, 30); if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { AddDamageAttack (attacker, victim, skillType, (int) SwingTypeEnum.NonMelee, critical, critStr, special, damageAndTypeArr, time, gts); } break; #endregion #region Case 2 [melee attacks] case 2: attacker = reMatch.Groups[1].Value; victim = reMatch.Groups[2].Value; damage = reMatch.Groups[3].Value; // Also damage type special = reMatch.Groups[4].Value; // Also crit type RusParseCriticalType (special, out critStr, out critical); special = RusGetSpecialString (special); attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); damageAndTypeArr = RusGetDamageAndTypeArr (damage); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, string.Empty, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { AddDamageAttack (attacker, victim, skillType, (int) SwingTypeEnum.NonMelee, critical, critStr, special, damageAndTypeArr, time, gts); } break; } } //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { AddDamageAttack (attacker, victim, string.Empty, (int) SwingTypeEnum.Melee, critical, critStr, special, damageAndTypeArr, time, gts); } break; #endregion #region Case 3 [healing] case 3: if (!ActGlobals.oFormActMain.InCombat) break; attacker = reMatch.Groups[1].Value; skillType = reMatch.Groups[2].Value; victim = reMatch.Groups[4].Value; crit = reMatch.Groups[5].Value; damage = reMatch.Groups[6].Value; RusParseCriticalType (crit, out critStr, out critical); attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); } } //ActGlobals.oFormActMain.AddCombatAction((int)SwingTypeEnum.Healing, critical, "None", attacker, skillType, Int32.Parse(damage), time, gts, victim, "ед. здоровья"); MasterSwing ms = new MasterSwing ((int) SwingTypeEnum.Healing, critical, "None", Int64.Parse (damage), time, gts, skillType, attacker, "ед. здоровья", victim); ms.Tags["CriticalStr"] = critStr; ActGlobals.oFormActMain.AddCombatAction (ms); break; #endregion #region Case 4 [threat] case 4: attacker = reMatch.Groups[1].Value; skillType = reMatch.Groups[2].Value; direction = reMatch.Groups[3].Value; victim = reMatch.Groups[4].Value; crit = reMatch.Groups[5].Value; damage = reMatch.Groups[6].Value; string position = reMatch.Groups[7].Value; attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); //bool increase = direction == "повышает"; //bool positionChange = !(position == "ненависть"); bool increase = StrCmpCS.Equals (direction, "повышает"); bool positionChange = !StrCmpCS.Equals (position, "ненависть"); RusParseCriticalType (crit, out critStr, out critical); Dnum dDamage; if (positionChange) dDamage = new Dnum (Dnum.ThreatPosition, String.Format ("{0} поз.", Int64.Parse (damage))); else dDamage = new Dnum (Int64.Parse (damage)); direction = increase ? "повышает" : "понижает"; //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim) || ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { //ActGlobals.oFormActMain.AddCombatAction((int)SwingTypeEnum.Threat, critical, "None", attacker, skillType, dDamage, time, gts, victim, direction); MasterSwing ms3 = new MasterSwing ((int) SwingTypeEnum.Threat, critical, "None", dDamage, time, gts, skillType, attacker, direction, victim); ms3.Tags["CriticalStr"] = critStr; ActGlobals.oFormActMain.AddCombatAction (ms3); } break; #endregion #region Case 5 [power replenish] case 5: if (!ActGlobals.oFormActMain.InCombat) break; attacker = reMatch.Groups[1].Value; skillType = reMatch.Groups[2].Value; victim = reMatch.Groups[4].Value; crit = reMatch.Groups[5].Value; damage = reMatch.Groups[6].Value; RusParseCriticalType (crit, out critStr, out critical); attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); } } //ActGlobals.oFormActMain.AddCombatAction((int)SwingTypeEnum.PowerHealing, critical, "None", attacker, skillType, Int32.Parse(damage), time, gts, victim, "энергия"); MasterSwing ms2 = new MasterSwing ((int) SwingTypeEnum.PowerHealing, critical, "None", Int64.Parse (damage), time, gts, skillType, attacker, "Power", victim); ms2.Tags["CriticalStr"] = critStr; ActGlobals.oFormActMain.AddCombatAction (ms2); break; #endregion #region Case 6 [failed attack] case 6: attacker = reMatch.Groups[1].Value; victim = reMatch.Groups[2].Value; // Possibly skilltype skillType = reMatch.Groups[3].Value; skillType = String.IsNullOrEmpty (skillType) ? string.Empty : skillType; why = reMatch.Groups[4].Value; special = reMatch.Groups[5].Value; special = String.IsNullOrEmpty (special) ? "None" : special; critical = false; aposIndex = victim.IndexOf ("при помощи", StringComparison.Ordinal); if (aposIndex > -1) { skillType = victim.Substring (aposIndex + 11, victim.Length - aposIndex - 11); victim = victim.Substring (0, aposIndex - 1); attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); failType = GetFailTypeRussian (victim, why, ref special); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); } } //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.NonMelee, false, special, attacker, skillType, failType, time, gts, victim, "умение"); } } else { attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); failType = GetFailTypeRussian (victim, why, ref special); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.NonMelee, false, special, attacker, skillType, failType, time, gts, victim, "умение"); } break; } } //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet if (String.IsNullOrEmpty (skillType)) { if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.Melee, false, special, attacker, "промахи", failType, time, gts, victim, "рукопашный"); } } else { if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.NonMelee, false, special, attacker, skillType, failType, time, gts, victim, "умение"); } } } break; #endregion #region Case 7 [ward absorbtion] case 7: if (!ActGlobals.oFormActMain.InCombat) break; attacker = reMatch.Groups[1].Value; skillType = reMatch.Groups[2].Value; damage = reMatch.Groups[3].Value; victim = reMatch.Groups[4].Value; attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); } } ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.Healing, false, "None", attacker, skillType, Int64.Parse (damage), time, gts, victim, "поглощение"); if (CheckWardedHit (victim, time)) lastWardAmount += Int64.Parse (damage); else lastWardAmount = Int64.Parse (damage); lastWardedTarget = victim; lastWardTime = time; break; #endregion #region Case 8 [power drain] case 8: attacker = reMatch.Groups[1].Value; skillType = reMatch.Groups[2].Value; victim = reMatch.Groups[3].Value; damage = reMatch.Groups[4].Value; crit = reMatch.Groups[5].Value; RusParseCriticalType (crit, out critStr, out critical); if (attacker.StartsWith ("\"") && attacker.EndsWith ("\"")) { skillType = attacker.Substring (1, attacker.Length - 2); attacker = ActGlobals.charName; } attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); } } //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { if (CheckWardedHit (victim, time)) { Dnum complexWardedHit = new Dnum (Int64.Parse (damage) + lastWardAmount, String.Format ("{0}/{1}", lastWardAmount.ToString(GetIntCommas()), Int64.Parse(damage).ToString(GetIntCommas()))); ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.PowerDrain, critical, "None", attacker, skillType, complexWardedHit, time, gts, victim, "поглощено/умение"); lastWardAmount = 0; } else ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.PowerDrain, critical, "None", attacker, skillType, Int64.Parse (damage), time, gts, victim, "умение"); } break; #endregion #region Case 9 [dispell/cure] case 9: attacker = reMatch.Groups[1].Value; skillType = reMatch.Groups[2].Value; direction = reMatch.Groups[3].Value; attackType = reMatch.Groups[4].Value; victim = reMatch.Groups[5].Value; attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); //if (attackType == "Травмирующий удар силача") if (StrCmpCS.Equals (attackType, "Травмирующий удар силача")) ActGlobals.oFormSpellTimers.DispellTimerMods (victim); if (ActGlobals.oFormActMain.InCombat) ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.CureDispel, false, attackType, attacker, skillType, 1, time, gts, victim, direction); break; #endregion #region Case 10 [killing] case 10: attacker = reMatch.Groups[1].Value; //if (attacker.ToLower () == "вас") if (StrCmpCI.Equals (attacker, "вас")) { attacker = RussianPersonaReplace (reMatch.Groups[2].Value); victim = RussianPersonaReplace (reMatch.Groups[1].Value); } else { attacker = RussianPersonaReplace (reMatch.Groups[1].Value); victim = RussianPersonaReplace (reMatch.Groups[2].Value); } if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { attacker = RusGetPetAttackerString (attacker, parIndex); } } ActGlobals.oFormSpellTimers.RemoveTimerMods (victim); ActGlobals.oFormSpellTimers.DispellTimerMods (victim); if (ActGlobals.oFormActMain.InCombat) { ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.NonMelee, false, "None", attacker, "Cмерть", Dnum.Death, time, gts, victim, "убийство"); } break; #endregion #region Case 11 [damage interception] case 11: if (!ActGlobals.oFormActMain.InCombat) break; if (reMatch.Groups[1].Value.Length > 60) break; attacker = reMatch.Groups[1].Value; // Interceptor special = reMatch.Groups[2].Value; // Attacker victim = reMatch.Groups[3].Value; // Target damage = reMatch.Groups[4].Value; // Amount attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); ActGlobals.oFormActMain.AddCombatAction ((int) SwingTypeEnum.Healing, false, special, attacker, "Конструкт Медиума", Int64.Parse (damage), time, gts, victim, "сниж.урона"); if (CheckInterceptedHit (victim, time)) lastInterceptAmount += Int64.Parse (damage); else lastInterceptAmount = Int64.Parse (damage); lastInterceptTarget = victim; lastInterceptTime = time; lastIntercepter = attacker; break; #endregion #region Case 12 [no-damage hit] case 12: attacker = reMatch.Groups[1].Value; // Possible skill crit = reMatch.Groups[2].Value; victim = reMatch.Groups[3].Value; skillType = string.Empty; special = "None"; List noDamageCA = new List (1); noDamageCA.Add (new DamageAndType (0, "умение")); RusParseCriticalType (crit, out critStr, out critical); special = RusGetSpecialString (crit); sposIndex = attacker.IndexOf ("с помощью", StringComparison.Ordinal); if (sposIndex > -1) { aposIndex = attacker.IndexOf ('"'); skillType = attacker.Substring (aposIndex + 1, attacker.Length - aposIndex - 2); attacker = attacker.Substring (0, sposIndex - 1); attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); } } //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet //if (skillType == "Травмирующий удар силача") if (StrCmpCS.Equals (skillType, "Травмирующий удар силача")) ActGlobals.oFormSpellTimers.ApplyTimerMod (attacker, victim, skillType, 0.5F, 30); if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { attackType = string.Empty; long totalDamage = 0; damage = string.Empty; RecalcWardedInterceptedHit (ref attackType, victim, ref damage, time, ref totalDamage); AddDamageAttack (attacker, victim, skillType, (int) SwingTypeEnum.NonMelee, critical, critStr, special, noDamageCA, time, gts); } } else { sposIndex = victim.IndexOf ("с помощью", StringComparison.Ordinal); if (sposIndex > -1) { aposIndex = victim.IndexOf ('"'); skillType = victim.Substring (aposIndex + 1, victim.Length - aposIndex - 2); victim = victim.Substring (0, sposIndex - 1); attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); } } //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet //if (skillType == "Травмирующий удар силача") if (StrCmpCS.Equals (skillType, "Травмирующий удар силача")) ActGlobals.oFormSpellTimers.ApplyTimerMod (attacker, victim, skillType, 0.5F, 30); if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { attackType = string.Empty; long totalDamage = 0; damage = string.Empty; RecalcWardedInterceptedHit (ref attackType, victim, ref damage, time, ref totalDamage); AddDamageAttack (attacker, victim, skillType, (int) SwingTypeEnum.NonMelee, critical, critStr, special, noDamageCA, time, gts); } } else { attacker = RussianPersonaReplace (attacker); victim = RussianPersonaReplace (victim); if (cbSwarmIsMaster.Checked) // && attacker.Contains ("(") && attacker.Contains (")")) { int parIndex = attacker.IndexOf ('('); if (parIndex >= 0 && attacker.IndexOf (')', parIndex) >= 0) { skillType = RusGetPetSkilltypeString (attacker, skillType, parIndex); attacker = RusGetPetAttackerString (attacker, parIndex); //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet //if (skillType == "Травмирующий удар силача") if (StrCmpCS.Equals (skillType, "Травмирующий удар силача")) ActGlobals.oFormSpellTimers.ApplyTimerMod (attacker, victim, skillType, 0.5F, 30); if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { attackType = string.Empty; long totalDamage = 0; damage = string.Empty; RecalcWardedInterceptedHit (ref attackType, victim, ref damage, time, ref totalDamage); AddDamageAttack (attacker, victim, skillType, (int) SwingTypeEnum.NonMelee, critical, critStr, special, noDamageCA, time, gts); } break; } } //if (attacker == victim) if (StrCmpCS.Equals (attacker, victim)) break; // You don't get credit for attacking yourself or your own pet if (ActGlobals.oFormActMain.SetEncounter (time, attacker, victim)) { attackType = string.Empty; long totalDamage = 0; damage = string.Empty; RecalcWardedInterceptedHit (ref attackType, victim, ref damage, time, ref totalDamage); List noDamageMelee = new List (1); noDamageMelee.Add (new DamageAndType (0, "рукопашный")); AddDamageAttack (attacker, victim, "", (int) SwingTypeEnum.Melee, critical, critStr, special, noDamageMelee, time, gts); } } } break; #endregion #region Case 13 [zone change] case 13: if (logLine.Contains (" combat by ")) break; ActGlobals.oFormActMain.ChangeZone (reMatch.Groups[1].Value.Trim ()); break; #endregion #region Case 14 [act commands] case 14: ActGlobals.oFormActMain.ActCommands (reMatch.Groups[1].Value); break; #endregion default: break; } } private static void RusParseCriticalType (string ACriticalStr, out string ACritTypeStr, out bool IsCritical) { if ((ACriticalStr != null) && ACriticalStr.Contains ("критичес")) { IsCritical = true; if (ACriticalStr.Contains ("Легендарные")) ACritTypeStr = "Легендарный"; else if (ACriticalStr.Contains ("Эпические")) ACritTypeStr = "Эпический"; else if (ACriticalStr.Contains ("Мифические")) ACritTypeStr = "Мифический"; else ACritTypeStr = "Обычный"; } else { IsCritical = false; ACritTypeStr = "None"; } } private void RecalcWardedInterceptedHit (ref string attackType, string victim, ref string damage, DateTime time, ref long totalDamage) { if (CheckInterceptedHit (victim, time)) { totalDamage += lastInterceptAmount; damage = String.IsNullOrEmpty (damage) ? totalDamage.ToString () : String.Format ("{0}/{1}", totalDamage.ToString(GetIntCommas()), lastInterceptAmount.ToString(GetIntCommas())); attackType = String.IsNullOrEmpty (attackType) ? "сниж.урона" : attackType + "/сниж.урона"; lastInterceptAmount = 0; } if (CheckWardedHit (victim, time)) { totalDamage += lastWardAmount; damage = String.IsNullOrEmpty (damage) ? totalDamage.ToString () : String.Format ("{0}/{1}", totalDamage.ToString(GetIntCommas()), lastWardAmount.ToString(GetIntCommas())); attackType = String.IsNullOrEmpty (attackType) ? "поглощено" : attackType + "/поглощено"; lastWardAmount = 0; } } private bool CheckInterceptedFocus (string victim, DateTime time, List damageAndTypeArr) { //if (cbRecalcWardedHits.Checked && lastInterceptTime == time && lastIntercepter == victim && lastInterceptAmount > 0) if (cbRecalcWardedHits.Checked && lastInterceptTime == time && lastInterceptAmount > 0 && StrCmpCS.Equals (lastIntercepter, victim)) { if (damageAndTypeArr.Count == 1) { //if (damageAndTypeArr[0].Type == "сосредоточение") if (StrCmpCS.Equals (damageAndTypeArr[0].Type, "сосредоточение")) return true; } } return false; } private bool CheckInterceptedHit (string victim, DateTime time) { //return cbRecalcWardedHits.Checked && lastInterceptTime == time && lastInterceptTarget == victim && lastInterceptAmount > 0; return cbRecalcWardedHits.Checked && lastInterceptTime == time && lastInterceptAmount > 0 && StrCmpCS.Equals (lastInterceptTarget, victim); } private bool CheckWardedHit (string victim, DateTime time) { //return cbRecalcWardedHits.Checked && lastWardTime == time && lastWardedTarget == victim && lastWardAmount > 0; return cbRecalcWardedHits.Checked && lastWardTime == time && lastWardAmount > 0 && StrCmpCS.Equals (lastWardedTarget, victim); } private static string RusGetSpecialString (string Special) { if (string.IsNullOrEmpty (Special)) return "None"; Special = Special.Replace ("атака", string.Empty); Special = Special.Replace ("атаку", string.Empty); Special = Special.Replace ("Легендарные", string.Empty); Special = Special.Replace ("Эпические", string.Empty); Special = Special.Replace ("Мифические", string.Empty); Special = Special.Replace ("критический", string.Empty); Special = Special.Replace ("критическая", string.Empty); Special = Special.Replace ("удар", string.Empty); Special = Special.Replace ("мульти-", "мульти-атака").Trim (); if (string.IsNullOrEmpty (Special)) return "None"; return Special; } private static List RusGetDamageAndTypeArr (string damageAndType) { damageAndType = damageAndType.Replace (" ", " "); damageAndType = damageAndType.Replace (" и ", ", "); damageAndType = damageAndType.Replace (" ед. ", " "); damageAndType = damageAndType.Trim (); List outList = new List (); string[] results = damageAndType.Split (strCommaSplit, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < results.Length; i++) { outList.Add (new DamageAndType (results[i])); } return outList; } private static string RusGetPetAttackerString (string attacker, int parIndex) { return attacker.Substring (parIndex + 1, attacker.Length - parIndex - 2); } private static string RusGetPetSkilltypeString (string attacker, string skillType, int parIndex) { if (String.IsNullOrEmpty (skillType)) { return String.Format ("({0})", attacker.Substring (0, parIndex - 1)); } else { return String.Format ("({0}) - {1}", attacker.Substring (0, parIndex - 1), skillType); } } private static Dnum GetFailTypeRussian (string Victim, string Why, ref string Special) { bool specialSet = false; string strWhy = Why; Special = Special.Replace ("проводите", String.Empty); Special = Special.Replace ("удар на", String.Empty); Special = Special.Replace ("на атаку", String.Empty); Special = Special.Replace ("атаку", String.Empty); Special = Special.Replace ("атака", String.Empty).Trim (); if (Special.Contains ("мульти-")) { strWhy = Special.Replace ("мульти-", string.Empty); // .Trim (); Special = "мульти-атака"; specialSet = true; } else if (Special.Contains ("вихревая")) { strWhy = Special.Replace ("вихревая", string.Empty); // .Trim (); Special = "вихревая"; specialSet = true; } else if (Special.Contains ("вихревую")) { strWhy = Special.Replace ("вихревую", string.Empty); // .Trim (); Special = "вихревая"; specialSet = true; } else if (Special.Contains ("по площади")) { strWhy = Special.Replace ("по площади", string.Empty); // .Trim (); Special = "по площади"; specialSet = true; } strWhy = strWhy.Replace ("вы ", ActGlobals.charName + " "); strWhy = strWhy.Replace (Victim, String.Empty).Trim (); strWhy = strWhy.Replace (" ", " "); if (strWhy.Contains ("перехватывает") || strWhy.Contains ("уклоняетесь")) { strWhy = strWhy.Replace ("перехватывает", Special); strWhy = strWhy.Replace ("уклоняетесь", Special); if (!specialSet) Special = "None"; } if (strWhy.Contains ("промахивает")) return Dnum.Miss; if (String.IsNullOrEmpty (strWhy)) return Dnum.Miss; return new Dnum (-9, strWhy.Trim ()); } private static string RussianPersonaReplace (string input) { if ( StrCmpCI.Equals (input, "ваша") || StrCmpCI.Equals (input, "ваше") || StrCmpCI.Equals (input, "ваш" ) || StrCmpCI.Equals (input, "вашу") || StrCmpCI.Equals (input, "вас" ) || StrCmpCI.Equals (input, "вы" ) || StrCmpCI.Equals (input, "себе") || StrCmpCI.Equals (input, "вам" ) ) return ActGlobals.charName; return input; } private void AddDamageAttack (string attacker, string victim, string skillType, int swingType, bool critical, string criticalStr, string special, List damageAndTypeArr, DateTime time, int gts) { long damageTotal = 0; if (cbMultiDamageIsOne.Checked) { string damageStr = string.Empty; string typeStr = string.Empty; if (CheckInterceptedFocus (victim, time, damageAndTypeArr)) { if (!cbIncludeInterceptFocus.Checked) return; } if (CheckInterceptedHit (victim, time)) { damageTotal = lastInterceptAmount; damageStr += String.Format ("{0}/", damageTotal.ToString(GetIntCommas())); typeStr += String.Format ("{0}/", "сниж.урона"); lastInterceptAmount = 0; } if (CheckWardedHit (victim, time)) { damageTotal = lastWardAmount; damageStr += String.Format ("{0}/", damageTotal.ToString(GetIntCommas())); typeStr += String.Format ("{0}/", "поглощено"); lastWardAmount = 0; } for (int i = 0; i < damageAndTypeArr.Count; i++) { damageTotal += damageAndTypeArr[i].Damage; damageStr += String.Format ("{0}/", damageAndTypeArr[i].Damage.ToString(GetIntCommas())); typeStr += String.Format ("{0}/", damageAndTypeArr[i].Type); } damageStr = damageStr.TrimEnd (chrSlash); typeStr = typeStr.TrimEnd (chrSlash); if (String.IsNullOrEmpty (skillType)) skillType = typeStr; //ActGlobals.oFormActMain.AddCombatAction(swingType, critical, special, attacker, skillType, new Dnum(damageTotal, damageStr), time, gts, victim, typeStr); MasterSwing ms = new MasterSwing (swingType, critical, special, new Dnum (damageTotal, damageStr), time, gts, skillType, attacker, typeStr, victim); ms.Tags["CriticalStr"] = criticalStr; ActGlobals.oFormActMain.AddCombatAction (ms); } else { bool nullSkillType = String.IsNullOrEmpty (skillType); for (int i = 0; i < damageAndTypeArr.Count; i++) { damageTotal = damageAndTypeArr[i].Damage; string damageStr = damageAndTypeArr[i].Damage.ToString (); if (nullSkillType) skillType = damageAndTypeArr[i].Type; if (CheckInterceptedFocus (victim, time, damageAndTypeArr)) { if (!cbIncludeInterceptFocus.Checked) continue; } if (i == damageAndTypeArr.Count - 1 && (CheckWardedHit (victim, time) || CheckInterceptedHit (victim, time))) { damageTotal += lastInterceptAmount; damageTotal += lastWardAmount; lastInterceptAmount = 0; lastWardAmount = 0; } // ActGlobals.oFormActMain.AddCombatAction(swingType, critical, special, attacker, skillType, damageTotal, time, gts, victim, damageAndTypeArr[i].Type); MasterSwing ms = new MasterSwing (swingType, critical, special, new Dnum (damageTotal, damageStr), time, gts, skillType, attacker, damageAndTypeArr[i].Type, victim); ms.Tags["CriticalStr"] = criticalStr; ActGlobals.oFormActMain.AddCombatAction (ms); } } } private class DamageAndType { long damage; string type; /// /// Data class for a single type of damage and the amount /// /// The positive integer amount of damage /// The type of damage to display it as public DamageAndType (long Damage, string Type) { this.damage = Damage; this.type = Type; } /// /// Data class for a single type of damage and the amount /// /// An input string such as "123 crushing" to be split by the constructor public DamageAndType (string UnsplitSource) { int spacePos = UnsplitSource.IndexOf (' '); if (spacePos == -1) throw new ArgumentException ("The input string did not contain a space, thus cannot be split"); damage = Int64.Parse (UnsplitSource.Substring (0, spacePos)); type = UnsplitSource.Substring (spacePos + 1); } public long Damage { get { return damage; } set { damage = value; } } public string Type { get { return type; } set { type = value; } } } #endregion void LoadSettings () { // Add items to the xmlSettings object here... xmlSettings.AddControlSetting (cbMultiDamageIsOne.Name, cbMultiDamageIsOne); xmlSettings.AddControlSetting (cbRecalcWardedHits.Name, cbRecalcWardedHits); xmlSettings.AddControlSetting (cbIncludeInterceptFocus.Name, cbIncludeInterceptFocus); xmlSettings.AddControlSetting (cbSwarmIsMaster.Name, cbSwarmIsMaster); xmlSettings.AddControlSetting (cbSParseConsider.Name, cbSParseConsider); xmlSettings.AddControlSetting (cbLocalize.Name, cbLocalize); xmlSettings.AddControlSetting (tbFixAncestralSentry.Name, tbFixAncestralSentry); if (File.Exists (settingsFile)) { using (FileStream fs = new FileStream (settingsFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { XmlTextReader xReader = new XmlTextReader (fs); try { while (xReader.Read ()) { if (xReader.NodeType == XmlNodeType.Element) { if (xReader.LocalName == "SettingsSerializer") { xmlSettings.ImportFromXml (xReader); } } } } catch (Exception ex) { lblStatus.Text = "Ошибка загрузки настроек: " + ex.Message; } xReader.Close (); } } } void SaveSettings () { using (FileStream fs = new FileStream (settingsFile, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) { XmlTextWriter xWriter = new XmlTextWriter (fs, Encoding.UTF8); xWriter.Formatting = Formatting.Indented; xWriter.Indentation = 1; xWriter.IndentChar = '\t'; xWriter.WriteStartDocument (true); xWriter.WriteStartElement ("Config"); // xWriter.WriteStartElement ("SettingsSerializer"); // xmlSettings.ExportToXml (xWriter); // Fill the SettingsSerializer XML xWriter.WriteEndElement (); // xWriter.WriteEndElement (); // xWriter.WriteEndDocument (); // Tie up loose ends (shouldn't be any) xWriter.Flush (); // Flush the file buffer to disk xWriter.Close (); } } private void cbSwarmIsMaster_MouseHover (object sender, EventArgs e) { ActGlobals.oFormActMain.SetOptionsHelpText ("Если включить, \"Wässrige Horde des Character\" и похоже названные петы будут добавлять свой урон хозяину пета вместо добавления к своему(пету) имени в парсере. Входящие атаки не могут быть добавлены к данным хозяина"); } private void cbRecalcWardedHits_MouseHover (object sender, EventArgs e) { ActGlobals.oFormActMain.SetOptionsHelpText ("Если включить, удары без урона или с уменьшенным уроном следующие сразу за поглащающим вардом повысят количество поглощения. Удары в Каменную кожу не могут быть пересчитаны."); } private void cbMultiDamageIsOne_MouseHover (object sender, EventArgs e) { ActGlobals.oFormActMain.SetOptionsHelpText ("Если включить, атаки, у которых есть разные типы повреждений, такие как \"300 сокрушений, 5 ядов и 5 повреждений болезни \", будут показаны как одна полная атака: сокрушительный/яд/болезнь 300/5/5,значение урона будет заменено на 310. Если выключено, каждый тип повреждения будет показан как отдельная попытка ударить (взмах). Показ одной атаки как мульти-атаки будет иметь последствия при вычислении процента попаданий по цели. "); } private void cbSParseConsider_MouseHover (object sender, EventArgs e) { ActGlobals.oFormActMain.SetOptionsHelpText ("Команда /con просто добавит текст в лог-файл об уровне вашей цели. Команды /whogroup и /whoraid покажут список вашей группы/рейда соответственно. Использование данной опции поможет вам быстро добавить игроков в список Выборочного парсинга."); } private void lblAncestralSentry_MouseHover (object sender, EventArgs e) { ActGlobals.oFormActMain.SetOptionsHelpText ("Способность Мистика, Ancestral Sentry, will attempt to intercede players near it in a static manner."); } private string GetIntCommas () { return ActGlobals.mainTableShowCommas ? "#,0" : "0"; } private string GetFloatCommas () { return ActGlobals.mainTableShowCommas ? "#,0.00" : "0.00"; } private void SetupEQ2EnglishEnvironment () { CultureInfo usCulture = new CultureInfo ("en-US"); // This is for SQL syntax; do not change EncounterData.ColumnDefs.Clear (); // Do not change the SqlDataName while doing localization EncounterData.ColumnDefs.Add ("EncId", new EncounterData.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.EncId; })); EncounterData.ColumnDefs.Add ("Title", new EncounterData.ColumnDef ("Title", true, "VARCHAR(64)", "Title", (Data) => { return Data.Title; }, (Data) => { return Data.Title; })); EncounterData.ColumnDefs.Add ("StartTime", new EncounterData.ColumnDef ("StartTime", true, "TIMESTAMP", "StartTime", (Data) => { return Data.StartTime == DateTime.MaxValue ? "--:--:--" : String.Format ("{0} {1}", Data.StartTime.ToShortDateString (), Data.StartTime.ToLongTimeString ()); }, (Data) => { return Data.StartTime == DateTime.MaxValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); })); EncounterData.ColumnDefs.Add ("EndTime", new EncounterData.ColumnDef ("EndTime", true, "TIMESTAMP", "EndTime", (Data) => { return Data.EndTime == DateTime.MinValue ? "--:--:--" : Data.EndTime.ToString ("T"); }, (Data) => { return Data.EndTime == DateTime.MinValue ? "0000-00-00 00:00:00" : Data.EndTime.ToString ("u").TrimEnd (new char[] { 'Z' }); })); EncounterData.ColumnDefs.Add ("Duration", new EncounterData.ColumnDef ("Duration", true, "INT", "Duration", (Data) => { return Data.DurationS; }, (Data) => { return Data.Duration.TotalSeconds.ToString ("0"); })); EncounterData.ColumnDefs.Add ("Damage", new EncounterData.ColumnDef ("Damage", true, "BIGINT", "Damage", (Data) => { return Data.Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Damage.ToString (); })); EncounterData.ColumnDefs.Add ("EncDPS", new EncounterData.ColumnDef ("EncDPS", true, "DOUBLE", "EncDPS", (Data) => { return Data.DPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.DPS.ToString (usCulture); })); EncounterData.ColumnDefs.Add ("Zone", new EncounterData.ColumnDef ("Zone", false, "VARCHAR(64)", "Zone", (Data) => { return Data.ZoneName; }, (Data) => { return Data.ZoneName; })); EncounterData.ColumnDefs.Add ("Kills", new EncounterData.ColumnDef ("Kills", true, "INT", "Kills", (Data) => { return Data.AlliedKills.ToString (GetIntCommas ()); }, (Data) => { return Data.AlliedKills.ToString (); })); EncounterData.ColumnDefs.Add ("Deaths", new EncounterData.ColumnDef ("Deaths", true, "INT", "Deaths", (Data) => { return Data.AlliedDeaths.ToString (GetIntCommas ()); }, (Data) => { return Data.AlliedDeaths.ToString (); })); EncounterData.ExportVariables.Clear (); EncounterData.ExportVariables.Add ("n", new EncounterData.TextExportFormatter ("n", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-newline"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-newline"].DisplayedText, (Data, SelectiveAllies, Extra) => { return "\n"; })); EncounterData.ExportVariables.Add ("t", new EncounterData.TextExportFormatter ("t", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-tab"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-tab"].DisplayedText, (Data, SelectiveAllies, Extra) => { return "\t"; })); EncounterData.ExportVariables.Add ("title", new EncounterData.TextExportFormatter ("title", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-title"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-title"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "title", Extra); })); EncounterData.ExportVariables.Add ("duration", new EncounterData.TextExportFormatter ("duration", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-duration"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-duration"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "duration", Extra); })); EncounterData.ExportVariables.Add ("DURATION", new EncounterData.TextExportFormatter ("DURATION", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-DURATION"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-DURATION"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DURATION", Extra); })); EncounterData.ExportVariables.Add ("damage", new EncounterData.TextExportFormatter ("damage", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-damage"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-damage"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "damage", Extra); })); EncounterData.ExportVariables.Add ("damage-m", new EncounterData.TextExportFormatter ("damage-m", "Damage M", "Damage divided by 1,000,000 (with two decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "damage-m", Extra); })); EncounterData.ExportVariables.Add ("DAMAGE-k", new EncounterData.TextExportFormatter ("DAMAGE-k", "Short Damage K", "Damage divided by 1,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DAMAGE-k", Extra); })); EncounterData.ExportVariables.Add ("DAMAGE-m", new EncounterData.TextExportFormatter ("DAMAGE-m", "Short Damage M", "Damage divided by 1,000,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DAMAGE-m", Extra); })); EncounterData.ExportVariables.Add ("dps", new EncounterData.TextExportFormatter ("dps", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-dps"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-dps"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "dps", Extra); })); EncounterData.ExportVariables.Add ("DPS", new EncounterData.TextExportFormatter ("DPS", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-DPS"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-DPS"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DPS", Extra); })); EncounterData.ExportVariables.Add ("DPS-k", new EncounterData.TextExportFormatter ("DPS-k", "DPS K", "DPS divided by 1,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DPS-k", Extra); })); EncounterData.ExportVariables.Add ("encdps", new EncounterData.TextExportFormatter ("encdps", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-extdps"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-extdps"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "encdps", Extra); })); EncounterData.ExportVariables.Add ("ENCDPS", new EncounterData.TextExportFormatter ("ENCDPS", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-EXTDPS"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-EXTDPS"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "ENCDPS", Extra); })); EncounterData.ExportVariables.Add ("ENCDPS-k", new EncounterData.TextExportFormatter ("ENCDPS-k", "Short DPS K", "ENCDPS divided by 1,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "ENCDPS-k", Extra); })); EncounterData.ExportVariables.Add ("hits", new EncounterData.TextExportFormatter ("hits", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-hits"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-hits"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "hits", Extra); })); EncounterData.ExportVariables.Add ("crithits", new EncounterData.TextExportFormatter ("crithits", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-crithits"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-crithits"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "crithits", Extra); })); EncounterData.ExportVariables.Add ("crithit%", new EncounterData.TextExportFormatter ("crithit%", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-crithit%"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-crithit%"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "crithit%", Extra); })); EncounterData.ExportVariables.Add ("misses", new EncounterData.TextExportFormatter ("misses", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-misses"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-misses"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "misses", Extra); })); EncounterData.ExportVariables.Add ("hitfailed", new EncounterData.TextExportFormatter ("hitfailed", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-hitfailed"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-hitfailed"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "hitfailed", Extra); })); EncounterData.ExportVariables.Add ("swings", new EncounterData.TextExportFormatter ("swings", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-swings"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-swings"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "swings", Extra); })); EncounterData.ExportVariables.Add ("tohit", new EncounterData.TextExportFormatter ("tohit", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-tohit"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-tohit"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "tohit", Extra); })); EncounterData.ExportVariables.Add ("TOHIT", new EncounterData.TextExportFormatter ("TOHIT", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-TOHIT"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-TOHIT"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "TOHIT", Extra); })); EncounterData.ExportVariables.Add ("maxhit", new EncounterData.TextExportFormatter ("maxhit", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-maxhit"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-maxhit"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "maxhit", Extra); })); EncounterData.ExportVariables.Add ("MAXHIT", new EncounterData.TextExportFormatter ("MAXHIT", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-MAXHIT"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-MAXHIT"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "MAXHIT", Extra); })); EncounterData.ExportVariables.Add ("healed", new EncounterData.TextExportFormatter ("healed", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-healed"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-healed"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "healed", Extra); })); EncounterData.ExportVariables.Add ("enchps", new EncounterData.TextExportFormatter ("enchps", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-exthps"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-exthps"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "enchps", Extra); })); EncounterData.ExportVariables.Add ("ENCHPS", new EncounterData.TextExportFormatter ("ENCHPS", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-EXTHPS"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-EXTHPS"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "ENCHPS", Extra); })); EncounterData.ExportVariables.Add ("ENCHPS-k", new EncounterData.TextExportFormatter ("ENCHPS", "Short ENCHPS K", "ENCHPS divided by 1,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "ENCHPS-k", Extra); })); EncounterData.ExportVariables.Add ("heals", new EncounterData.TextExportFormatter ("heals", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-heals"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-heals"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "heals", Extra); })); EncounterData.ExportVariables.Add ("critheals", new EncounterData.TextExportFormatter ("critheals", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-critheals"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-critheals"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "critheals", Extra); })); EncounterData.ExportVariables.Add ("critheal%", new EncounterData.TextExportFormatter ("critheal%", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-critheal%"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-critheal%"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "critheal%", Extra); })); EncounterData.ExportVariables.Add ("cures", new EncounterData.TextExportFormatter ("cures", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-cures"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-cures"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "cures", Extra); })); EncounterData.ExportVariables.Add ("maxheal", new EncounterData.TextExportFormatter ("maxheal", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-maxheal"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-maxheal"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "maxheal", Extra); })); EncounterData.ExportVariables.Add ("MAXHEAL", new EncounterData.TextExportFormatter ("MAXHEAL", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-MAXHEAL"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-MAXHEAL"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "MAXHEAL", Extra); })); EncounterData.ExportVariables.Add ("maxhealward", new EncounterData.TextExportFormatter ("maxhealward", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-maxhealward"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-maxhealward"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "maxhealward", Extra); })); EncounterData.ExportVariables.Add ("MAXHEALWARD", new EncounterData.TextExportFormatter ("MAXHEALWARD", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-MAXHEALWARD"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-MAXHEALWARD"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "MAXHEALWARD", Extra); })); EncounterData.ExportVariables.Add ("damagetaken", new EncounterData.TextExportFormatter ("damagetaken", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-damagetaken"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-damagetaken"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "damagetaken", Extra); })); EncounterData.ExportVariables.Add ("healstaken", new EncounterData.TextExportFormatter ("healstaken", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-healstaken"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-healstaken"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "healstaken", Extra); })); EncounterData.ExportVariables.Add ("powerdrain", new EncounterData.TextExportFormatter ("powerdrain", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-powerdrain"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-powerdrain"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "powerdrain", Extra); })); EncounterData.ExportVariables.Add ("powerheal", new EncounterData.TextExportFormatter ("powerheal", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-powerheal"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-powerheal"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "powerheal", Extra); })); EncounterData.ExportVariables.Add ("kills", new EncounterData.TextExportFormatter ("kills", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-kills"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-kills"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "kills", Extra); })); EncounterData.ExportVariables.Add ("deaths", new EncounterData.TextExportFormatter ("deaths", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-deaths"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-deaths"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "deaths", Extra); })); CombatantData.ColumnDefs.Clear (); CombatantData.ColumnDefs.Add ("EncId", new CombatantData.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.Parent.EncId; }, (Left, Right) => { return 0; })); CombatantData.ColumnDefs.Add ("Ally", new CombatantData.ColumnDef ("Ally", false, "CHAR(1)", "Ally", (Data) => { return Data.Parent.GetAllies ().Contains (Data).ToString (); }, (Data) => { return Data.Parent.GetAllies ().Contains (Data) ? "T" : "F"; }, (Left, Right) => { return Left.Parent.GetAllies ().Contains (Left).CompareTo (Right.Parent.GetAllies ().Contains (Right)); })); CombatantData.ColumnDefs.Add ("Name", new CombatantData.ColumnDef ("Name", true, "VARCHAR(64)", "Name", (Data) => { return Data.Name; }, (Data) => { return Data.Name; }, (Left, Right) => { return Left.Name.CompareTo (Right.Name); })); CombatantData.ColumnDefs.Add ("StartTime", new CombatantData.ColumnDef ("StartTime", true, "TIMESTAMP", "StartTime", (Data) => { return Data.StartTime == DateTime.MaxValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.StartTime == DateTime.MaxValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.StartTime.CompareTo (Right.StartTime); })); CombatantData.ColumnDefs.Add ("EndTime", new CombatantData.ColumnDef ("EndTime", false, "TIMESTAMP", "EndTime", (Data) => { return Data.EndTime == DateTime.MinValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.EndTime == DateTime.MinValue ? "0000-00-00 00:00:00" : Data.EndTime.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.EndTime.CompareTo (Right.EndTime); })); CombatantData.ColumnDefs.Add ("Duration", new CombatantData.ColumnDef ("Duration", true, "INT", "Duration", (Data) => { return Data.DurationS; }, (Data) => { return Data.Duration.TotalSeconds.ToString ("0"); }, (Left, Right) => { return Left.Duration.CompareTo (Right.Duration); })); CombatantData.ColumnDefs.Add ("Damage", new CombatantData.ColumnDef ("Damage", true, "BIGINT", "Damage", (Data) => { return Data.Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Damage.ToString (); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); CombatantData.ColumnDefs.Add ("Damage%", new CombatantData.ColumnDef ("Damage%", true, "VARCHAR(4)", "DamagePerc", (Data) => { return Data.DamagePercent; }, (Data) => { return Data.DamagePercent; }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); CombatantData.ColumnDefs.Add ("Kills", new CombatantData.ColumnDef ("Kills", false, "INT", "Kills", (Data) => { return Data.Kills.ToString (GetIntCommas ()); }, (Data) => { return Data.Kills.ToString (); }, (Left, Right) => { return Left.Kills.CompareTo (Right.Kills); })); CombatantData.ColumnDefs.Add ("Healed", new CombatantData.ColumnDef ("Healed", false, "BIGINT", "Healed", (Data) => { return Data.Healed.ToString (GetIntCommas ()); }, (Data) => { return Data.Healed.ToString (); }, (Left, Right) => { return Left.Healed.CompareTo (Right.Healed); })); CombatantData.ColumnDefs.Add ("Healed%", new CombatantData.ColumnDef ("Healed%", false, "VARCHAR(4)", "HealedPerc", (Data) => { return Data.HealedPercent; }, (Data) => { return Data.HealedPercent; }, (Left, Right) => { return Left.Healed.CompareTo (Right.Healed); })); CombatantData.ColumnDefs.Add ("CritHeals", new CombatantData.ColumnDef ("CritHeals", false, "INT", "CritHeals", (Data) => { return Data.CritHeals.ToString (GetIntCommas ()); }, (Data) => { return Data.CritHeals.ToString (); }, (Left, Right) => { return Left.CritHeals.CompareTo (Right.CritHeals); })); CombatantData.ColumnDefs.Add ("Heals", new CombatantData.ColumnDef ("Heals", false, "INT", "Heals", (Data) => { return Data.Heals.ToString (GetIntCommas ()); }, (Data) => { return Data.Heals.ToString (); }, (Left, Right) => { return Left.Heals.CompareTo (Right.Heals); })); CombatantData.ColumnDefs.Add ("Cures", new CombatantData.ColumnDef ("Cures", false, "INT", "CureDispels", (Data) => { return Data.CureDispels.ToString (GetIntCommas ()); }, (Data) => { return Data.CureDispels.ToString (); }, (Left, Right) => { return Left.CureDispels.CompareTo (Right.CureDispels); })); CombatantData.ColumnDefs.Add ("PowerDrain", new CombatantData.ColumnDef ("PowerDrain", true, "BIGINT", "PowerDrain", (Data) => { return Data.PowerDamage.ToString (GetIntCommas ()); }, (Data) => { return Data.PowerDamage.ToString (); }, (Left, Right) => { return Left.PowerDamage.CompareTo (Right.PowerDamage); })); CombatantData.ColumnDefs.Add ("PowerReplenish", new CombatantData.ColumnDef ("PowerReplenish", false, "BIGINT", "PowerReplenish", (Data) => { return Data.PowerReplenish.ToString (GetIntCommas ()); }, (Data) => { return Data.PowerReplenish.ToString (); }, (Left, Right) => { return Left.PowerReplenish.CompareTo (Right.PowerReplenish); })); CombatantData.ColumnDefs.Add ("DPS", new CombatantData.ColumnDef ("DPS", false, "DOUBLE", "DPS", (Data) => { return Data.DPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.DPS.ToString (usCulture); }, (Left, Right) => { return Left.DPS.CompareTo (Right.DPS); })); CombatantData.ColumnDefs.Add ("EncDPS", new CombatantData.ColumnDef ("EncDPS", true, "DOUBLE", "EncDPS", (Data) => { return Data.EncDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.EncDPS.ToString (usCulture); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); CombatantData.ColumnDefs.Add ("EncHPS", new CombatantData.ColumnDef ("EncHPS", true, "DOUBLE", "EncHPS", (Data) => { return Data.EncHPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.EncHPS.ToString (usCulture); }, (Left, Right) => { return Left.Healed.CompareTo (Right.Healed); })); CombatantData.ColumnDefs.Add ("Hits", new CombatantData.ColumnDef ("Hits", false, "INT", "Hits", (Data) => { return Data.Hits.ToString (GetIntCommas ()); }, (Data) => { return Data.Hits.ToString (); }, (Left, Right) => { return Left.Hits.CompareTo (Right.Hits); })); CombatantData.ColumnDefs.Add ("CritHits", new CombatantData.ColumnDef ("CritHits", false, "INT", "CritHits", (Data) => { return Data.CritHits.ToString (GetIntCommas ()); }, (Data) => { return Data.CritHits.ToString (); }, (Left, Right) => { return Left.CritHits.CompareTo (Right.CritHits); })); CombatantData.ColumnDefs.Add ("Avoids", new CombatantData.ColumnDef ("Avoids", false, "INT", "Blocked", (Data) => { return Data.Blocked.ToString (GetIntCommas ()); }, (Data) => { return Data.Blocked.ToString (); }, (Left, Right) => { return Left.Blocked.CompareTo (Right.Blocked); })); CombatantData.ColumnDefs.Add ("Misses", new CombatantData.ColumnDef ("Misses", false, "INT", "Misses", (Data) => { return Data.Misses.ToString (GetIntCommas ()); }, (Data) => { return Data.Misses.ToString (); }, (Left, Right) => { return Left.Misses.CompareTo (Right.Misses); })); CombatantData.ColumnDefs.Add ("Swings", new CombatantData.ColumnDef ("Swings", false, "INT", "Swings", (Data) => { return Data.Swings.ToString (GetIntCommas ()); }, (Data) => { return Data.Swings.ToString (); }, (Left, Right) => { return Left.Swings.CompareTo (Right.Swings); })); CombatantData.ColumnDefs.Add ("HealingTaken", new CombatantData.ColumnDef ("HealingTaken", false, "BIGINT", "HealsTaken", (Data) => { return Data.HealsTaken.ToString (GetIntCommas ()); }, (Data) => { return Data.HealsTaken.ToString (); }, (Left, Right) => { return Left.HealsTaken.CompareTo (Right.HealsTaken); })); CombatantData.ColumnDefs.Add ("DamageTaken", new CombatantData.ColumnDef ("DamageTaken", true, "BIGINT", "DamageTaken", (Data) => { return Data.DamageTaken.ToString (GetIntCommas ()); }, (Data) => { return Data.DamageTaken.ToString (); }, (Left, Right) => { return Left.DamageTaken.CompareTo (Right.DamageTaken); })); CombatantData.ColumnDefs.Add ("Deaths", new CombatantData.ColumnDef ("Deaths", true, "INT", "Deaths", (Data) => { return Data.Deaths.ToString (GetIntCommas ()); }, (Data) => { return Data.Deaths.ToString (); }, (Left, Right) => { return Left.Deaths.CompareTo (Right.Deaths); })); CombatantData.ColumnDefs.Add ("ToHit%", new CombatantData.ColumnDef ("ToHit%", false, "FLOAT", "ToHit", (Data) => { return Data.ToHit.ToString (GetFloatCommas ()); }, (Data) => { return Data.ToHit.ToString (usCulture); }, (Left, Right) => { return Left.ToHit.CompareTo (Right.ToHit); })); CombatantData.ColumnDefs.Add ("CritDam%", new CombatantData.ColumnDef ("CritDam%", false, "VARCHAR(8)", "CritDamPerc", (Data) => { return Data.CritDamPerc.ToString ("0'%"); }, (Data) => { return Data.CritDamPerc.ToString ("0'%"); }, (Left, Right) => { return Left.CritDamPerc.CompareTo (Right.CritDamPerc); })); CombatantData.ColumnDefs.Add ("CritHeal%", new CombatantData.ColumnDef ("CritHeal%", false, "VARCHAR(8)", "CritHealPerc", (Data) => { return Data.CritHealPerc.ToString ("0'%"); }, (Data) => { return Data.CritHealPerc.ToString ("0'%"); }, (Left, Right) => { return Left.CritHealPerc.CompareTo (Right.CritHealPerc); })); CombatantData.ColumnDefs.Add ("CritTypes", new CombatantData.ColumnDef ("CritTypes", true, "VARCHAR(32)", "CritTypes", CombatantDataGetCritTypes, CombatantDataGetCritTypes, (Left, Right) => { return CombatantDataGetCritTypes (Left).CompareTo (CombatantDataGetCritTypes (Right)); })); CombatantData.ColumnDefs.Add ("Threat +/-", new CombatantData.ColumnDef ("Threat +/-", false, "VARCHAR(32)", "ThreatStr", (Data) => { return Data.GetThreatStr ("Threat (Out)"); }, (Data) => { return Data.GetThreatStr ("Threat (Out)"); }, (Left, Right) => { return Left.GetThreatDelta ("Threat (Out)").CompareTo (Right.GetThreatDelta ("Threat (Out)")); })); CombatantData.ColumnDefs.Add ("ThreatDelta", new CombatantData.ColumnDef ("ThreatDelta", false, "INT", "ThreatDelta", (Data) => { return Data.GetThreatDelta ("Threat (Out)").ToString (GetIntCommas ()); }, (Data) => { return Data.GetThreatDelta ("Threat (Out)").ToString (); }, (Left, Right) => { return Left.GetThreatDelta ("Threat (Out)").CompareTo (Right.GetThreatDelta ("Threat (Out)")); })); CombatantData.ColumnDefs["Damage"].GetCellForeColor = (Data) => { return Color.DarkRed; }; CombatantData.ColumnDefs["Damage%"].GetCellForeColor = (Data) => { return Color.DarkRed; }; CombatantData.ColumnDefs["Healed"].GetCellForeColor = (Data) => { return Color.DarkBlue; }; CombatantData.ColumnDefs["Healed%"].GetCellForeColor = (Data) => { return Color.DarkBlue; }; CombatantData.ColumnDefs["PowerDrain"].GetCellForeColor = (Data) => { return Color.DarkMagenta; }; CombatantData.ColumnDefs["DPS"].GetCellForeColor = (Data) => { return Color.DarkRed; }; CombatantData.ColumnDefs["EncDPS"].GetCellForeColor = (Data) => { return Color.DarkRed; }; CombatantData.ColumnDefs["EncHPS"].GetCellForeColor = (Data) => { return Color.DarkBlue; }; CombatantData.ColumnDefs["DamageTaken"].GetCellForeColor = (Data) => { return Color.DarkOrange; }; CombatantData.OutgoingDamageTypeDataObjects = new Dictionary { {"Auto-Attack (Out)", new CombatantData.DamageTypeDef("Auto-Attack (Out)", -1, Color.DarkGoldenrod)}, {"Skill/Ability (Out)", new CombatantData.DamageTypeDef("Skill/Ability (Out)", -1, Color.DarkOrange)}, {"Outgoing Damage", new CombatantData.DamageTypeDef("Outgoing Damage", 0, Color.Orange)}, {"Healed (Out)", new CombatantData.DamageTypeDef("Healed (Out)", 1, Color.Blue)}, {"Power Drain (Out)", new CombatantData.DamageTypeDef("Power Drain (Out)", -1, Color.Purple)}, {"Power Replenish (Out)", new CombatantData.DamageTypeDef("Power Replenish (Out)", 1, Color.Violet)}, {"Cure/Dispel (Out)", new CombatantData.DamageTypeDef("Cure/Dispel (Out)", 0, Color.Wheat)}, {"Threat (Out)", new CombatantData.DamageTypeDef("Threat (Out)", -1, Color.Yellow)}, {"All Outgoing (Ref)", new CombatantData.DamageTypeDef("All Outgoing (Ref)", 0, Color.Black)} }; CombatantData.IncomingDamageTypeDataObjects = new Dictionary { {"Incoming Damage", new CombatantData.DamageTypeDef("Incoming Damage", -1, Color.Red)}, {"Healed (Inc)", new CombatantData.DamageTypeDef("Healed (Inc)", 1, Color.LimeGreen)}, {"Power Drain (Inc)", new CombatantData.DamageTypeDef("Power Drain (Inc)", -1, Color.Magenta)}, {"Power Replenish (Inc)", new CombatantData.DamageTypeDef("Power Replenish (Inc)", 1, Color.MediumPurple)}, {"Cure/Dispel (Inc)", new CombatantData.DamageTypeDef("Cure/Dispel (Inc)", 0, Color.Wheat)}, {"Threat (Inc)", new CombatantData.DamageTypeDef("Threat (Inc)", -1, Color.Yellow)}, {"All Incoming (Ref)", new CombatantData.DamageTypeDef("All Incoming (Ref)", 0, Color.Black)} }; CombatantData.SwingTypeToDamageTypeDataLinksOutgoing = new SortedDictionary> { {1, new List { "Auto-Attack (Out)", "Outgoing Damage" } }, {2, new List { "Skill/Ability (Out)", "Outgoing Damage" } }, {3, new List { "Healed (Out)" } }, {10, new List { "Power Drain (Out)" } }, {13, new List { "Power Replenish (Out)" } }, {20, new List { "Cure/Dispel (Out)" } }, {16, new List { "Threat (Out)" } } }; CombatantData.SwingTypeToDamageTypeDataLinksIncoming = new SortedDictionary> { {1, new List { "Incoming Damage" } }, {2, new List { "Incoming Damage" } }, {3, new List { "Healed (Inc)" } }, {10, new List { "Power Drain (Inc)" } }, {13, new List { "Power Replenish (Inc)" } }, {20, new List { "Cure/Dispel (Inc)" } }, {16, new List { "Threat (Inc)" } } }; CombatantData.DamageSwingTypes = new List { 1, 2 }; CombatantData.HealingSwingTypes = new List { 3 }; CombatantData.DamageTypeDataNonSkillDamage = "Auto-Attack (Out)"; CombatantData.DamageTypeDataOutgoingDamage = "Outgoing Damage"; CombatantData.DamageTypeDataOutgoingHealing = "Healed (Out)"; CombatantData.DamageTypeDataIncomingDamage = "Incoming Damage"; CombatantData.DamageTypeDataIncomingHealing = "Healed (Inc)"; CombatantData.ExportVariables.Clear (); CombatantData.ExportVariables.Add ("n", new CombatantData.TextExportFormatter ("n", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-newline"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-newline"].DisplayedText, (Data, Extra) => { return "\n"; })); CombatantData.ExportVariables.Add ("t", new CombatantData.TextExportFormatter ("t", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-tab"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-tab"].DisplayedText, (Data, Extra) => { return "\t"; })); CombatantData.ExportVariables.Add ("name", new CombatantData.TextExportFormatter ("name", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-name"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-name"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "name", Extra); })); CombatantData.ExportVariables.Add ("NAME", new CombatantData.TextExportFormatter ("NAME", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME", Extra); })); CombatantData.ExportVariables.Add ("duration", new CombatantData.TextExportFormatter ("duration", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-duration"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-duration"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "duration", Extra); })); CombatantData.ExportVariables.Add ("DURATION", new CombatantData.TextExportFormatter ("DURATION", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-DURATION"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-DURATION"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "DURATION", Extra); })); CombatantData.ExportVariables.Add ("damage", new CombatantData.TextExportFormatter ("damage", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-damage"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-damage"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "damage", Extra); })); CombatantData.ExportVariables.Add ("damage-m", new CombatantData.TextExportFormatter ("damage-m", "Damage M", "Damage divided by 1,000,000 (with two decimal places)", (Data, Extra) => { return CombatantFormatSwitch (Data, "damage-m", Extra); })); CombatantData.ExportVariables.Add ("DAMAGE-k", new CombatantData.TextExportFormatter ("DAMAGE-k", "Short Damage K", "Damage divided by 1,000 (with no decimal places)", (Data, Extra) => { return CombatantFormatSwitch (Data, "DAMAGE-k", Extra); })); CombatantData.ExportVariables.Add ("DAMAGE-m", new CombatantData.TextExportFormatter ("DAMAGE-m", "Short Damage M", "Damage divided by 1,000,000 (with no decimal places)", (Data, Extra) => { return CombatantFormatSwitch (Data, "DAMAGE-m", Extra); })); CombatantData.ExportVariables.Add ("damage%", new CombatantData.TextExportFormatter ("damage%", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-damage%"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-damage%"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "damage%", Extra); })); CombatantData.ExportVariables.Add ("dps", new CombatantData.TextExportFormatter ("dps", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-dps"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-dps"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "dps", Extra); })); CombatantData.ExportVariables.Add ("DPS", new CombatantData.TextExportFormatter ("DPS", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-DPS"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-DPS"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "DPS", Extra); })); CombatantData.ExportVariables.Add ("DPS-k", new CombatantData.TextExportFormatter ("DPS-k", "Short DPS K", "Short DPS divided by 1,000 (with no decimal places)", (Data, Extra) => { return CombatantFormatSwitch (Data, "DPS-k", Extra); })); CombatantData.ExportVariables.Add ("encdps", new CombatantData.TextExportFormatter ("encdps", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-extdps"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-extdps"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "encdps", Extra); })); CombatantData.ExportVariables.Add ("ENCDPS", new CombatantData.TextExportFormatter ("ENCDPS", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-EXTDPS"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-EXTDPS"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "ENCDPS", Extra); })); CombatantData.ExportVariables.Add ("ENCDPS-k", new CombatantData.TextExportFormatter ("ENCDPS-k", "Short Encounter DPS K", "Short Encounter DPS divided by 1,000 (with no decimal places)", (Data, Extra) => { return CombatantFormatSwitch (Data, "ENCDPS-k", Extra); })); CombatantData.ExportVariables.Add ("hits", new CombatantData.TextExportFormatter ("hits", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-hits"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-hits"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "hits", Extra); })); CombatantData.ExportVariables.Add ("crithits", new CombatantData.TextExportFormatter ("crithits", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-crithits"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-crithits"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "crithits", Extra); })); CombatantData.ExportVariables.Add ("crithit%", new CombatantData.TextExportFormatter ("crithit%", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-crithit%"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-crithit%"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "crithit%", Extra); })); CombatantData.ExportVariables.Add ("crittypes", new CombatantData.TextExportFormatter ("crittypes", "Critical Types", "Distribution of Critical Types (Normal|Legendary|Fabled|Mythical)", (Data, Extra) => { return CombatantFormatSwitch (Data, "crittypes", Extra); })); CombatantData.ExportVariables.Add ("misses", new CombatantData.TextExportFormatter ("misses", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-misses"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-misses"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "misses", Extra); })); CombatantData.ExportVariables.Add ("hitfailed", new CombatantData.TextExportFormatter ("hitfailed", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-hitfailed"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-hitfailed"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "hitfailed", Extra); })); CombatantData.ExportVariables.Add ("swings", new CombatantData.TextExportFormatter ("swings", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-swings"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-swings"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "swings", Extra); })); CombatantData.ExportVariables.Add ("tohit", new CombatantData.TextExportFormatter ("tohit", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-tohit"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-tohit"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "tohit", Extra); })); CombatantData.ExportVariables.Add ("TOHIT", new CombatantData.TextExportFormatter ("TOHIT", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-TOHIT"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-TOHIT"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "TOHIT", Extra); })); CombatantData.ExportVariables.Add ("maxhit", new CombatantData.TextExportFormatter ("maxhit", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-maxhit"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-maxhit"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "maxhit", Extra); })); CombatantData.ExportVariables.Add ("MAXHIT", new CombatantData.TextExportFormatter ("MAXHIT", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-MAXHIT"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-MAXHIT"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "MAXHIT", Extra); })); CombatantData.ExportVariables.Add ("healed", new CombatantData.TextExportFormatter ("healed", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-healed"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-healed"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "healed", Extra); })); CombatantData.ExportVariables.Add ("healed%", new CombatantData.TextExportFormatter ("healed%", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-healed%"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-healed%"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "healed%", Extra); })); CombatantData.ExportVariables.Add ("enchps", new CombatantData.TextExportFormatter ("enchps", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-exthps"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-exthps"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "enchps", Extra); })); CombatantData.ExportVariables.Add ("ENCHPS", new CombatantData.TextExportFormatter ("ENCHPS", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-EXTHPS"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-EXTHPS"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "ENCHPS", Extra); })); CombatantData.ExportVariables.Add ("ENCHPS-k", new CombatantData.TextExportFormatter ("ENCHPS-k", "Short Encounter HPS K", "Short Encounter HPS divided by 1,000 (with no decimal places)", (Data, Extra) => { return CombatantFormatSwitch (Data, "ENCHPS-k", Extra); })); CombatantData.ExportVariables.Add ("critheals", new CombatantData.TextExportFormatter ("critheals", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-critheals"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-critheals"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "critheals", Extra); })); CombatantData.ExportVariables.Add ("critheal%", new CombatantData.TextExportFormatter ("critheal%", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-critheal%"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-critheal%"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "critheal%", Extra); })); CombatantData.ExportVariables.Add ("heals", new CombatantData.TextExportFormatter ("heals", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-heals"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-heals"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "heals", Extra); })); CombatantData.ExportVariables.Add ("cures", new CombatantData.TextExportFormatter ("cures", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-cures"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-cures"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "cures", Extra); })); CombatantData.ExportVariables.Add ("maxheal", new CombatantData.TextExportFormatter ("maxheal", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-maxheal"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-maxheal"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "maxheal", Extra); })); CombatantData.ExportVariables.Add ("MAXHEAL", new CombatantData.TextExportFormatter ("MAXHEAL", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-MAXHEAL"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-MAXHEAL"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "MAXHEAL", Extra); })); CombatantData.ExportVariables.Add ("maxhealward", new CombatantData.TextExportFormatter ("maxhealward", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-maxhealward"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-maxhealward"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "maxhealward", Extra); })); CombatantData.ExportVariables.Add ("MAXHEALWARD", new CombatantData.TextExportFormatter ("MAXHEALWARD", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-MAXHEALWARD"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-MAXHEALWARD"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "MAXHEALWARD", Extra); })); CombatantData.ExportVariables.Add ("damagetaken", new CombatantData.TextExportFormatter ("damagetaken", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-damagetaken"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-damagetaken"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "damagetaken", Extra); })); CombatantData.ExportVariables.Add ("healstaken", new CombatantData.TextExportFormatter ("healstaken", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-healstaken"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-healstaken"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "healstaken", Extra); })); CombatantData.ExportVariables.Add ("powerdrain", new CombatantData.TextExportFormatter ("powerdrain", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-powerdrain"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-powerdrain"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "powerdrain", Extra); })); CombatantData.ExportVariables.Add ("powerheal", new CombatantData.TextExportFormatter ("powerheal", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-powerheal"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-powerheal"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "powerheal", Extra); })); CombatantData.ExportVariables.Add ("kills", new CombatantData.TextExportFormatter ("kills", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-kills"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-kills"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "kills", Extra); })); CombatantData.ExportVariables.Add ("deaths", new CombatantData.TextExportFormatter ("deaths", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-deaths"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-deaths"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "deaths", Extra); })); CombatantData.ExportVariables.Add ("threatstr", new CombatantData.TextExportFormatter ("threatstr", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-threatstr"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-threatstr"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "threatstr", Extra); })); CombatantData.ExportVariables.Add ("threatdelta", new CombatantData.TextExportFormatter ("threatdelta", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-threatdelta"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-threatdelta"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "threatdelta", Extra); })); CombatantData.ExportVariables.Add ("NAME3", new CombatantData.TextExportFormatter ("NAME3", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME3"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME3"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME3", Extra); })); CombatantData.ExportVariables.Add ("NAME4", new CombatantData.TextExportFormatter ("NAME4", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME4"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME4"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME4", Extra); })); CombatantData.ExportVariables.Add ("NAME5", new CombatantData.TextExportFormatter ("NAME5", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME5"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME5"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME5", Extra); })); CombatantData.ExportVariables.Add ("NAME6", new CombatantData.TextExportFormatter ("NAME6", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME6"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME6"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME6", Extra); })); CombatantData.ExportVariables.Add ("NAME7", new CombatantData.TextExportFormatter ("NAME7", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME7"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME7"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME7", Extra); })); CombatantData.ExportVariables.Add ("NAME8", new CombatantData.TextExportFormatter ("NAME8", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME8"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME8"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME8", Extra); })); CombatantData.ExportVariables.Add ("NAME9", new CombatantData.TextExportFormatter ("NAME9", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME9"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME9"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME9", Extra); })); CombatantData.ExportVariables.Add ("NAME10", new CombatantData.TextExportFormatter ("NAME10", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME10"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME10"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME10", Extra); })); CombatantData.ExportVariables.Add ("NAME11", new CombatantData.TextExportFormatter ("NAME11", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME11"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME11"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME11", Extra); })); CombatantData.ExportVariables.Add ("NAME12", new CombatantData.TextExportFormatter ("NAME12", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME12"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME12"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME12", Extra); })); CombatantData.ExportVariables.Add ("NAME13", new CombatantData.TextExportFormatter ("NAME13", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME13"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME13"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME13", Extra); })); CombatantData.ExportVariables.Add ("NAME14", new CombatantData.TextExportFormatter ("NAME14", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME14"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME14"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME14", Extra); })); CombatantData.ExportVariables.Add ("NAME15", new CombatantData.TextExportFormatter ("NAME15", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-NAME15"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-NAME15"].DisplayedText, (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME15", Extra); })); DamageTypeData.ColumnDefs.Clear (); DamageTypeData.ColumnDefs.Add ("EncId", new DamageTypeData.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.Parent.Parent.EncId; })); DamageTypeData.ColumnDefs.Add ("Combatant", new DamageTypeData.ColumnDef ("Combatant", false, "VARCHAR(64)", "Combatant", (Data) => { return Data.Parent.Name; }, (Data) => { return Data.Parent.Name; })); DamageTypeData.ColumnDefs.Add ("Grouping", new DamageTypeData.ColumnDef ("Grouping", false, "VARCHAR(92)", "Grouping", (Data) => { return string.Empty; }, GetDamageTypeGrouping)); DamageTypeData.ColumnDefs.Add ("Type", new DamageTypeData.ColumnDef ("Type", true, "VARCHAR(64)", "Type", (Data) => { return Data.Type; }, (Data) => { return Data.Type; })); DamageTypeData.ColumnDefs.Add ("StartTime", new DamageTypeData.ColumnDef ("StartTime", false, "TIMESTAMP", "StartTime", (Data) => { return Data.StartTime == DateTime.MaxValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.StartTime == DateTime.MaxValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); })); DamageTypeData.ColumnDefs.Add ("EndTime", new DamageTypeData.ColumnDef ("EndTime", false, "TIMESTAMP", "EndTime", (Data) => { return Data.EndTime == DateTime.MinValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.EndTime == DateTime.MinValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); })); DamageTypeData.ColumnDefs.Add ("Duration", new DamageTypeData.ColumnDef ("Duration", false, "INT", "Duration", (Data) => { return Data.DurationS; }, (Data) => { return Data.Duration.TotalSeconds.ToString ("0"); })); DamageTypeData.ColumnDefs.Add ("Damage", new DamageTypeData.ColumnDef ("Damage", true, "BIGINT", "Damage", (Data) => { return Data.Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Damage.ToString (); })); DamageTypeData.ColumnDefs.Add ("EncDPS", new DamageTypeData.ColumnDef ("EncDPS", true, "DOUBLE", "EncDPS", (Data) => { return Data.EncDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.EncDPS.ToString (usCulture); })); DamageTypeData.ColumnDefs.Add ("CharDPS", new DamageTypeData.ColumnDef ("CharDPS", false, "DOUBLE", "CharDPS", (Data) => { return Data.CharDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.CharDPS.ToString (usCulture); })); DamageTypeData.ColumnDefs.Add ("DPS", new DamageTypeData.ColumnDef ("DPS", false, "DOUBLE", "DPS", (Data) => { return Data.DPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.DPS.ToString (usCulture); })); DamageTypeData.ColumnDefs.Add ("Average", new DamageTypeData.ColumnDef ("Average", true, "DOUBLE", "Average", (Data) => { return Data.Average.ToString (GetFloatCommas ()); }, (Data) => { return Data.Average.ToString (usCulture); })); DamageTypeData.ColumnDefs.Add ("Median", new DamageTypeData.ColumnDef ("Median", false, "BIGINT", "Median", (Data) => { return Data.Median.ToString (GetIntCommas ()); }, (Data) => { return Data.Median.ToString (); })); DamageTypeData.ColumnDefs.Add ("MinHit", new DamageTypeData.ColumnDef ("MinHit", true, "BIGINT", "MinHit", (Data) => { return Data.MinHit.ToString (GetIntCommas ()); }, (Data) => { return Data.MinHit.ToString (); })); DamageTypeData.ColumnDefs.Add ("MaxHit", new DamageTypeData.ColumnDef ("MaxHit", true, "BIGINT", "MaxHit", (Data) => { return Data.MaxHit.ToString (GetIntCommas ()); }, (Data) => { return Data.MaxHit.ToString (); })); DamageTypeData.ColumnDefs.Add ("Hits", new DamageTypeData.ColumnDef ("Hits", true, "INT", "Hits", (Data) => { return Data.Hits.ToString (GetIntCommas ()); }, (Data) => { return Data.Hits.ToString (); })); DamageTypeData.ColumnDefs.Add ("CritHits", new DamageTypeData.ColumnDef ("CritHits", false, "INT", "CritHits", (Data) => { return Data.CritHits.ToString (GetIntCommas ()); }, (Data) => { return Data.CritHits.ToString (); })); DamageTypeData.ColumnDefs.Add ("Avoids", new DamageTypeData.ColumnDef ("Avoids", false, "INT", "Blocked", (Data) => { return Data.Blocked.ToString (GetIntCommas ()); }, (Data) => { return Data.Blocked.ToString (); })); DamageTypeData.ColumnDefs.Add ("Misses", new DamageTypeData.ColumnDef ("Misses", false, "INT", "Misses", (Data) => { return Data.Misses.ToString (GetIntCommas ()); }, (Data) => { return Data.Misses.ToString (); })); DamageTypeData.ColumnDefs.Add ("Swings", new DamageTypeData.ColumnDef ("Swings", true, "INT", "Swings", (Data) => { return Data.Swings.ToString (GetIntCommas ()); }, (Data) => { return Data.Swings.ToString (); })); DamageTypeData.ColumnDefs.Add ("ToHit", new DamageTypeData.ColumnDef ("ToHit", false, "FLOAT", "ToHit", (Data) => { return Data.ToHit.ToString (GetFloatCommas ()); }, (Data) => { return Data.ToHit.ToString (); })); DamageTypeData.ColumnDefs.Add ("AvgDelay", new DamageTypeData.ColumnDef ("AvgDelay", false, "FLOAT", "AverageDelay", (Data) => { return Data.AverageDelay.ToString (GetFloatCommas ()); }, (Data) => { return Data.AverageDelay.ToString (); })); DamageTypeData.ColumnDefs.Add ("Crit%", new DamageTypeData.ColumnDef ("Crit%", false, "VARCHAR(8)", "CritPerc", (Data) => { return Data.CritPerc.ToString ("0'%"); }, (Data) => { return Data.CritPerc.ToString ("0'%"); })); DamageTypeData.ColumnDefs.Add ("CritTypes", new DamageTypeData.ColumnDef ("CritTypes", true, "VARCHAR(32)", "CritTypes", DamageTypeDataGetCritTypes, DamageTypeDataGetCritTypes)); AttackType.ColumnDefs.Clear (); AttackType.ColumnDefs.Add ("EncId", new AttackType.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.Parent.Parent.Parent.EncId; }, (Left, Right) => { return 0; })); AttackType.ColumnDefs.Add ("Attacker", new AttackType.ColumnDef ("Attacker", false, "VARCHAR(64)", "Attacker", (Data) => { return Data.Parent.Outgoing ? Data.Parent.Parent.Name : string.Empty; }, (Data) => { return Data.Parent.Outgoing ? Data.Parent.Parent.Name : string.Empty; }, (Left, Right) => { return 0; })); AttackType.ColumnDefs.Add ("Victim", new AttackType.ColumnDef ("Victim", false, "VARCHAR(64)", "Victim", (Data) => { return Data.Parent.Outgoing ? string.Empty : Data.Parent.Parent.Name; }, (Data) => { return Data.Parent.Outgoing ? string.Empty : Data.Parent.Parent.Name; }, (Left, Right) => { return 0; })); AttackType.ColumnDefs.Add ("SwingType", new AttackType.ColumnDef ("SwingType", false, "TINYINT", "SwingType", GetAttackTypeSwingType, GetAttackTypeSwingType, (Left, Right) => { return 0; })); AttackType.ColumnDefs.Add ("Type", new AttackType.ColumnDef ("Type", true, "VARCHAR(64)", "Type", (Data) => { return Data.Type; }, (Data) => { return Data.Type; }, (Left, Right) => { return Left.Type.CompareTo (Right.Type); })); AttackType.ColumnDefs.Add ("StartTime", new AttackType.ColumnDef ("StartTime", false, "TIMESTAMP", "StartTime", (Data) => { return Data.StartTime == DateTime.MaxValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.StartTime == DateTime.MaxValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.StartTime.CompareTo (Right.StartTime); })); AttackType.ColumnDefs.Add ("EndTime", new AttackType.ColumnDef ("EndTime", false, "TIMESTAMP", "EndTime", (Data) => { return Data.EndTime == DateTime.MinValue ? "--:--:--" : Data.EndTime.ToString ("T"); }, (Data) => { return Data.EndTime == DateTime.MinValue ? "0000-00-00 00:00:00" : Data.EndTime.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.EndTime.CompareTo (Right.EndTime); })); AttackType.ColumnDefs.Add ("Duration", new AttackType.ColumnDef ("Duration", false, "INT", "Duration", (Data) => { return Data.DurationS; }, (Data) => { return Data.Duration.TotalSeconds.ToString ("0"); }, (Left, Right) => { return Left.Duration.CompareTo (Right.Duration); })); AttackType.ColumnDefs.Add ("Damage", new AttackType.ColumnDef ("Damage", true, "BIGINT", "Damage", (Data) => { return Data.Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Damage.ToString (); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); AttackType.ColumnDefs.Add ("EncDPS", new AttackType.ColumnDef ("EncDPS", true, "DOUBLE", "EncDPS", (Data) => { return Data.EncDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.EncDPS.ToString (usCulture); }, (Left, Right) => { return Left.EncDPS.CompareTo (Right.EncDPS); })); AttackType.ColumnDefs.Add ("CharDPS", new AttackType.ColumnDef ("CharDPS", false, "DOUBLE", "CharDPS", (Data) => { return Data.CharDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.CharDPS.ToString (usCulture); }, (Left, Right) => { return Left.CharDPS.CompareTo (Right.CharDPS); })); AttackType.ColumnDefs.Add ("DPS", new AttackType.ColumnDef ("DPS", false, "DOUBLE", "DPS", (Data) => { return Data.DPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.DPS.ToString (usCulture); }, (Left, Right) => { return Left.DPS.CompareTo (Right.DPS); })); AttackType.ColumnDefs.Add ("Average", new AttackType.ColumnDef ("Average", true, "DOUBLE", "Average", (Data) => { return Data.Average.ToString (GetFloatCommas ()); }, (Data) => { return Data.Average.ToString (usCulture); }, (Left, Right) => { return Left.Average.CompareTo (Right.Average); })); AttackType.ColumnDefs.Add ("Median", new AttackType.ColumnDef ("Median", true, "BIGINT", "Median", (Data) => { return Data.Median.ToString (GetIntCommas ()); }, (Data) => { return Data.Median.ToString (); }, (Left, Right) => { return Left.Median.CompareTo (Right.Median); })); AttackType.ColumnDefs.Add ("MinHit", new AttackType.ColumnDef ("MinHit", true, "BIGINT", "MinHit", (Data) => { return Data.MinHit.ToString (GetIntCommas ()); }, (Data) => { return Data.MinHit.ToString (); }, (Left, Right) => { return Left.MinHit.CompareTo (Right.MinHit); })); AttackType.ColumnDefs.Add ("MaxHit", new AttackType.ColumnDef ("MaxHit", true, "BIGINT", "MaxHit", (Data) => { return Data.MaxHit.ToString (GetIntCommas ()); }, (Data) => { return Data.MaxHit.ToString (); }, (Left, Right) => { return Left.MaxHit.CompareTo (Right.MaxHit); })); AttackType.ColumnDefs.Add ("Resist", new AttackType.ColumnDef ("Resist", true, "VARCHAR(64)", "Resist", (Data) => { return Data.Resist; }, (Data) => { return Data.Resist; }, (Left, Right) => { return Left.Resist.CompareTo (Right.Resist); })); AttackType.ColumnDefs.Add ("Hits", new AttackType.ColumnDef ("Hits", true, "INT", "Hits", (Data) => { return Data.Hits.ToString (GetIntCommas ()); }, (Data) => { return Data.Hits.ToString (); }, (Left, Right) => { return Left.Hits.CompareTo (Right.Hits); })); AttackType.ColumnDefs.Add ("CritHits", new AttackType.ColumnDef ("CritHits", false, "INT", "CritHits", (Data) => { return Data.CritHits.ToString (GetIntCommas ()); }, (Data) => { return Data.CritHits.ToString (); }, (Left, Right) => { return Left.CritHits.CompareTo (Right.CritHits); })); AttackType.ColumnDefs.Add ("Avoids", new AttackType.ColumnDef ("Avoids", false, "INT", "Blocked", (Data) => { return Data.Blocked.ToString (GetIntCommas ()); }, (Data) => { return Data.Blocked.ToString (); }, (Left, Right) => { return Left.Blocked.CompareTo (Right.Blocked); })); AttackType.ColumnDefs.Add ("Misses", new AttackType.ColumnDef ("Misses", false, "INT", "Misses", (Data) => { return Data.Misses.ToString (GetIntCommas ()); }, (Data) => { return Data.Misses.ToString (); }, (Left, Right) => { return Left.Misses.CompareTo (Right.Misses); })); AttackType.ColumnDefs.Add ("Swings", new AttackType.ColumnDef ("Swings", true, "INT", "Swings", (Data) => { return Data.Swings.ToString (GetIntCommas ()); }, (Data) => { return Data.Swings.ToString (); }, (Left, Right) => { return Left.Swings.CompareTo (Right.Swings); })); AttackType.ColumnDefs.Add ("ToHit", new AttackType.ColumnDef ("ToHit", true, "FLOAT", "ToHit", (Data) => { return Data.ToHit.ToString (GetFloatCommas ()); }, (Data) => { return Data.ToHit.ToString (usCulture); }, (Left, Right) => { return Left.ToHit.CompareTo (Right.ToHit); })); AttackType.ColumnDefs.Add ("AvgDelay", new AttackType.ColumnDef ("AvgDelay", false, "FLOAT", "AverageDelay", (Data) => { return Data.AverageDelay.ToString (GetFloatCommas ()); }, (Data) => { return Data.AverageDelay.ToString (usCulture); }, (Left, Right) => { return Left.AverageDelay.CompareTo (Right.AverageDelay); })); AttackType.ColumnDefs.Add ("Crit%", new AttackType.ColumnDef ("Crit%", true, "VARCHAR(8)", "CritPerc", (Data) => { return Data.CritPerc.ToString ("0'%"); }, (Data) => { return Data.CritPerc.ToString ("0'%"); }, (Left, Right) => { return Left.CritPerc.CompareTo (Right.CritPerc); })); AttackType.ColumnDefs.Add ("CritTypes", new AttackType.ColumnDef ("CritTypes", true, "VARCHAR(32)", "CritTypes", AttackTypeGetCritTypes, AttackTypeGetCritTypes, (Left, Right) => { return AttackTypeGetCritTypes (Left).CompareTo (AttackTypeGetCritTypes (Right)); })); MasterSwing.ColumnDefs.Clear (); MasterSwing.ColumnDefs.Add ("EncId", new MasterSwing.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.ParentEncounter.EncId; }, (Left, Right) => { return 0; })); MasterSwing.ColumnDefs.Add ("Time", new MasterSwing.ColumnDef ("Time", true, "TIMESTAMP", "STime", (Data) => { return Data.Time.ToString ("T"); }, (Data) => { return Data.Time.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.Time.CompareTo (Right.Time); })); MasterSwing.ColumnDefs.Add ("Attacker", new MasterSwing.ColumnDef ("Attacker", true, "VARCHAR(64)", "Attacker", (Data) => { return Data.Attacker; }, (Data) => { return Data.Attacker; }, (Left, Right) => { return Left.Attacker.CompareTo (Right.Attacker); })); MasterSwing.ColumnDefs.Add ("SwingType", new MasterSwing.ColumnDef ("SwingType", false, "TINYINT", "SwingType", (Data) => { return Data.SwingType.ToString (); }, (Data) => { return Data.SwingType.ToString (); }, (Left, Right) => { return Left.SwingType.CompareTo (Right.SwingType); })); MasterSwing.ColumnDefs.Add ("AttackType", new MasterSwing.ColumnDef ("AttackType", true, "VARCHAR(64)", "AttackType", (Data) => { return Data.AttackType; }, (Data) => { return Data.AttackType; }, (Left, Right) => { return Left.AttackType.CompareTo (Right.AttackType); })); MasterSwing.ColumnDefs.Add ("DamageType", new MasterSwing.ColumnDef ("DamageType", true, "VARCHAR(64)", "DamageType", (Data) => { return Data.DamageType; }, (Data) => { return Data.DamageType; }, (Left, Right) => { return Left.DamageType.CompareTo (Right.DamageType); })); MasterSwing.ColumnDefs.Add ("Victim", new MasterSwing.ColumnDef ("Victim", true, "VARCHAR(64)", "Victim", (Data) => { return Data.Victim; }, (Data) => { return Data.Victim; }, (Left, Right) => { return Left.Victim.CompareTo (Right.Victim); })); MasterSwing.ColumnDefs.Add ("DamageNum", new MasterSwing.ColumnDef ("DamageNum", false, "BIGINT", "Damage", (Data) => { return ((long) Data.Damage).ToString (); },(Data) => { return ((long) Data.Damage).ToString (); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); MasterSwing.ColumnDefs.Add ("Damage", new MasterSwing.ColumnDef ("Damage", true, "VARCHAR(128)", "DamageString", (Data) => { return Data.Damage.ToString (); }, (Data) => { return Data.Damage.ToString (); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); MasterSwing.ColumnDefs.Add ("Critical", new MasterSwing.ColumnDef ("Critical", false, "CHAR(1)", "Critical", (Data) => { return Data.Critical.ToString (); }, (Data) => { return Data.Critical.ToString (usCulture)[0].ToString (); }, (Left, Right) => { return Left.Critical.CompareTo (Right.Critical); })); MasterSwing.ColumnDefs.Add ("CriticalStr", new MasterSwing.ColumnDef ("CriticalStr", true, "VARCHAR(32)", "CriticalStr", (Data) => { if (Data.Tags.ContainsKey ("CriticalStr")) return (string) Data.Tags["CriticalStr"]; else return "None"; }, (Data) => { if (Data.Tags.ContainsKey ("CriticalStr")) return (string) Data.Tags["CriticalStr"]; else return "None"; }, (Left, Right) => { string left = Left.Tags.ContainsKey ("CriticalStr") ? (string) Left.Tags ["CriticalStr"] : "None"; string right = Right.Tags.ContainsKey ("CriticalStr") ? (string) Right.Tags["CriticalStr"] : "None"; return left.CompareTo (right); })); MasterSwing.ColumnDefs.Add ("Special", new MasterSwing.ColumnDef ("Special", true, "VARCHAR(64)", "Special", (Data) => { return Data.Special; }, (Data) => { return Data.Special; }, (Left, Right) => { return Left.Special.CompareTo (Right.Special); })); foreach (KeyValuePair pair in MasterSwing.ColumnDefs) pair.Value.GetCellForeColor = (Data) => { return GetSwingTypeColor (Data.SwingType); }; ActGlobals.oFormActMain.ValidateLists (); ActGlobals.oFormActMain.ValidateTableSetup (); } private void SetupEQ2RussianEnvironment () { CultureInfo usCulture = new CultureInfo ("en-US"); // This is for SQL syntax; do not change EncounterData.ColumnDefs.Clear (); // Do not change the SqlDataName while doing localization EncounterData.ColumnDefs.Add ("id боя", new EncounterData.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.EncId; })); EncounterData.ColumnDefs.Add ("Название", new EncounterData.ColumnDef ("Title", true, "VARCHAR(64)", "Title", (Data) => { return Data.Title; }, (Data) => { return Data.Title; })); EncounterData.ColumnDefs.Add ("Время начала", new EncounterData.ColumnDef ("StartTime", true, "TIMESTAMP", "StartTime", (Data) => { return Data.StartTime == DateTime.MaxValue ? "--:--:--" : String.Format ("{0} {1}", Data.StartTime.ToShortDateString (), Data.StartTime.ToLongTimeString ()); }, (Data) => { return Data.StartTime == DateTime.MaxValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); })); EncounterData.ColumnDefs.Add ("Время конца", new EncounterData.ColumnDef ("EndTime", true, "TIMESTAMP", "EndTime", (Data) => { return Data.EndTime == DateTime.MinValue ? "--:--:--" : Data.EndTime.ToString ("T"); }, (Data) => { return Data.EndTime == DateTime.MinValue ? "0000-00-00 00:00:00" : Data.EndTime.ToString ("u").TrimEnd (new char[] { 'Z' }); })); EncounterData.ColumnDefs.Add ("Длительность", new EncounterData.ColumnDef ("Duration", true, "INT", "Duration", (Data) => { return Data.DurationS; }, (Data) => { return Data.Duration.TotalSeconds.ToString ("0"); })); EncounterData.ColumnDefs.Add ("Урон", new EncounterData.ColumnDef ("Damage", true, "BIGINT", "Damage", (Data) => { return Data.Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Damage.ToString (); })); EncounterData.ColumnDefs.Add ("ДПС Боя", new EncounterData.ColumnDef ("EncDPS", true, "DOUBLE", "EncDPS", (Data) => { return Data.DPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.DPS.ToString (usCulture); })); EncounterData.ColumnDefs.Add ("Зона", new EncounterData.ColumnDef ("Zone", false, "VARCHAR(64)", "Zone", (Data) => { return Data.ZoneName; }, (Data) => { return Data.ZoneName; })); EncounterData.ColumnDefs.Add ("Убийства", new EncounterData.ColumnDef ("Kills", true, "INT", "Kills", (Data) => { return Data.AlliedKills.ToString (GetIntCommas ()); }, (Data) => { return Data.AlliedKills.ToString (); })); EncounterData.ColumnDefs.Add ("Смерти", new EncounterData.ColumnDef ("Deaths", true, "INT", "Deaths", (Data) => { return Data.AlliedDeaths.ToString (); }, (Data) => { return Data.AlliedDeaths.ToString (); })); EncounterData.ExportVariables.Clear (); EncounterData.ExportVariables.Add ("n", new EncounterData.TextExportFormatter ("n", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-newline"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-newline"].DisplayedText, (Data, SelectiveAllies, Extra) => { return "\n"; })); EncounterData.ExportVariables.Add ("t", new EncounterData.TextExportFormatter ("t", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-tab"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-tab"].DisplayedText, (Data, SelectiveAllies, Extra) => { return "\t"; })); EncounterData.ExportVariables.Add ("title", new EncounterData.TextExportFormatter ("title", "Заголовок боя", "Заголовок законченного боя. Используется только в форматировании заголовка.", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "title", Extra); })); EncounterData.ExportVariables.Add ("duration", new EncounterData.TextExportFormatter ("duration", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-duration"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-duration"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "duration", Extra); })); EncounterData.ExportVariables.Add ("DURATION", new EncounterData.TextExportFormatter ("DURATION", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-DURATION"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-DURATION"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DURATION", Extra); })); EncounterData.ExportVariables.Add ("damage", new EncounterData.TextExportFormatter ("damage", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-damage"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-damage"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "damage", Extra); })); EncounterData.ExportVariables.Add ("damage-m", new EncounterData.TextExportFormatter ("damage-m", "Damage M", "Damage divided by 1,000,000 (with two decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "damage-m", Extra); })); EncounterData.ExportVariables.Add ("DAMAGE-k", new EncounterData.TextExportFormatter ("DAMAGE-k", "Short Damage K", "Damage divided by 1,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DAMAGE-k", Extra); })); EncounterData.ExportVariables.Add ("DAMAGE-m", new EncounterData.TextExportFormatter ("DAMAGE-m", "Short Damage M", "Damage divided by 1,000,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DAMAGE-m", Extra); })); EncounterData.ExportVariables.Add ("dps", new EncounterData.TextExportFormatter ("dps", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-dps"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-dps"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "dps", Extra); })); EncounterData.ExportVariables.Add ("DPS", new EncounterData.TextExportFormatter ("DPS", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-DPS"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-DPS"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DPS", Extra); })); EncounterData.ExportVariables.Add ("DPS-k", new EncounterData.TextExportFormatter ("DPS-k", "DPS K", "DPS divided by 1,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "DPS-k", Extra); })); EncounterData.ExportVariables.Add ("encdps", new EncounterData.TextExportFormatter ("encdps", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-extdps"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-extdps"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "encdps", Extra); })); EncounterData.ExportVariables.Add ("ENCDPS", new EncounterData.TextExportFormatter ("ENCDPS", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-EXTDPS"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-EXTDPS"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "ENCDPS", Extra); })); EncounterData.ExportVariables.Add ("ENCDPS-k", new EncounterData.TextExportFormatter ("ENCDPS-k", "Short DPS K", "ENCDPS divided by 1,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "ENCDPS-k", Extra); })); EncounterData.ExportVariables.Add ("hits", new EncounterData.TextExportFormatter ("hits", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-hits"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-hits"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "hits", Extra); })); EncounterData.ExportVariables.Add ("crithits", new EncounterData.TextExportFormatter ("crithits", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-crithits"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-crithits"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "crithits", Extra); })); EncounterData.ExportVariables.Add ("crithit%", new EncounterData.TextExportFormatter ("crithit%", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-crithit%"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-crithit%"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "crithit%", Extra); })); EncounterData.ExportVariables.Add ("misses", new EncounterData.TextExportFormatter ("misses", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-misses"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-misses"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "misses", Extra); })); EncounterData.ExportVariables.Add ("hitfailed", new EncounterData.TextExportFormatter ("hitfailed", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-hitfailed"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-hitfailed"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "hitfailed", Extra); })); EncounterData.ExportVariables.Add ("swings", new EncounterData.TextExportFormatter ("swings", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-swings"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-swings"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "swings", Extra); })); EncounterData.ExportVariables.Add ("tohit", new EncounterData.TextExportFormatter ("tohit", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-tohit"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-tohit"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "tohit", Extra); })); EncounterData.ExportVariables.Add ("TOHIT", new EncounterData.TextExportFormatter ("TOHIT", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-TOHIT"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-TOHIT"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "TOHIT", Extra); })); EncounterData.ExportVariables.Add ("maxhit", new EncounterData.TextExportFormatter ("maxhit", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-maxhit"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-maxhit"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "maxhit", Extra); })); EncounterData.ExportVariables.Add ("MAXHIT", new EncounterData.TextExportFormatter ("MAXHIT", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-MAXHIT"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-MAXHIT"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "MAXHIT", Extra); })); EncounterData.ExportVariables.Add ("healed", new EncounterData.TextExportFormatter ("healed", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-healed"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-healed"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "healed", Extra); })); EncounterData.ExportVariables.Add ("enchps", new EncounterData.TextExportFormatter ("enchps", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-exthps"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-exthps"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "enchps", Extra); })); EncounterData.ExportVariables.Add ("ENCHPS", new EncounterData.TextExportFormatter ("ENCHPS", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-EXTHPS"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-EXTHPS"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "ENCHPS", Extra); })); EncounterData.ExportVariables.Add ("ENCHPS-k", new EncounterData.TextExportFormatter ("ENCHPS", "Short ENCHPS K", "ENCHPS divided by 1,000 (with no decimal places)", (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "ENCHPS-k", Extra); })); EncounterData.ExportVariables.Add ("heals", new EncounterData.TextExportFormatter ("heals", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-heals"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-heals"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "heals", Extra); })); EncounterData.ExportVariables.Add ("critheals", new EncounterData.TextExportFormatter ("critheals", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-critheals"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-critheals"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "critheals", Extra); })); EncounterData.ExportVariables.Add ("critheal%", new EncounterData.TextExportFormatter ("critheal%", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-critheal%"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-critheal%"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "critheal%", Extra); })); EncounterData.ExportVariables.Add ("cures", new EncounterData.TextExportFormatter ("cures", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-cures"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-cures"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "cures", Extra); })); EncounterData.ExportVariables.Add ("maxheal", new EncounterData.TextExportFormatter ("maxheal", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-maxheal"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-maxheal"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "maxheal", Extra); })); EncounterData.ExportVariables.Add ("MAXHEAL", new EncounterData.TextExportFormatter ("MAXHEAL", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-MAXHEAL"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-MAXHEAL"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "MAXHEAL", Extra); })); EncounterData.ExportVariables.Add ("maxhealward", new EncounterData.TextExportFormatter ("maxhealward", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-maxhealward"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-maxhealward"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "maxhealward", Extra); })); EncounterData.ExportVariables.Add ("MAXHEALWARD", new EncounterData.TextExportFormatter ("MAXHEALWARD", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-MAXHEALWARD"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-MAXHEALWARD"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "MAXHEALWARD", Extra); })); EncounterData.ExportVariables.Add ("damagetaken", new EncounterData.TextExportFormatter ("damagetaken", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-damagetaken"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-damagetaken"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "damagetaken", Extra); })); EncounterData.ExportVariables.Add ("healstaken", new EncounterData.TextExportFormatter ("healstaken", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-healstaken"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-healstaken"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "healstaken", Extra); })); EncounterData.ExportVariables.Add ("powerdrain", new EncounterData.TextExportFormatter ("powerdrain", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-powerdrain"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-powerdrain"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "powerdrain", Extra); })); EncounterData.ExportVariables.Add ("powerheal", new EncounterData.TextExportFormatter ("powerheal", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-powerheal"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-powerheal"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "powerheal", Extra); })); EncounterData.ExportVariables.Add ("kills", new EncounterData.TextExportFormatter ("kills", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-kills"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-kills"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "kills", Extra); })); EncounterData.ExportVariables.Add ("deaths", new EncounterData.TextExportFormatter ("deaths", ActGlobals.ActLocalization.LocalizationStrings["exportFormattingLabel-deaths"].DisplayedText, ActGlobals.ActLocalization.LocalizationStrings["exportFormattingDesc-deaths"].DisplayedText, (Data, SelectiveAllies, Extra) => { return EncounterFormatSwitch (Data, SelectiveAllies, "deaths", Extra); })); CombatantData.ExportVariables.Clear (); CombatantData.ExportVariables.Add ("n", new CombatantData.TextExportFormatter ("n", "Новая строка", "Значения после этого элемента появится на новой строке.", (Data, Extra) => { return "\n"; })); CombatantData.ExportVariables.Add ("t", new CombatantData.TextExportFormatter ("t", "Выравнивание", "Выравнивание(табуирование) данных в столбце данных. (Пример форматирования не правильно отображает данный элемент)", (Data, Extra) => { return "\t"; })); CombatantData.ExportVariables.Add ("name", new CombatantData.TextExportFormatter ("name", "Имя", "Имя персонажа", (Data, Extra) => { return CombatantFormatSwitch (Data, "name", Extra); })); CombatantData.ExportVariables.Add ("NAME", new CombatantData.TextExportFormatter ("NAME", "Имя кратко", "Имена бойцов, укороченные до количества букв после двоеточия: 'NAME:5'", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME", Extra); })); CombatantData.ExportVariables.Add ("duration", new CombatantData.TextExportFormatter ("duration", "Длительность", "Длительность действий этого персонажа или длительность всего боя, отображаемая как мм:сс", (Data, Extra) => { return CombatantFormatSwitch (Data, "duration", Extra); })); CombatantData.ExportVariables.Add ("DURATION", new CombatantData.TextExportFormatter ("DURATION", "Краткая длительность", "Длительность действий этого персонажа или длительность всего боя, отображаемая целым числом секунд.", (Data, Extra) => { return CombatantFormatSwitch (Data, "DURATION", Extra); })); CombatantData.ExportVariables.Add ("damage", new CombatantData.TextExportFormatter ("damage", "Урон", "Величина урона от автоатаки, заклинаний, умений, и т.п., нанесённого по другим противникам.", (Data, Extra) => { return CombatantFormatSwitch (Data, "damage", Extra); })); CombatantData.ExportVariables.Add ("damage-m", new CombatantData.TextExportFormatter ("damage-m", "Урон M", "Урон, делённый на 1,000,000 (с двумя десятичными разрядами)", (Data, Extra) => { return CombatantFormatSwitch (Data, "damage-m", Extra); })); CombatantData.ExportVariables.Add ("DAMAGE-k", new CombatantData.TextExportFormatter ("DAMAGE-k", "Кратко Урон K", "Урон, делённый на 1,000 (без десятичных разрядов)", (Data, Extra) => { return CombatantFormatSwitch (Data, "DAMAGE-k", Extra); })); CombatantData.ExportVariables.Add ("DAMAGE-m", new CombatantData.TextExportFormatter ("DAMAGE-m", "Кратко Урон M", "Урон, делённый на 1,000,000 (без десятичных разрядов)", (Data, Extra) => { return CombatantFormatSwitch (Data, "DAMAGE-m", Extra); })); CombatantData.ExportVariables.Add ("damage%", new CombatantData.TextExportFormatter ("damage%", "Урон %", "Эта величина отражает величину урона в процентах от общего урона группы/рейда.", (Data, Extra) => { return CombatantFormatSwitch (Data, "damage%", Extra); })); CombatantData.ExportVariables.Add ("dps", new CombatantData.TextExportFormatter ("dps", "ДПС", "Общий урон персонажа, разделённый на длительность действий персонажа, формат вывода с десятичными знаками: 12,34", (Data, Extra) => { return CombatantFormatSwitch (Data, "dps", Extra); })); CombatantData.ExportVariables.Add ("DPS", new CombatantData.TextExportFormatter ("DPS", "ДПС кратко", "Общий урон персонажа, разделённый на длительность действий персонажа, формат вывода целочисленный: 12", (Data, Extra) => { return CombatantFormatSwitch (Data, "DPS", Extra); })); CombatantData.ExportVariables.Add ("DPS-k", new CombatantData.TextExportFormatter ("DPS-k", "ДПС K", "Общий урон персонажа, разделённый на длительность действий персонажа, делённый на 1,000 (без десятичных разрядов)", (Data, Extra) => { return CombatantFormatSwitch (Data, "DPS-k", Extra); })); CombatantData.ExportVariables.Add ("encdps", new CombatantData.TextExportFormatter ("encdps", "ДПС боя", "Общий урон персонажа, разделённый на длительность всего боя, формат вывода с десятичными знаками: 12,34 -- Обычно используется чаще чем значение ДПС", (Data, Extra) => { return CombatantFormatSwitch (Data, "encdps", Extra); })); CombatantData.ExportVariables.Add ("ENCDPS", new CombatantData.TextExportFormatter ("ENCDPS", "Кратко ДПС боя", "Общий урон персонажа, разделённый на длительность всего боя, формат вывода целочисленный: 12 -- Обычно используется чаще чем значение ДПС", (Data, Extra) => { return CombatantFormatSwitch (Data, "ENCDPS", Extra); })); CombatantData.ExportVariables.Add ("ENCDPS-k", new CombatantData.TextExportFormatter ("ENCDPS-k", "Кратко ДПС боя K", "Общий урон персонажа, разделённый на длительность всего боя, делённый на 1,000, формат вывода целочисленный.", (Data, Extra) => { return CombatantFormatSwitch (Data, "ENCDPS-k", Extra); })); CombatantData.ExportVariables.Add ("hits", new CombatantData.TextExportFormatter ("hits", "Удары", "Количество ударов, нанёсших урон. Например, заклинаний, успешно нанёсших урон.", (Data, Extra) => { return CombatantFormatSwitch (Data, "hits", Extra); })); CombatantData.ExportVariables.Add ("crithits", new CombatantData.TextExportFormatter ("crithits", "Кол-во крит.ударов", "Количество ударов, нанёсших критический урон. Например, заклинаний, успешно нанёсших критический урон.", (Data, Extra) => { return CombatantFormatSwitch (Data, "crithits", Extra); })); CombatantData.ExportVariables.Add ("crithit%", new CombatantData.TextExportFormatter ("crithit%", "Кол-во крит.ударов, %", "Количество ударов, нанёсших критический урон, в процентах.", (Data, Extra) => { return CombatantFormatSwitch (Data, "crithit%", Extra); })); CombatantData.ExportVariables.Add ("crittypes", new CombatantData.TextExportFormatter ("crittypes", "Типы Крит.ударов", "Распределение по типам Крит.ударов (Обычный|Легендарный|Эпический|Мифический)", (Data, Extra) => { return CombatantFormatSwitch (Data, "crittypes", Extra); })); CombatantData.ExportVariables.Add ("misses", new CombatantData.TextExportFormatter ("misses", "Промахи", "Количество авто-атак или боевых умений, которые дали сообщение о промахе.", (Data, Extra) => { return CombatantFormatSwitch (Data, "misses", Extra); })); CombatantData.ExportVariables.Add ("hitfailed", new CombatantData.TextExportFormatter ("hitfailed", "Неудачный удар", "Любой тип неудачных атак, кроме промахов. Включает сопротивления, отражения, блокирование, уклонение, и т.п..", (Data, Extra) => { return CombatantFormatSwitch (Data, "hitfailed", Extra); })); CombatantData.ExportVariables.Add ("swings", new CombatantData.TextExportFormatter ("swings", "Взмахов (Атака)", "Количество попыток атаки. Включает все авто-атаки или умения, также включает сопротивление умениям, которые не наносят урон.", (Data, Extra) => { return CombatantFormatSwitch (Data, "swings", Extra); })); CombatantData.ExportVariables.Add ("tohit", new CombatantData.TextExportFormatter ("tohit", "Попадания,%", "Процентное отношение ударов к взмахам (попыткам атаки) в виде: 12.34%", (Data, Extra) => { return CombatantFormatSwitch (Data, "tohit", Extra); })); CombatantData.ExportVariables.Add ("TOHIT", new CombatantData.TextExportFormatter ("TOHIT", "Кратко Попадания, %", "Отношение ударов к взмахам в виде целого числа: 12%", (Data, Extra) => { return CombatantFormatSwitch (Data, "TOHIT", Extra); })); CombatantData.ExportVariables.Add ("maxhit", new CombatantData.TextExportFormatter ("maxhit", "Наибольший Удар", "Самый большой одиночный удар по урону, в формате [персонаж-]навык-урон#", (Data, Extra) => { return CombatantFormatSwitch (Data, "maxhit", Extra); })); CombatantData.ExportVariables.Add ("MAXHIT", new CombatantData.TextExportFormatter ("MAXHIT", "Кратко Наибольший Удар", "Самый большой одиночный удар по урону, в формате [персонаж-]урон#", (Data, Extra) => { return CombatantFormatSwitch (Data, "MAXHIT", Extra); })); CombatantData.ExportVariables.Add ("healed", new CombatantData.TextExportFormatter ("healed", "Лечение", "Сумма всего лечения, оберегов или других подобных источников лечения от этого персонажа.", (Data, Extra) => { return CombatantFormatSwitch (Data, "healed", Extra); })); CombatantData.ExportVariables.Add ("healed%", new CombatantData.TextExportFormatter ("healed%", "Лечение,%", "Это значение отображает величину вашего лечения в процентах от общего лечения, произведённого вами и вашими союзниками в бою", (Data, Extra) => { return CombatantFormatSwitch (Data, "healed%", Extra); })); CombatantData.ExportVariables.Add ("enchps", new CombatantData.TextExportFormatter ("enchps", "ХПС персонажа", "Общее лечение персонажа, разделённое на длительность боя, формат вывода с десятичными знаками: 12.34", (Data, Extra) => { return CombatantFormatSwitch (Data, "enchps", Extra); })); CombatantData.ExportVariables.Add ("ENCHPS", new CombatantData.TextExportFormatter ("ENCHPS", "Кратко ХПС персонажа", "Общее лечение персонажа, разделённое на длительность боя, формат вывода целочисленный: 12", (Data, Extra) => { return CombatantFormatSwitch (Data, "ENCHPS", Extra); })); CombatantData.ExportVariables.Add ("ENCHPS-k", new CombatantData.TextExportFormatter ("ENCHPS-k", "Кратко ХПС K", "Общее лечение персонажа, разделённое на длительность боя и делённый на 1,000 (без десятичных разрядов)", (Data, Extra) => { return CombatantFormatSwitch (Data, "ENCHPS-k", Extra); })); CombatantData.ExportVariables.Add ("critheals", new CombatantData.TextExportFormatter ("critheals", "Кол-во Крит.Лечения", "Число актов лечения, сработавших с критическим эффектом.", (Data, Extra) => { return CombatantFormatSwitch (Data, "critheals", Extra); })); CombatantData.ExportVariables.Add ("critheal%", new CombatantData.TextExportFormatter ("critheal%", "Кол-во Крит.Лечения,%", "Число актов лечения, сработавших с критическим эффектом, в процентах.", (Data, Extra) => { return CombatantFormatSwitch (Data, "critheal%", Extra); })); CombatantData.ExportVariables.Add ("heals", new CombatantData.TextExportFormatter ("heals", "Кол-во Лечения", "Общее количество актов лечения этого персонажа.", (Data, Extra) => { return CombatantFormatSwitch (Data, "heals", Extra); })); CombatantData.ExportVariables.Add ("cures", new CombatantData.TextExportFormatter ("cures", "Кол-во Кьюров/Диспелов", "Общее число, когда персонаж снимал доты или диспелил.", (Data, Extra) => { return CombatantFormatSwitch (Data, "cures", Extra); })); CombatantData.ExportVariables.Add ("maxheal", new CombatantData.TextExportFormatter ("maxheal", "Наибольшее Лечение", "Самый сильный моментальный акт лечения, форматированный как [персонаж-]навык-лечение#", (Data, Extra) => { return CombatantFormatSwitch (Data, "maxheal", Extra); })); CombatantData.ExportVariables.Add ("MAXHEAL", new CombatantData.TextExportFormatter ("MAXHEAL", "Кратко Наибольшее Лечение", "Самый сильный моментальный акт лечения, форматированный как [персонаж-]лечение#", (Data, Extra) => { return CombatantFormatSwitch (Data, "MAXHEAL", Extra); })); CombatantData.ExportVariables.Add ("maxhealward", new CombatantData.TextExportFormatter ("maxhealward", "Наибольший Хил/Вард", "Самая большая величина однократного лечения/оберега, форматированная как [персонаж-]навык-лечение#", (Data, Extra) => { return CombatantFormatSwitch (Data, "maxhealward", Extra); })); CombatantData.ExportVariables.Add ("MAXHEALWARD", new CombatantData.TextExportFormatter ("MAXHEALWARD", "Кратко Наибольший Хил/Вард", "Самая большая величина однократного лечения/оберега, форматированная как [персонаж-]лечение#", (Data, Extra) => { return CombatantFormatSwitch (Data, "MAXHEALWARD", Extra); })); CombatantData.ExportVariables.Add ("damagetaken", new CombatantData.TextExportFormatter ("damagetaken", "Входящий Урон", "Общая величина урона, полученного этим персонажем.", (Data, Extra) => { return CombatantFormatSwitch (Data, "damagetaken", Extra); })); CombatantData.ExportVariables.Add ("healstaken", new CombatantData.TextExportFormatter ("healstaken", "Входящее Лечение", "Общая величина лечения, полученного этим персонажем.", (Data, Extra) => { return CombatantFormatSwitch (Data, "healstaken", Extra); })); CombatantData.ExportVariables.Add ("powerdrain", new CombatantData.TextExportFormatter ("powerdrain", "Отбор Энергии", "Величина энергии, которую этот персонаж отнял у других.", (Data, Extra) => { return CombatantFormatSwitch (Data, "powerdrain", Extra); })); CombatantData.ExportVariables.Add ("powerheal", new CombatantData.TextExportFormatter ("powerheal", "Вост.Энергии", "Количество энергии, восполненное этим игроком.", (Data, Extra) => { return CombatantFormatSwitch (Data, "powerheal", Extra); })); CombatantData.ExportVariables.Add ("kills", new CombatantData.TextExportFormatter ("kills", "Кол-во убийств", "Общее число раз, когда этот персонаж нанёс смертельный удар.", (Data, Extra) => { return CombatantFormatSwitch (Data, "kills", Extra); })); CombatantData.ExportVariables.Add ("deaths", new CombatantData.TextExportFormatter ("deaths", "Кол-во смертей", "Общее число раз, когда этот персонаж был убит.", (Data, Extra) => { return CombatantFormatSwitch (Data, "deaths", Extra); })); CombatantData.ExportVariables.Add ("threatstr", new CombatantData.TextExportFormatter ("threatstr", "Ненависть Увел./Умен.", "Количество прямой ненависти ненависти, которое было увеличено/уменьшено.", (Data, Extra) => { return CombatantFormatSwitch (Data, "threatstr", Extra); })); CombatantData.ExportVariables.Add ("threatdelta", new CombatantData.TextExportFormatter ("threatdelta", "Дельта Ненависти", "Количество прямой ненависти, выведенное относительно нуля.", (Data, Extra) => { return CombatantFormatSwitch (Data, "threatdelta", Extra); })); CombatantData.ExportVariables.Add ("NAME3", new CombatantData.TextExportFormatter ("NAME3", "Имя (3 буквы)", "Имя персонажа, будет отображаться не более 3 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME3", Extra); })); CombatantData.ExportVariables.Add ("NAME4", new CombatantData.TextExportFormatter ("NAME4", "Имя (4 буквы)", "Имя персонажа, будет отображаться не более 4 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME4", Extra); })); CombatantData.ExportVariables.Add ("NAME5", new CombatantData.TextExportFormatter ("NAME5", "Имя (5 букв)", "Имя персонажа, будет отображаться не более 5 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME5", Extra); })); CombatantData.ExportVariables.Add ("NAME6", new CombatantData.TextExportFormatter ("NAME6", "Имя (6 букв)", "Имя персонажа, будет отображаться не более 6 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME6", Extra); })); CombatantData.ExportVariables.Add ("NAME7", new CombatantData.TextExportFormatter ("NAME7", "Имя (7 букв)", "Имя персонажа, будет отображаться не более 7 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME7", Extra); })); CombatantData.ExportVariables.Add ("NAME8", new CombatantData.TextExportFormatter ("NAME8", "Имя (8 букв)", "Имя персонажа, будет отображаться не более 8 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME8", Extra); })); CombatantData.ExportVariables.Add ("NAME9", new CombatantData.TextExportFormatter ("NAME9", "Имя (9 букв)", "Имя персонажа, будет отображаться не более 9 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME9", Extra); })); CombatantData.ExportVariables.Add ("NAME10", new CombatantData.TextExportFormatter ("NAME10", "Имя (10 букв)", "Имя персонажа, будет отображаться не более 10 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME10", Extra); })); CombatantData.ExportVariables.Add ("NAME11", new CombatantData.TextExportFormatter ("NAME11", "Имя (11 букв)", "Имя персонажа, будет отображаться не более 11 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME11", Extra); })); CombatantData.ExportVariables.Add ("NAME12", new CombatantData.TextExportFormatter ("NAME12", "Имя (12 букв)", "Имя персонажа, будет отображаться не более 12 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME12", Extra); })); CombatantData.ExportVariables.Add ("NAME13", new CombatantData.TextExportFormatter ("NAME13", "Имя (13 букв)", "Имя персонажа, будет отображаться не более 13 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME13", Extra); })); CombatantData.ExportVariables.Add ("NAME14", new CombatantData.TextExportFormatter ("NAME14", "Имя (14 букв)", "Имя персонажа, будет отображаться не более 14 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME14", Extra); })); CombatantData.ExportVariables.Add ("NAME15", new CombatantData.TextExportFormatter ("NAME15", "Имя (15 букв)", "Имя персонажа, будет отображаться не более 15 символов.", (Data, Extra) => { return CombatantFormatSwitch (Data, "NAME15", Extra); })); CombatantData.ColumnDefs.Clear (); CombatantData.ColumnDefs.Add ("id боя", new CombatantData.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.Parent.EncId; }, (Left, Right) => { return 0; })); CombatantData.ColumnDefs.Add ("Союзники", new CombatantData.ColumnDef ("Ally", false, "CHAR(1)", "Ally", (Data) => { return Data.Parent.GetAllies ().Contains (Data).ToString (); }, (Data) => { return Data.Parent.GetAllies ().Contains (Data) ? "T" : "F"; }, (Left, Right) => { return Left.Parent.GetAllies ().Contains (Left).CompareTo (Right.Parent.GetAllies ().Contains (Right)); })); CombatantData.ColumnDefs.Add ("Имя", new CombatantData.ColumnDef ("Name", true, "VARCHAR(64)", "Name", (Data) => { return Data.Name; }, (Data) => { return Data.Name; }, (Left, Right) => { return Left.Name.CompareTo (Right.Name); })); CombatantData.ColumnDefs.Add ("Время начала", new CombatantData.ColumnDef ("StartTime", true, "TIMESTAMP", "StartTime", (Data) => { return Data.StartTime == DateTime.MaxValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.StartTime == DateTime.MaxValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.StartTime.CompareTo (Right.StartTime); })); CombatantData.ColumnDefs.Add ("Время конца", new CombatantData.ColumnDef ("EndTime", false, "TIMESTAMP", "EndTime", (Data) => { return Data.EndTime == DateTime.MinValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.EndTime == DateTime.MinValue ? "0000-00-00 00:00:00" : Data.EndTime.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.EndTime.CompareTo (Right.EndTime); })); CombatantData.ColumnDefs.Add ("Длительность", new CombatantData.ColumnDef ("Duration", true, "INT", "Duration", (Data) => { return Data.DurationS; }, (Data) => { return Data.Duration.TotalSeconds.ToString ("0"); }, (Left, Right) => { return Left.Duration.CompareTo (Right.Duration); })); CombatantData.ColumnDefs.Add ("Урон", new CombatantData.ColumnDef ("Damage", true, "BIGINT", "Damage", (Data) => { return Data.Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Damage.ToString (); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); CombatantData.ColumnDefs.Add ("Урон,%", new CombatantData.ColumnDef ("Damage%", true, "VARCHAR(4)", "DamagePerc", (Data) => { return Data.DamagePercent; }, (Data) => { return Data.DamagePercent; }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); CombatantData.ColumnDefs.Add ("Убийства", new CombatantData.ColumnDef ("Kills", false, "INT", "Kills", (Data) => { return Data.Kills.ToString (GetIntCommas ()); }, (Data) => { return Data.Kills.ToString (); }, (Left, Right) => { return Left.Kills.CompareTo (Right.Kills); })); CombatantData.ColumnDefs.Add ("Исцелено", new CombatantData.ColumnDef ("Healed", false, "BIGINT", "Healed", (Data) => { return Data.Healed.ToString (GetIntCommas ()); }, (Data) => { return Data.Healed.ToString (); }, (Left, Right) => { return Left.Healed.CompareTo (Right.Healed); })); CombatantData.ColumnDefs.Add ("Исцелено,%", new CombatantData.ColumnDef ("Healed%", false, "VARCHAR(4)", "HealedPerc", (Data) => { return Data.HealedPercent; }, (Data) => { return Data.HealedPercent; }, (Left, Right) => { return Left.Healed.CompareTo (Right.Healed); })); CombatantData.ColumnDefs.Add ("Крит.лечение", new CombatantData.ColumnDef ("CritHeals", false, "INT", "CritHeals", (Data) => { return Data.CritHeals.ToString (GetIntCommas ()); }, (Data) => { return Data.CritHeals.ToString (); }, (Left, Right) => { return Left.CritHeals.CompareTo (Right.CritHeals); })); CombatantData.ColumnDefs.Add ("Лечение", new CombatantData.ColumnDef ("Heals", false, "INT", "Heals", (Data) => { return Data.Heals.ToString (GetIntCommas ()); }, (Data) => { return Data.Heals.ToString (); }, (Left, Right) => { return Left.Heals.CompareTo (Right.Heals); })); CombatantData.ColumnDefs.Add ("Кьюр", new CombatantData.ColumnDef ("Cures", false, "INT", "CureDispels", (Data) => { return Data.Items["Кьюр/Диспел (Исх)"].Swings.ToString (GetIntCommas ()); }, (Data) => { return Data.Items["Кьюр/Диспел (Исх)"].Swings.ToString (); }, (Left, Right) => { return Left.Items["Кьюр/Диспел (Исх)"].Swings.CompareTo (Right.Items["Кьюр/Диспел (Исх)"].Swings); })); CombatantData.ColumnDefs.Add ("Отбор Энергии", new CombatantData.ColumnDef ("PowerDrain", true, "BIGINT", "PowerDrain", (Data) => { return Data.Items["Отбор Энергии (Исх)"].Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Items["Отбор Энергии (Исх)"].Damage.ToString (); }, (Left, Right) => { return Left.Items["Отбор Энергии (Исх)"].Damage.CompareTo (Right.Items["Отбор Энергии (Исх)"].Damage); })); CombatantData.ColumnDefs.Add ("Восст. Энергии", new CombatantData.ColumnDef ("PowerReplenish", false, "BIGINT", "PowerReplenish", (Data) => { return Data.Items["Восст. энергии (Исх)"].Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Items["Восст. энергии (Исх)"].Damage.ToString (); }, (Left, Right) => { return Left.Items["Восст. энергии (Исх)"].Damage.CompareTo (Right.Items["Восст. энергии (Исх)"].Damage); })); CombatantData.ColumnDefs.Add ("ДПС", new CombatantData.ColumnDef ("DPS", false, "DOUBLE", "DPS", (Data) => { return Data.DPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.DPS.ToString (usCulture); }, (Left, Right) => { return Left.DPS.CompareTo (Right.DPS); })); CombatantData.ColumnDefs.Add ("ДПС Боя", new CombatantData.ColumnDef ("EncDPS", true, "DOUBLE", "EncDPS", (Data) => { return Data.EncDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.EncDPS.ToString (usCulture); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); CombatantData.ColumnDefs.Add ("ХПС Боя", new CombatantData.ColumnDef ("EncHPS", true, "DOUBLE", "EncHPS", (Data) => { return Data.EncHPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.EncHPS.ToString (usCulture); }, (Left, Right) => { return Left.Healed.CompareTo (Right.Healed); })); CombatantData.ColumnDefs.Add ("Удары", new CombatantData.ColumnDef ("Hits", false, "INT", "Hits", (Data) => { return Data.Hits.ToString (GetIntCommas ()); }, (Data) => { return Data.Hits.ToString (); }, (Left, Right) => { return Left.Hits.CompareTo (Right.Hits); })); CombatantData.ColumnDefs.Add ("Крит.Удары", new CombatantData.ColumnDef ("CritHits", false, "INT", "CritHits", (Data) => { return Data.CritHits.ToString (GetIntCommas ()); }, (Data) => { return Data.CritHits.ToString (); }, (Left, Right) => { return Left.CritHits.CompareTo (Right.CritHits); })); CombatantData.ColumnDefs.Add ("Уклон", new CombatantData.ColumnDef ("Avoids", false, "INT", "Blocked", (Data) => { return Data.Blocked.ToString (GetIntCommas ()); }, (Data) => { return Data.Blocked.ToString (); }, (Left, Right) => { return Left.Blocked.CompareTo (Right.Blocked); })); CombatantData.ColumnDefs.Add ("Промахи", new CombatantData.ColumnDef ("Misses", false, "INT", "Misses", (Data) => { return Data.Misses.ToString (GetIntCommas ()); }, (Data) => { return Data.Misses.ToString (); }, (Left, Right) => { return Left.Misses.CompareTo (Right.Misses); })); CombatantData.ColumnDefs.Add ("Взмахи", new CombatantData.ColumnDef ("Swings", false, "INT", "Swings", (Data) => { return Data.Swings.ToString (GetIntCommas ()); }, (Data) => { return Data.Swings.ToString (); }, (Left, Right) => { return Left.Swings.CompareTo (Right.Swings); })); CombatantData.ColumnDefs.Add ("Вход. лечение", new CombatantData.ColumnDef ("HealingTaken", false, "BIGINT", "HealsTaken", (Data) => { return Data.Items["Лечение (Вход)"].Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Items["Лечение (Вход)"].Damage.ToString (); }, (Left, Right) => { return Left.Items["Лечение (Вход)"].Damage.CompareTo (Right.Items["Лечение (Вход)"].Damage); })); CombatantData.ColumnDefs.Add ("Вход. урон", new CombatantData.ColumnDef ("DamageTaken", true, "BIGINT", "DamageTaken", (Data) => { return Data.DamageTaken.ToString (GetIntCommas ()); }, (Data) => { return Data.DamageTaken.ToString (); }, (Left, Right) => { return Left.DamageTaken.CompareTo (Right.DamageTaken); })); CombatantData.ColumnDefs.Add ("Смерти", new CombatantData.ColumnDef ("Deaths", true, "INT", "Deaths", (Data) => { return Data.Deaths.ToString (GetIntCommas ()); }, (Data) => { return Data.Deaths.ToString (); }, (Left, Right) => { return Left.Deaths.CompareTo (Right.Deaths); })); CombatantData.ColumnDefs.Add ("Попадания,%", new CombatantData.ColumnDef ("ToHit%", false, "FLOAT", "ToHit", (Data) => { return Data.ToHit.ToString (GetFloatCommas ()); }, (Data) => { return Data.ToHit.ToString (usCulture); }, (Left, Right) => { return Left.ToHit.CompareTo (Right.ToHit); })); CombatantData.ColumnDefs.Add ("Крит.урон,%", new CombatantData.ColumnDef ("CritDam%", false, "VARCHAR(8)", "CritDamPerc", (Data) => { return Data.CritDamPerc.ToString ("0'%"); }, (Data) => { return Data.CritDamPerc.ToString ("0'%"); }, (Left, Right) => { return Left.CritDamPerc.CompareTo (Right.CritDamPerc); })); CombatantData.ColumnDefs.Add ("Крит.лечение,%", new CombatantData.ColumnDef ("CritHeal%", false, "VARCHAR(8)", "CritHealPerc", (Data) => { return Data.CritHealPerc.ToString ("0'%"); }, (Data) => { return Data.CritHealPerc.ToString ("0'%"); }, (Left, Right) => { return Left.CritHealPerc.CompareTo (Right.CritHealPerc); })); CombatantData.ColumnDefs.Add ("Крит.Тип", new CombatantData.ColumnDef ("CritTypes", true, "VARCHAR(32)", "CritTypes", CombatantDataGetCritTypes, CombatantDataGetCritTypes, (Left, Right) => { return CombatantDataGetCritTypes (Left).CompareTo (CombatantDataGetCritTypes (Right)); })); CombatantData.ColumnDefs.Add ("Агрессия +/-", new CombatantData.ColumnDef ("Threat +/-", false, "VARCHAR(32)", "ThreatStr", (Data) => { return Data.GetThreatStr ("Ненависть (Исх)"); }, (Data) => { return Data.GetThreatStr ("Ненависть (Исх)"); }, (Left, Right) => { return Left.GetThreatDelta ("Ненависть (Исх)").CompareTo (Right.GetThreatDelta ("Ненависть (Исх)")); })); CombatantData.ColumnDefs.Add ("Дельта Агрессии", new CombatantData.ColumnDef ("ThreatDelta", false, "INT", "ThreatDelta", (Data) => { return Data.GetThreatDelta ("Ненависть (Исх)").ToString (GetIntCommas ()); }, (Data) => { return Data.GetThreatDelta ("Ненависть (Исх)").ToString (); }, (Left, Right) => { return Left.GetThreatDelta ("Ненависть (Исх)").CompareTo (Right.GetThreatDelta ("Ненависть (Исх)")); })); CombatantData.ColumnDefs["Урон"].GetCellForeColor = (Data) => { return Color.DarkRed; }; CombatantData.ColumnDefs["Урон,%"].GetCellForeColor = (Data) => { return Color.DarkRed; }; CombatantData.ColumnDefs["Исцелено"].GetCellForeColor = (Data) => { return Color.DarkBlue; }; CombatantData.ColumnDefs["Исцелено,%"].GetCellForeColor = (Data) => { return Color.DarkBlue; }; CombatantData.ColumnDefs["Отбор Энергии"].GetCellForeColor = (Data) => { return Color.DarkMagenta; }; CombatantData.ColumnDefs["ДПС"].GetCellForeColor = (Data) => { return Color.DarkRed; }; CombatantData.ColumnDefs["ДПС Боя"].GetCellForeColor = (Data) => { return Color.DarkRed; }; CombatantData.ColumnDefs["ХПС Боя"].GetCellForeColor = (Data) => { return Color.DarkBlue; }; CombatantData.ColumnDefs["Вход. урон"].GetCellForeColor = (Data) => { return Color.DarkOrange; }; CombatantData.OutgoingDamageTypeDataObjects = new Dictionary { {"Авто-атака (Исх)", new CombatantData.DamageTypeDef ("Авто-атака (Исх)", -1, Color.DarkGoldenrod)}, {"Умение / Способность (Исх)", new CombatantData.DamageTypeDef ("Умение / Способность (Исх)", -1, Color.DarkOrange)}, {"Исходящий урон", new CombatantData.DamageTypeDef ("Исходящий урон", 0, Color.Orange)}, {"Лечение (Исх)", new CombatantData.DamageTypeDef ("Лечение (Исх)", 1, Color.Blue)}, {"Отбор Энергии (Исх)", new CombatantData.DamageTypeDef ("Отбор Энергии (Исх)", -1, Color.Purple)}, {"Восст. энергии (Исх)", new CombatantData.DamageTypeDef ("Восст. энергии (Исх)", 1, Color.Violet)}, {"Кьюр/Диспел (Исх)", new CombatantData.DamageTypeDef ("Кьюр/Диспел (Исх)", 0, Color.Wheat)}, {"Ненависть (Исх)", new CombatantData.DamageTypeDef ("Ненависть (Исх)", -1, Color.Yellow)}, {"Всё Исходящее (Ссылка)", new CombatantData.DamageTypeDef ("Всё Исходящее (Ссылка)", 0, Color.Black)} }; CombatantData.IncomingDamageTypeDataObjects = new Dictionary { {"Входящий Урон", new CombatantData.DamageTypeDef ("Входящий Урон", -1, Color.Red)}, {"Лечение (Вход)", new CombatantData.DamageTypeDef ("Лечение (Вход)", 1, Color.LimeGreen)}, {"Отбор Энергии(Вход)", new CombatantData.DamageTypeDef ("Отбор Энергии(Вход)", -1, Color.Magenta)}, {"Восст. энергии (Вход)", new CombatantData.DamageTypeDef ("Восст. энергии (Вход)", 1, Color.MediumPurple)}, {"Кьюр/Диспел (Вход)", new CombatantData.DamageTypeDef ("Кьюр/Диспел (Вход)", 0, Color.Wheat)}, {"Ненависть (Вход)", new CombatantData.DamageTypeDef ("Ненависть (Вход)", -1, Color.Yellow)}, {"Всё Входящее (Ссылка)", new CombatantData.DamageTypeDef ("Всё Входящее (Ссылка)", 0, Color.Black)} }; CombatantData.SwingTypeToDamageTypeDataLinksOutgoing = new SortedDictionary> { {1, new List {"Авто-атака (Исх)", "Исходящий урон" } }, {2, new List { "Умение / Способность (Исх)", "Исходящий урон" } }, {3, new List { "Лечение (Исх)" } }, {10, new List {"Отбор Энергии (Исх)" } }, {13, new List { "Восст. энергии (Исх)" } }, {20, new List { "Кьюр/Диспел (Исх)" } }, {16, new List { "Ненависть (Исх)" } } }; CombatantData.SwingTypeToDamageTypeDataLinksIncoming = new SortedDictionary> { {1, new List { "Входящий Урон" } }, {2, new List { "Входящий Урон" } }, {3, new List { "Лечение (Вход)" } }, {10, new List { "Отбор Энергии(Вход)" } }, {13, new List { "Восст. энергии (Вход)" } }, {20, new List { "Кьюр/Диспел (Вход)" } }, {16, new List { "Ненависть (Вход)" } } }; CombatantData.DamageSwingTypes = new List { 1, 2 }; CombatantData.HealingSwingTypes = new List { 3 }; CombatantData.DamageTypeDataNonSkillDamage = "Авто-атака (Исх)"; CombatantData.DamageTypeDataOutgoingDamage = "Исходящий урон"; CombatantData.DamageTypeDataOutgoingHealing = "Лечение (Исх)"; CombatantData.DamageTypeDataIncomingDamage = "Входящий Урон"; CombatantData.DamageTypeDataIncomingHealing = "Лечение (Вход)"; DamageTypeData.ColumnDefs.Clear (); DamageTypeData.ColumnDefs.Add ("id боя", new DamageTypeData.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.Parent.Parent.EncId; })); DamageTypeData.ColumnDefs.Add ("Боец", new DamageTypeData.ColumnDef ("Combatant", false, "VARCHAR(64)", "Combatant", (Data) => { return Data.Parent.Name; }, (Data) => { return Data.Parent.Name; })); DamageTypeData.ColumnDefs.Add ("Группировка", new DamageTypeData.ColumnDef ("Grouping", false, "VARCHAR(92)", "Grouping", (Data) => { return string.Empty; }, GetDamageTypeGrouping)); DamageTypeData.ColumnDefs.Add ("Тип", new DamageTypeData.ColumnDef ("Type", true, "VARCHAR(64)", "Type", (Data) => { return Data.Type; }, (Data) => { return Data.Type; })); DamageTypeData.ColumnDefs.Add ("Время начала", new DamageTypeData.ColumnDef ("StartTime", false, "TIMESTAMP", "StartTime", (Data) => { return Data.StartTime == DateTime.MaxValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.StartTime == DateTime.MaxValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); })); DamageTypeData.ColumnDefs.Add ("Время конца", new DamageTypeData.ColumnDef ("EndTime", false, "TIMESTAMP", "EndTime", (Data) => { return Data.EndTime == DateTime.MinValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.EndTime == DateTime.MinValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); })); DamageTypeData.ColumnDefs.Add ("Длительность", new DamageTypeData.ColumnDef ("Duration", false, "INT", "Duration", (Data) => { return Data.DurationS; }, (Data) => { return Data.Duration.TotalSeconds.ToString ("0"); })); DamageTypeData.ColumnDefs.Add ("Урон", new DamageTypeData.ColumnDef ("Damage", true, "BIGINT", "Damage", (Data) => { return Data.Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Damage.ToString (); })); DamageTypeData.ColumnDefs.Add ("ДПС Боя", new DamageTypeData.ColumnDef ("EncDPS", true, "DOUBLE", "EncDPS", (Data) => { return Data.EncDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.EncDPS.ToString (usCulture); })); DamageTypeData.ColumnDefs.Add ("ДПС Персонажа", new DamageTypeData.ColumnDef ("CharDPS", false, "DOUBLE", "CharDPS", (Data) => { return Data.CharDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.CharDPS.ToString (usCulture); })); DamageTypeData.ColumnDefs.Add ("ДПС", new DamageTypeData.ColumnDef ("DPS", false, "DOUBLE", "DPS", (Data) => { return Data.DPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.DPS.ToString (usCulture); })); DamageTypeData.ColumnDefs.Add ("Среднее", new DamageTypeData.ColumnDef ("Average", true, "DOUBLE", "Average", (Data) => { return Data.Average.ToString (GetFloatCommas ()); }, (Data) => { return Data.Average.ToString (usCulture); })); DamageTypeData.ColumnDefs.Add ("Сред.Взвеш.", new DamageTypeData.ColumnDef ("Median", false, "BIGINT", "Median", (Data) => { return Data.Median.ToString (GetIntCommas ()); }, (Data) => { return Data.Median.ToString (); })); DamageTypeData.ColumnDefs.Add ("Мин.Удар", new DamageTypeData.ColumnDef ("MinHit", true, "BIGINT", "MinHit", (Data) => { return Data.MinHit.ToString (GetIntCommas ()); }, (Data) => { return Data.MinHit.ToString (); })); DamageTypeData.ColumnDefs.Add ("Макс.Удар", new DamageTypeData.ColumnDef ("MaxHit", true, "BIGINT", "MaxHit", (Data) => { return Data.MaxHit.ToString (GetIntCommas ()); }, (Data) => { return Data.MaxHit.ToString (); })); DamageTypeData.ColumnDefs.Add ("Удары", new DamageTypeData.ColumnDef ("Hits", true, "INT", "Hits", (Data) => { return Data.Hits.ToString (GetIntCommas ()); }, (Data) => { return Data.Hits.ToString (); })); DamageTypeData.ColumnDefs.Add ("Крит.Удары", new DamageTypeData.ColumnDef ("CritHits", false, "INT", "CritHits", (Data) => { return Data.CritHits.ToString (GetIntCommas ()); }, (Data) => { return Data.CritHits.ToString (); })); DamageTypeData.ColumnDefs.Add ("Уклоны", new DamageTypeData.ColumnDef ("Avoids", false, "INT", "Blocked", (Data) => { return Data.Blocked.ToString (GetIntCommas ()); }, (Data) => { return Data.Blocked.ToString (); })); DamageTypeData.ColumnDefs.Add ("Промахи", new DamageTypeData.ColumnDef ("Misses", false, "INT", "Misses", (Data) => { return Data.Misses.ToString (GetIntCommas ()); }, (Data) => { return Data.Misses.ToString (); })); DamageTypeData.ColumnDefs.Add ("Взмахи", new DamageTypeData.ColumnDef ("Swings", true, "INT", "Swings", (Data) => { return Data.Swings.ToString (GetIntCommas ()); }, (Data) => { return Data.Swings.ToString (); })); DamageTypeData.ColumnDefs.Add ("Попадания,%", new DamageTypeData.ColumnDef ("ToHit", false, "FLOAT", "ToHit", (Data) => { return Data.ToHit.ToString (GetFloatCommas ()); }, (Data) => { return Data.ToHit.ToString (); })); DamageTypeData.ColumnDefs.Add ("Сред.Задержка", new DamageTypeData.ColumnDef ("AvgDelay", false, "FLOAT", "AverageDelay", (Data) => { return Data.AverageDelay.ToString (GetFloatCommas ()); }, (Data) => { return Data.AverageDelay.ToString (); })); DamageTypeData.ColumnDefs.Add ("Крит,%", new DamageTypeData.ColumnDef ("Crit%", true, "VARCHAR(8)", "CritPerc", (Data) => { return Data.CritPerc.ToString ("0'%"); }, (Data) => { return Data.CritPerc.ToString ("0'%"); })); DamageTypeData.ColumnDefs.Add ("Крит.Тип", new DamageTypeData.ColumnDef ("CritTypes", true, "VARCHAR(32)", "CritTypes", DamageTypeDataGetCritTypes, DamageTypeDataGetCritTypes)); AttackType.ColumnDefs.Clear (); AttackType.ColumnDefs.Add ("id боя", new AttackType.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.Parent.Parent.Parent.EncId; }, (Left, Right) => { return 0; })); AttackType.ColumnDefs.Add ("Атакующий", new AttackType.ColumnDef ("Attacker", false, "VARCHAR(64)", "Attacker", (Data) => { return Data.Parent.Outgoing ? Data.Parent.Parent.Name : string.Empty; }, (Data) => { return Data.Parent.Outgoing ? Data.Parent.Parent.Name : string.Empty; }, (Left, Right) => { return 0; })); AttackType.ColumnDefs.Add ("Цель Умения", new AttackType.ColumnDef ("Victim", false, "VARCHAR(64)", "Victim", (Data) => { return Data.Parent.Outgoing ? string.Empty : Data.Parent.Parent.Name; }, (Data) => { return Data.Parent.Outgoing ? string.Empty : Data.Parent.Parent.Name; }, (Left, Right) => { return 0; })); AttackType.ColumnDefs.Add ("Тип Взмахов", new AttackType.ColumnDef ("SwingType", false, "TINYINT", "SwingType", GetAttackTypeSwingType, GetAttackTypeSwingType, (Left, Right) => { return 0; })); AttackType.ColumnDefs.Add ("Тип", new AttackType.ColumnDef ("Type", true, "VARCHAR(64)", "Type", (Data) => { return Data.Type; }, (Data) => { return Data.Type; }, (Left, Right) => { return Left.Type.CompareTo (Right.Type); })); AttackType.ColumnDefs.Add ("Время начала", new AttackType.ColumnDef ("StartTime", false, "TIMESTAMP", "StartTime", (Data) => { return Data.StartTime == DateTime.MaxValue ? "--:--:--" : Data.StartTime.ToString ("T"); }, (Data) => { return Data.StartTime == DateTime.MaxValue ? "0000-00-00 00:00:00" : Data.StartTime.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.StartTime.CompareTo (Right.StartTime); })); AttackType.ColumnDefs.Add ("Время конца", new AttackType.ColumnDef ("EndTime", false, "TIMESTAMP", "EndTime", (Data) => { return Data.EndTime == DateTime.MinValue ? "--:--:--" : Data.EndTime.ToString ("T"); }, (Data) => { return Data.EndTime == DateTime.MinValue ? "0000-00-00 00:00:00" : Data.EndTime.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.EndTime.CompareTo (Right.EndTime); })); AttackType.ColumnDefs.Add ("Длительность", new AttackType.ColumnDef ("Duration", false, "INT", "Duration", (Data) => { return Data.DurationS; }, (Data) => { return Data.Duration.TotalSeconds.ToString ("0"); }, (Left, Right) => { return Left.Duration.CompareTo (Right.Duration); })); AttackType.ColumnDefs.Add ("Урон", new AttackType.ColumnDef ("Damage", true, "BIGINT", "Damage", (Data) => { return Data.Damage.ToString (GetIntCommas ()); }, (Data) => { return Data.Damage.ToString (); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); AttackType.ColumnDefs.Add ("ДПС Боя", new AttackType.ColumnDef ("EncDPS", true, "DOUBLE", "EncDPS", (Data) => { return Data.EncDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.EncDPS.ToString (usCulture); }, (Left, Right) => { return Left.EncDPS.CompareTo (Right.EncDPS); })); AttackType.ColumnDefs.Add ("ДПС Персонажа", new AttackType.ColumnDef ("CharDPS", false, "DOUBLE", "CharDPS", (Data) => { return Data.CharDPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.CharDPS.ToString (usCulture); }, (Left, Right) => { return Left.CharDPS.CompareTo (Right.CharDPS); })); AttackType.ColumnDefs.Add ("ДПС", new AttackType.ColumnDef ("DPS", false, "DOUBLE", "DPS", (Data) => { return Data.DPS.ToString (GetFloatCommas ()); }, (Data) => { return Data.DPS.ToString (usCulture); }, (Left, Right) => { return Left.DPS.CompareTo (Right.DPS); })); AttackType.ColumnDefs.Add ("Среднее", new AttackType.ColumnDef ("Average", true, "DOUBLE", "Average", (Data) => { return Data.Average.ToString (GetFloatCommas ()); }, (Data) => { return Data.Average.ToString (usCulture); }, (Left, Right) => { return Left.Average.CompareTo (Right.Average); })); AttackType.ColumnDefs.Add ("Сред.Взвеш.", new AttackType.ColumnDef ("Median", true, "BIGINT", "Median", (Data) => { return Data.Median.ToString (GetIntCommas ()); }, (Data) => { return Data.Median.ToString (); }, (Left, Right) => { return Left.Median.CompareTo (Right.Median); })); AttackType.ColumnDefs.Add ("Мин.Удар", new AttackType.ColumnDef ("MinHit", true, "BIGINT", "MinHit", (Data) => { return Data.MinHit.ToString (GetIntCommas ()); }, (Data) => { return Data.MinHit.ToString (); }, (Left, Right) => { return Left.MinHit.CompareTo (Right.MinHit); })); AttackType.ColumnDefs.Add ("Макс.Удар", new AttackType.ColumnDef ("MaxHit", true, "BIGINT", "MaxHit", (Data) => { return Data.MaxHit.ToString (GetIntCommas ()); }, (Data) => { return Data.MaxHit.ToString (); }, (Left, Right) => { return Left.MaxHit.CompareTo (Right.MaxHit); })); AttackType.ColumnDefs.Add ("Тип Удара", new AttackType.ColumnDef ("Resist", true, "VARCHAR(64)", "Resist", (Data) => { return Data.Resist; }, (Data) => { return Data.Resist; }, (Left, Right) => { return Left.Resist.CompareTo (Right.Resist); })); AttackType.ColumnDefs.Add ("Удары", new AttackType.ColumnDef ("Hits", true, "INT", "Hits", (Data) => { return Data.Hits.ToString (GetIntCommas ()); }, (Data) => { return Data.Hits.ToString (); }, (Left, Right) => { return Left.Hits.CompareTo (Right.Hits); })); AttackType.ColumnDefs.Add ("Крит.Удары", new AttackType.ColumnDef ("CritHits", false, "INT", "CritHits", (Data) => { return Data.CritHits.ToString (GetIntCommas ()); }, (Data) => { return Data.CritHits.ToString (); }, (Left, Right) => { return Left.CritHits.CompareTo (Right.CritHits); })); AttackType.ColumnDefs.Add ("Уклоны", new AttackType.ColumnDef ("Avoids", false, "INT", "Blocked", (Data) => { return Data.Blocked.ToString (GetIntCommas ()); }, (Data) => { return Data.Blocked.ToString (); }, (Left, Right) => { return Left.Blocked.CompareTo (Right.Blocked); })); AttackType.ColumnDefs.Add ("Промахи", new AttackType.ColumnDef ("Misses", false, "INT", "Misses", (Data) => { return Data.Misses.ToString (GetIntCommas ()); }, (Data) => { return Data.Misses.ToString (); }, (Left, Right) => { return Left.Misses.CompareTo (Right.Misses); })); AttackType.ColumnDefs.Add ("Взмахи", new AttackType.ColumnDef ("Swings", true, "INT", "Swings", (Data) => { return Data.Swings.ToString (GetIntCommas ()); }, (Data) => { return Data.Swings.ToString (); }, (Left, Right) => { return Left.Swings.CompareTo (Right.Swings); })); AttackType.ColumnDefs.Add ("Попадания,%", new AttackType.ColumnDef ("ToHit", true, "FLOAT", "ToHit", (Data) => { return Data.ToHit.ToString (GetFloatCommas ()); }, (Data) => { return Data.ToHit.ToString (usCulture); }, (Left, Right) => { return Left.ToHit.CompareTo (Right.ToHit); })); AttackType.ColumnDefs.Add ("Сред.Задержка", new AttackType.ColumnDef ("AvgDelay", false, "FLOAT", "AverageDelay", (Data) => { return Data.AverageDelay.ToString (GetFloatCommas ()); }, (Data) => { return Data.AverageDelay.ToString (usCulture); }, (Left, Right) => { return Left.AverageDelay.CompareTo (Right.AverageDelay); })); AttackType.ColumnDefs.Add ("Крит,%", new AttackType.ColumnDef ("Crit%", true, "VARCHAR(8)", "CritPerc", (Data) => { return Data.CritPerc.ToString ("0'%"); }, (Data) => { return Data.CritPerc.ToString ("0'%"); }, (Left, Right) => { return Left.CritPerc.CompareTo (Right.CritPerc); })); AttackType.ColumnDefs.Add ("Крит.Тип", new AttackType.ColumnDef ("CritTypes", true, "VARCHAR(32)", "CritTypes", AttackTypeGetCritTypes, AttackTypeGetCritTypes, (Left, Right) => { return AttackTypeGetCritTypes (Left).CompareTo (AttackTypeGetCritTypes (Right)); })); MasterSwing.ColumnDefs.Clear (); MasterSwing.ColumnDefs.Add ("id боя", new MasterSwing.ColumnDef ("EncId", false, "CHAR(8)", "EncId", (Data) => { return string.Empty; }, (Data) => { return Data.ParentEncounter.EncId; }, (Left, Right) => { return 0; })); MasterSwing.ColumnDefs.Add ("Время", new MasterSwing.ColumnDef ("Time", true, "TIMESTAMP", "STime", (Data) => { return Data.Time.ToString ("T"); }, (Data) => { return Data.Time.ToString ("u").TrimEnd (new char[] { 'Z' }); }, (Left, Right) => { return Left.Time.CompareTo (Right.Time); })); MasterSwing.ColumnDefs.Add ("Атакующий", new MasterSwing.ColumnDef ("Attacker", true, "VARCHAR(64)", "Attacker", (Data) => { return Data.Attacker; }, (Data) => { return Data.Attacker; }, (Left, Right) => { return Left.Attacker.CompareTo (Right.Attacker); })); MasterSwing.ColumnDefs.Add ("Тип Взмахов", new MasterSwing.ColumnDef ("SwingType", false, "TINYINT", "SwingType", (Data) => { return Data.SwingType.ToString (); }, (Data) => { return Data.SwingType.ToString (); }, (Left, Right) => { return Left.SwingType.CompareTo (Right.SwingType); })); MasterSwing.ColumnDefs.Add ("Тип Атаки", new MasterSwing.ColumnDef ("AttackType", true, "VARCHAR(64)", "AttackType", (Data) => { return Data.AttackType; }, (Data) => { return Data.AttackType; }, (Left, Right) => { return Left.AttackType.CompareTo (Right.AttackType); })); MasterSwing.ColumnDefs.Add ("Тип Урона", new MasterSwing.ColumnDef ("DamageType", true, "VARCHAR(64)", "DamageType", (Data) => { return Data.DamageType; }, (Data) => { return Data.DamageType; }, (Left, Right) => { return Left.DamageType.CompareTo (Right.DamageType); })); MasterSwing.ColumnDefs.Add ("Цель Умения", new MasterSwing.ColumnDef ("Victim", true, "VARCHAR(64)", "Victim", (Data) => { return Data.Victim; }, (Data) => { return Data.Victim; }, (Left, Right) => { return Left.Victim.CompareTo (Right.Victim); })); MasterSwing.ColumnDefs.Add ("Урон Величина", new MasterSwing.ColumnDef ("DamageNum", false, "BIGINT", "Damage", (Data) => { return ((long) Data.Damage).ToString (); }, (Data) => { return ((long) Data.Damage).ToString (); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); MasterSwing.ColumnDefs.Add ("Урон", new MasterSwing.ColumnDef ("Damage", true, "VARCHAR(128)", "DamageString", /* lambda */ (Data) => { return Data.Damage.ToString (); }, (Data) => { return Data.Damage.ToString (); }, (Left, Right) => { return Left.Damage.CompareTo (Right.Damage); })); // As a C# lesson, the above lines(lambda expressions) can also be written as(anonymous methods): MasterSwing.ColumnDefs.Add ("Крит. удар", new MasterSwing.ColumnDef ("Critical", true, "CHAR(1)", "Critical", /* anonymous */ delegate (MasterSwing Data) { return Data.Critical.ToString (); }, delegate (MasterSwing Data) { return Data.Critical.ToString (usCulture)[0].ToString (); }, delegate (MasterSwing Left, MasterSwing Right) { return Left.Critical.CompareTo (Right.Critical); })); //Сила крит.удара - обычный, легендарный,эпический,мифический(под LU69) MasterSwing.ColumnDefs.Add ("Сила Крит.удара", new MasterSwing.ColumnDef ("CriticalStr", true, "VARCHAR(32)", "CriticalStr", (Data) => { if (Data.Tags.ContainsKey ("CriticalStr")) return (string) Data.Tags["CriticalStr"]; else return "None"; }, (Data) => { if (Data.Tags.ContainsKey ("CriticalStr")) return (string) Data.Tags["CriticalStr"]; else return "None"; }, (Left, Right) => { if (Left.Tags.ContainsKey ("CriticalStr") && Right.Tags.ContainsKey ("CriticalStr")) return Left.Tags["CriticalStr"].ToString ().CompareTo (Right.Tags["CriticalStr"].ToString ()); else return 0; })); // Or also written as(delegated methods): MasterSwing.ColumnDefs.Add ("Специальный", new MasterSwing.ColumnDef ("Special", true, "VARCHAR(64)", "Special", /* delegate */ GetCellDataSpecial, GetSqlDataSpecial, MasterSwingCompareSpecial)); ActGlobals.oFormActMain.ValidateLists (); ActGlobals.oFormActMain.ValidateTableSetup (); } private Color GetSwingTypeColor (int SwingType) { switch (SwingType) { case 1: case 2: return Color.Crimson; case 3: return Color.Blue; case 4: return Color.DarkRed; case 5: return Color.DarkOrange; case 8: return Color.DarkOrchid; case 9: return Color.DodgerBlue; default: return Color.Black; } } private string CombatantDataGetCritTypes (CombatantData Data) { AttackType at; if (Data.AllOut.TryGetValue (ActGlobals.ActLocalization.LocalizationStrings["attackTypeTerm-all"].DisplayedText, out at)) { return AttackTypeGetCritTypes (at); } else return "-"; } private string DamageTypeDataGetCritTypes (DamageTypeData Data) { AttackType at; if (Data.Items.TryGetValue (ActGlobals.ActLocalization.LocalizationStrings["attackTypeTerm-all"].DisplayedText, out at)) { return AttackTypeGetCritTypes (at); } else return "-"; } private string AttackTypeGetCritTypes (AttackType Data) { int crit = 0; int lCrit = 0; int fCrit = 0; int mCrit = 0; int DataItemsCount = Data.Items.Count; for (int i = 0; i < DataItemsCount; i++) { MasterSwing ms = Data.Items[i]; if (ms.Critical) { crit++; // Double tag search (ContainsKey (Name) + Item[Name]). // TryGetValue is faster when tag exists in dictionary. // //if (!ms.Tags.ContainsKey ("CriticalStr")) // continue; //string CriticalStr = ((string) ms.Tags["CriticalStr"]); object Value = null; if (ms.Tags.TryGetValue ("CriticalStr", out Value)) { string CriticalStr = (string) Value; if (CriticalStr.Contains ("Легендарный")) { lCrit++; continue; } if (CriticalStr.Contains ("Эпический")) { fCrit++; continue; } if (CriticalStr.Contains ("Мифический")) { mCrit++; continue; } } } } // Check for zero before divide by zero :) if (crit == 0) return "--"; float lCritPerc = ((float) lCrit / (float) crit) * 100f; float fCritPerc = ((float) fCrit / (float) crit) * 100f; float mCritPerc = ((float) mCrit / (float) crit) * 100f; return String.Format ("{0:0.00}%Л - {1:0.00}%Э - {2:0.00}%М", lCritPerc, fCritPerc, mCritPerc); } private string EncounterFormatSwitch (EncounterData Data, List SelectiveAllies, string VarName, string Extra) { long damage = 0; long healed = 0; int swings = 0; int hits = 0; int crits = 0; int heals = 0; int critheals = 0; int cures = 0; int misses = 0; int hitfail = 0; float tohit = 0; double dps = 0; double hps = 0; long healstaken = 0; long damagetaken = 0; long powerdrain = 0; long powerheal = 0; int kills = 0; int deaths = 0; switch (VarName) { case "maxheal": return Data.GetMaxHeal (true, false); case "MAXHEAL": return Data.GetMaxHeal (false, false); case "maxhealward": return Data.GetMaxHeal (true, true); case "MAXHEALWARD": return Data.GetMaxHeal (false, true); case "maxhit": return Data.GetMaxHit (true); case "MAXHIT": return Data.GetMaxHit (false); case "duration": return Data.DurationS; case "DURATION": return Data.Duration.TotalSeconds.ToString ("0"); case "damage": foreach (CombatantData cd in SelectiveAllies) damage += cd.Damage; return damage.ToString (); case "damage-m": foreach (CombatantData cd in SelectiveAllies) damage += cd.Damage; return (damage / 1000000.0).ToString ("0.00"); case "DAMAGE-k": foreach (CombatantData cd in SelectiveAllies) damage += cd.Damage; return (damage / 1000.0).ToString ("0"); case "DAMAGE-m": foreach (CombatantData cd in SelectiveAllies) damage += cd.Damage; return (damage / 1000000.0).ToString ("0"); case "healed": foreach (CombatantData cd in SelectiveAllies) healed += cd.Healed; return healed.ToString (); case "swings": foreach (CombatantData cd in SelectiveAllies) swings += cd.Swings; return swings.ToString (); case "hits": foreach (CombatantData cd in SelectiveAllies) hits += cd.Hits; return hits.ToString (); case "crithits": foreach (CombatantData cd in SelectiveAllies) crits += cd.CritHits; return crits.ToString (); case "crithit%": foreach (CombatantData cd in SelectiveAllies) crits += cd.CritHits; foreach (CombatantData cd in SelectiveAllies) hits += cd.Hits; float critdamperc = (float) crits / (float) hits; return critdamperc.ToString ("0'%"); case "heals": foreach (CombatantData cd in SelectiveAllies) heals += cd.Heals; return heals.ToString (); case "critheals": foreach (CombatantData cd in SelectiveAllies) critheals += cd.CritHits; return critheals.ToString (); case "critheal%": foreach (CombatantData cd in SelectiveAllies) critheals += cd.CritHeals; foreach (CombatantData cd in SelectiveAllies) heals += cd.Heals; float crithealperc = (float) critheals / (float) heals; return crithealperc.ToString ("0'%"); case "cures": foreach (CombatantData cd in SelectiveAllies) cures += cd.Items["Кьюр/Диспел (Исх)"].Swings; return cures.ToString (); case "misses": foreach (CombatantData cd in SelectiveAllies) misses += cd.Misses; return misses.ToString (); case "hitfailed": foreach (CombatantData cd in SelectiveAllies) hitfail += cd.Blocked; return hitfail.ToString (); case "TOHIT": foreach (CombatantData cd in SelectiveAllies) tohit += cd.ToHit; tohit /= SelectiveAllies.Count; return tohit.ToString ("0"); case "DPS": case "ENCDPS": foreach (CombatantData cd in SelectiveAllies) damage += cd.Damage; dps = damage / Data.Duration.TotalSeconds; return dps.ToString ("0"); case "DPS-k": case "ENCDPS-k": foreach (CombatantData cd in SelectiveAllies) damage += cd.Damage; dps = damage / Data.Duration.TotalSeconds; return (dps / 1000.0).ToString ("0"); case "ENCHPS": foreach (CombatantData cd in SelectiveAllies) healed += cd.Healed; hps = healed / Data.Duration.TotalSeconds; return hps.ToString ("0"); case "ENCHPS-k": foreach (CombatantData cd in SelectiveAllies) healed += cd.Healed; hps = healed / Data.Duration.TotalSeconds; return (hps / 1000.0).ToString ("0"); case "tohit": foreach (CombatantData cd in SelectiveAllies) tohit += cd.ToHit; tohit /= SelectiveAllies.Count; return tohit.ToString ("F"); case "dps": case "encdps": foreach (CombatantData cd in SelectiveAllies) damage += cd.Damage; dps = damage / Data.Duration.TotalSeconds; return dps.ToString ("F"); case "dps-k": case "encdps-k": foreach (CombatantData cd in SelectiveAllies) damage += cd.Damage; dps = damage / Data.Duration.TotalSeconds; return (dps / 1000.0).ToString ("F"); case "enchps": foreach (CombatantData cd in SelectiveAllies) healed += cd.Healed; hps = healed / Data.Duration.TotalSeconds; return hps.ToString ("F"); case "enchps-k": foreach (CombatantData cd in SelectiveAllies) healed += cd.Healed; hps = healed / Data.Duration.TotalSeconds; return (hps / 1000.0).ToString ("F"); case "healstaken": foreach (CombatantData cd in SelectiveAllies) healstaken += cd.Items["Лечение (Вход)"].Damage; return healstaken.ToString (); case "damagetaken": foreach (CombatantData cd in SelectiveAllies) damagetaken += cd.DamageTaken; return damagetaken.ToString (); case "powerdrain": foreach (CombatantData cd in SelectiveAllies) powerdrain += cd.Items["Отбор Энергии (Исх)"].Damage; return powerdrain.ToString (); case "powerheal": foreach (CombatantData cd in SelectiveAllies) powerheal += cd.Items["Восст. энергии (Исх)"].Damage; return powerheal.ToString (); case "kills": foreach (CombatantData cd in SelectiveAllies) kills += cd.Kills; return kills.ToString (); case "deaths": foreach (CombatantData cd in SelectiveAllies) deaths += cd.Deaths; return deaths.ToString (); case "title": return Data.Title; default: return VarName; } } private string CombatantFormatSwitch (CombatantData Data, string VarName, string Extra) { int len = 0; switch (VarName) { case "name": return Data.Name; case "NAME": len = Int32.Parse (Extra); return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME3": len = 3; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME4": len = 4; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME5": len = 5; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME6": len = 6; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME7": len = 7; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME8": len = 8; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME9": len = 9; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME10": len = 10; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME11": len = 11; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME12": len = 12; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME13": len = 13; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME14": len = 14; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "NAME15": len = 15; return Data.Name.Length - len > 0 ? Data.Name.Remove (len, Data.Name.Length - len).Trim () : Data.Name; case "DURATION": return Data.Duration.TotalSeconds.ToString ("0"); case "duration": return Data.DurationS; case "maxhit": return Data.GetMaxHit (true); case "MAXHIT": return Data.GetMaxHit (false); case "maxheal": return Data.GetMaxHeal (true, false); case "MAXHEAL": return Data.GetMaxHeal (false, false); case "maxhealward": return Data.GetMaxHeal (true, true); case "MAXHEALWARD": return Data.GetMaxHeal (false, true); case "damage": return Data.Damage.ToString (); case "damage-k": return (Data.Damage / 1000.0).ToString ("0.00"); case "damage-m": return (Data.Damage / 1000000.0).ToString ("0.00"); case "DAMAGE-k": return (Data.Damage / 1000.0).ToString ("0"); case "DAMAGE-m": return (Data.Damage / 1000000.0).ToString ("0"); case "healed": return Data.Healed.ToString (); case "swings": return Data.Swings.ToString (); case "hits": return Data.Hits.ToString (); case "crithits": return Data.CritHits.ToString (); case "critheals": return Data.CritHeals.ToString (); case "crittypes": return CombatantDataGetCritTypes (Data); case "crithit%": return Data.CritDamPerc.ToString ("0'%"); case "critheal%": return Data.CritHealPerc.ToString ("0'%"); case "heals": return Data.Heals.ToString (); case "cures": return Data.Items["Кьюр/Диспел (Исх)"].Swings.ToString (); case "misses": return Data.Misses.ToString (); case "hitfailed": return Data.Blocked.ToString (); case "TOHIT": return Data.ToHit.ToString ("0"); case "DPS": return Data.DPS.ToString ("0"); case "DPS-k": return (Data.DPS / 1000.0).ToString ("0"); case "ENCDPS": return Data.EncDPS.ToString ("0"); case "ENCDPS-k": return (Data.EncDPS / 1000.0).ToString ("0"); case "ENCHPS": return Data.EncHPS.ToString ("0"); case "ENCHPS-k": return (Data.EncHPS / 1000.0).ToString ("0"); case "tohit": return Data.ToHit.ToString ("F"); case "dps": return Data.DPS.ToString ("F"); case "dps-k": return (Data.DPS / 1000.0).ToString ("F"); case "encdps": return Data.EncDPS.ToString ("F"); case "encdps-k": return (Data.EncDPS / 1000.0).ToString ("F"); case "enchps": return Data.EncHPS.ToString ("F"); case "enchps-k": return (Data.EncHPS / 1000.0).ToString ("F"); case "healstaken": return Data.Items["Лечение (Вход)"].Damage.ToString (); case "damagetaken": return Data.DamageTaken.ToString (); case "powerdrain": return Data.Items["Отбор Энергии (Исх)"].Damage.ToString (); case "powerheal": return Data.Items["Восст. энергии (Исх)"].Damage.ToString (); case "kills": return Data.Kills.ToString (); case "deaths": return Data.Deaths.ToString (); case "damage%": return Data.DamagePercent; case "healed%": return Data.HealedPercent; case "threatstr": return Data.GetThreatStr ("Ненависть (Исх)"); case "threatdelta": return Data.GetThreatDelta ("Ненависть (Исх)").ToString (); case "n": return "\n"; case "t": return "\t"; default: return VarName; } } private string GetCellDataSpecial (MasterSwing Data) { return Data.Special; } private string GetSqlDataSpecial (MasterSwing Data) { return Data.Special; } private int MasterSwingCompareSpecial (MasterSwing Left, MasterSwing Right) { return Left.Special.CompareTo (Right.Special); } private string GetAttackTypeSwingType (AttackType Data) { int swingType = 100; List swingTypes = new List (); List cachedItems = new List (Data.Items); for (int i = 0; i < cachedItems.Count; i++) { MasterSwing s = cachedItems[i]; if ( !swingTypes.Contains (s.SwingType)) swingTypes.Add (s.SwingType); } if (swingTypes.Count == 1) swingType = swingTypes[0]; return swingType.ToString (); } private string GetDamageTypeGrouping (DamageTypeData Data) { string grouping = string.Empty; int swingTypeIndex = 0; if (Data.Outgoing) { grouping += "attacker=" + Data.Parent.Name; foreach (KeyValuePair> links in CombatantData.SwingTypeToDamageTypeDataLinksOutgoing) { foreach (string damageTypeLabel in links.Value) { if (Data.Type == damageTypeLabel) { grouping += String.Format ("&swingtype{0}={1}", swingTypeIndex++ == 0 ? string.Empty : swingTypeIndex.ToString (), links.Key); } } } } else { grouping += "victim=" + Data.Parent.Name; foreach (KeyValuePair> links in CombatantData.SwingTypeToDamageTypeDataLinksIncoming) { foreach (string damageTypeLabel in links.Value) { if (Data.Type == damageTypeLabel) { grouping += String.Format ("&swingtype{0}={1}", swingTypeIndex++ == 0 ? string.Empty : swingTypeIndex.ToString (), links.Key); } } } } return grouping; } } }