diff --git a/.nuget/packages.config b/.nuget/packages.config
new file mode 100644
index 0000000..2367012
--- /dev/null
+++ b/.nuget/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/About.Designer.cs b/About.Designer.cs
new file mode 100644
index 0000000..688811a
--- /dev/null
+++ b/About.Designer.cs
@@ -0,0 +1,190 @@
+namespace Battle_Param_Editor
+{
+ partial class About
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(About));
+ this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+ this.logoPictureBox = new System.Windows.Forms.PictureBox();
+ this.labelProductName = new System.Windows.Forms.Label();
+ this.labelVersion = new System.Windows.Forms.Label();
+ this.labelCopyright = new System.Windows.Forms.Label();
+ this.labelCompanyName = new System.Windows.Forms.Label();
+ this.textBoxDescription = new System.Windows.Forms.TextBox();
+ this.okButton = new System.Windows.Forms.Button();
+ this.tableLayoutPanel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
+ this.SuspendLayout();
+ //
+ // tableLayoutPanel
+ //
+ this.tableLayoutPanel.ColumnCount = 2;
+ this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
+ this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
+ this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
+ this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
+ this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
+ this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
+ this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3);
+ this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
+ this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
+ this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel.Location = new System.Drawing.Point(12, 11);
+ this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+ this.tableLayoutPanel.Name = "tableLayoutPanel";
+ this.tableLayoutPanel.RowCount = 6;
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ this.tableLayoutPanel.Size = new System.Drawing.Size(556, 326);
+ this.tableLayoutPanel.TabIndex = 0;
+ //
+ // logoPictureBox
+ //
+ this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
+ this.logoPictureBox.Location = new System.Drawing.Point(4, 4);
+ this.logoPictureBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+ this.logoPictureBox.Name = "logoPictureBox";
+ this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
+ this.logoPictureBox.Size = new System.Drawing.Size(175, 318);
+ this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.logoPictureBox.TabIndex = 12;
+ this.logoPictureBox.TabStop = false;
+ //
+ // labelProductName
+ //
+ this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelProductName.Location = new System.Drawing.Point(191, 0);
+ this.labelProductName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelProductName.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelProductName.Name = "labelProductName";
+ this.labelProductName.Size = new System.Drawing.Size(361, 21);
+ this.labelProductName.TabIndex = 19;
+ this.labelProductName.Text = "Product Name";
+ this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelVersion
+ //
+ this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelVersion.Location = new System.Drawing.Point(191, 32);
+ this.labelVersion.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelVersion.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelVersion.Name = "labelVersion";
+ this.labelVersion.Size = new System.Drawing.Size(361, 21);
+ this.labelVersion.TabIndex = 0;
+ this.labelVersion.Text = "Version";
+ this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelCopyright
+ //
+ this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelCopyright.Location = new System.Drawing.Point(191, 64);
+ this.labelCopyright.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelCopyright.Name = "labelCopyright";
+ this.labelCopyright.Size = new System.Drawing.Size(361, 21);
+ this.labelCopyright.TabIndex = 21;
+ this.labelCopyright.Text = "Copyright";
+ this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelCompanyName
+ //
+ this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelCompanyName.Location = new System.Drawing.Point(191, 96);
+ this.labelCompanyName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelCompanyName.Name = "labelCompanyName";
+ this.labelCompanyName.Size = new System.Drawing.Size(361, 21);
+ this.labelCompanyName.TabIndex = 22;
+ this.labelCompanyName.Text = "Company Name";
+ this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // textBoxDescription
+ //
+ this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.textBoxDescription.Location = new System.Drawing.Point(191, 132);
+ this.textBoxDescription.Margin = new System.Windows.Forms.Padding(8, 4, 4, 4);
+ this.textBoxDescription.Multiline = true;
+ this.textBoxDescription.Name = "textBoxDescription";
+ this.textBoxDescription.ReadOnly = true;
+ this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+ this.textBoxDescription.Size = new System.Drawing.Size(361, 155);
+ this.textBoxDescription.TabIndex = 23;
+ this.textBoxDescription.TabStop = false;
+ this.textBoxDescription.Text = "Description";
+ //
+ // okButton
+ //
+ this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.okButton.Location = new System.Drawing.Point(452, 295);
+ this.okButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+ this.okButton.Name = "okButton";
+ this.okButton.Size = new System.Drawing.Size(100, 27);
+ this.okButton.TabIndex = 24;
+ this.okButton.Text = "&OK";
+ //
+ // About
+ //
+ this.AcceptButton = this.okButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(580, 348);
+ this.Controls.Add(this.tableLayoutPanel);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "About";
+ this.Padding = new System.Windows.Forms.Padding(12, 11, 12, 11);
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "About";
+ this.tableLayoutPanel.ResumeLayout(false);
+ this.tableLayoutPanel.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
+ private System.Windows.Forms.PictureBox logoPictureBox;
+ private System.Windows.Forms.Label labelProductName;
+ private System.Windows.Forms.Label labelVersion;
+ private System.Windows.Forms.Label labelCopyright;
+ private System.Windows.Forms.Label labelCompanyName;
+ private System.Windows.Forms.TextBox textBoxDescription;
+ private System.Windows.Forms.Button okButton;
+ }
+}
diff --git a/About.cs b/About.cs
new file mode 100644
index 0000000..3558265
--- /dev/null
+++ b/About.cs
@@ -0,0 +1,105 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using System.Reflection;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Battle_Param_Editor
+{
+ partial class About : Form
+ {
+ public About()
+ {
+ InitializeComponent();
+ this.Text = String.Format("About {0}", AssemblyTitle);
+ this.labelProductName.Text = AssemblyProduct;
+ this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion);
+ this.labelCopyright.Text = AssemblyCopyright;
+ this.labelCompanyName.Text = AssemblyCompany;
+ this.textBoxDescription.Text = AssemblyDescription;
+ }
+
+ #region Assembly Attribute Accessors
+
+ public string AssemblyTitle
+ {
+ get
+ {
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
+ if (attributes.Length > 0)
+ {
+ AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
+ if (titleAttribute.Title != "")
+ {
+ return titleAttribute.Title;
+ }
+ }
+ return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
+ }
+ }
+
+ public string AssemblyVersion
+ {
+ get
+ {
+ return Assembly.GetExecutingAssembly().GetName().Version.ToString();
+ }
+ }
+
+ public string AssemblyDescription
+ {
+ get
+ {
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
+ if (attributes.Length == 0)
+ {
+ return "";
+ }
+ return ((AssemblyDescriptionAttribute)attributes[0]).Description;
+ }
+ }
+
+ public string AssemblyProduct
+ {
+ get
+ {
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
+ if (attributes.Length == 0)
+ {
+ return "";
+ }
+ return ((AssemblyProductAttribute)attributes[0]).Product;
+ }
+ }
+
+ public string AssemblyCopyright
+ {
+ get
+ {
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
+ if (attributes.Length == 0)
+ {
+ return "";
+ }
+ return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
+ }
+ }
+
+ public string AssemblyCompany
+ {
+ get
+ {
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
+ if (attributes.Length == 0)
+ {
+ return "";
+ }
+ return ((AssemblyCompanyAttribute)attributes[0]).Company;
+ }
+ }
+ #endregion
+ }
+}
diff --git a/About.resx b/About.resx
new file mode 100644
index 0000000..76cc9af
--- /dev/null
+++ b/About.resx
@@ -0,0 +1,603 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ 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
+
+
+
\ No newline at end of file
diff --git a/App.config b/App.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BPE_Icon.ico b/BPE_Icon.ico
new file mode 100644
index 0000000..738646c
Binary files /dev/null and b/BPE_Icon.ico differ
diff --git a/Battle Param Editor.csproj b/Battle Param Editor.csproj
new file mode 100644
index 0000000..5f82a1b
--- /dev/null
+++ b/Battle Param Editor.csproj
@@ -0,0 +1,162 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {D8F860E5-C6B5-4E49-B0F1-8BAEB3D6375A}
+ WinExe
+ Properties
+ Battle_Param_Editor
+ Battle Param Editor
+ v4.5
+ 512
+ SAK
+ SAK
+ SAK
+ SAK
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ BPE_Icon.ico
+
+
+ bin\Public Release\
+ TRACE;PUBLICRELEASE
+ true
+ pdbonly
+ AnyCPU
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ About.cs
+
+
+ Form
+
+
+ DataModifier.cs
+
+
+ Form
+
+
+ Form1.cs
+
+
+
+
+
+
+ About.cs
+
+
+ DataModifier.cs
+
+
+ Form1.cs
+ Designer
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
+
+ False
+ Microsoft .NET Framework 4.5 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/Battle Param Editor.sln b/Battle Param Editor.sln
new file mode 100644
index 0000000..876c81f
--- /dev/null
+++ b/Battle Param Editor.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.31101.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Battle Param Editor", "Battle Param Editor.csproj", "{D8F860E5-C6B5-4E49-B0F1-8BAEB3D6375A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Public Release|Any CPU = Public Release|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D8F860E5-C6B5-4E49-B0F1-8BAEB3D6375A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D8F860E5-C6B5-4E49-B0F1-8BAEB3D6375A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D8F860E5-C6B5-4E49-B0F1-8BAEB3D6375A}.Public Release|Any CPU.ActiveCfg = Public Release|Any CPU
+ {D8F860E5-C6B5-4E49-B0F1-8BAEB3D6375A}.Public Release|Any CPU.Build.0 = Public Release|Any CPU
+ {D8F860E5-C6B5-4E49-B0F1-8BAEB3D6375A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D8F860E5-C6B5-4E49-B0F1-8BAEB3D6375A}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/DataModifier.Designer.cs b/DataModifier.Designer.cs
new file mode 100644
index 0000000..fe9d334
--- /dev/null
+++ b/DataModifier.Designer.cs
@@ -0,0 +1,108 @@
+namespace Battle_Param_Editor
+{
+ partial class DataModifier
+ {
+ ///
+ /// 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 Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.btnOk = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.lblAdjustBy = new System.Windows.Forms.Label();
+ this.nupAdjustment = new System.Windows.Forms.NumericUpDown();
+ ((System.ComponentModel.ISupportInitialize)(this.nupAdjustment)).BeginInit();
+ this.SuspendLayout();
+ //
+ // btnOk
+ //
+ this.btnOk.Location = new System.Drawing.Point(6, 29);
+ this.btnOk.Name = "btnOk";
+ this.btnOk.Size = new System.Drawing.Size(75, 23);
+ this.btnOk.TabIndex = 1;
+ this.btnOk.Text = "OK";
+ this.btnOk.UseVisualStyleBackColor = true;
+ //
+ // btnCancel
+ //
+ this.btnCancel.Location = new System.Drawing.Point(87, 29);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.btnCancel.TabIndex = 2;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // lblAdjustBy
+ //
+ this.lblAdjustBy.AutoSize = true;
+ this.lblAdjustBy.Location = new System.Drawing.Point(9, 9);
+ this.lblAdjustBy.Name = "lblAdjustBy";
+ this.lblAdjustBy.Size = new System.Drawing.Size(53, 13);
+ this.lblAdjustBy.TabIndex = 2;
+ this.lblAdjustBy.Text = "Adjust by:";
+ //
+ // nupAdjustment
+ //
+ this.nupAdjustment.Location = new System.Drawing.Point(65, 6);
+ this.nupAdjustment.Maximum = new decimal(new int[] {
+ 1000,
+ 0,
+ 0,
+ 0});
+ this.nupAdjustment.Name = "nupAdjustment";
+ this.nupAdjustment.Size = new System.Drawing.Size(96, 20);
+ this.nupAdjustment.TabIndex = 0;
+ this.nupAdjustment.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.nupAdjustment_KeyPress);
+ //
+ // DataModifier
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(167, 58);
+ this.ControlBox = false;
+ this.Controls.Add(this.nupAdjustment);
+ this.Controls.Add(this.lblAdjustBy);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnOk);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Name = "DataModifier";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "DataModifier";
+ this.TopMost = true;
+ ((System.ComponentModel.ISupportInitialize)(this.nupAdjustment)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button btnOk;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Label lblAdjustBy;
+ public System.Windows.Forms.NumericUpDown nupAdjustment;
+ }
+}
\ No newline at end of file
diff --git a/DataModifier.cs b/DataModifier.cs
new file mode 100644
index 0000000..de50972
--- /dev/null
+++ b/DataModifier.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Battle_Param_Editor
+{
+ public partial class DataModifier : Form
+ {
+ public DataModifier()
+ {
+ InitializeComponent();
+ btnOk.DialogResult = DialogResult.OK;
+ btnCancel.DialogResult = DialogResult.Cancel;
+ }
+
+ private void nupAdjustment_KeyPress(object sender, KeyPressEventArgs e)
+ {
+ if (e.KeyChar == (char)Keys.Return)
+ {
+ btnOk.PerformClick();
+ }
+ }
+
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/DataModifier.resx b/DataModifier.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/DataModifier.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Form1.Designer.cs b/Form1.Designer.cs
new file mode 100644
index 0000000..7ff72f4
--- /dev/null
+++ b/Form1.Designer.cs
@@ -0,0 +1,322 @@
+namespace Battle_Param_Editor
+{
+ partial class Form1
+ {
+ ///
+ /// 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 Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
+ this.menuStrip1 = new System.Windows.Forms.MenuStrip();
+ this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.cbDifficulty = new System.Windows.Forms.ToolStripComboBox();
+ this.cbStatisticTable = new System.Windows.Forms.ToolStripComboBox();
+ this.dataOperationsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.addDifficultyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.copyTableDataToToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.cbCopyTableTo = new System.Windows.Forms.ToolStripComboBox();
+ this.copyTableDataFromToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.cbCopyTableFrom = new System.Windows.Forms.ToolStripComboBox();
+ this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+ this.Status = new System.Windows.Forms.ToolStripStatusLabel();
+ this.dataSet1 = new System.Data.DataSet();
+ this.dgTableView = new System.Windows.Forms.DataGridView();
+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.increaseByPToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.increaseByNToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuStrip1.SuspendLayout();
+ this.statusStrip1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.dataSet1)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.dgTableView)).BeginInit();
+ this.contextMenuStrip1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // menuStrip1
+ //
+ this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.fileToolStripMenuItem,
+ this.helpToolStripMenuItem,
+ this.cbDifficulty,
+ this.cbStatisticTable,
+ this.dataOperationsToolStripMenuItem});
+ this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+ this.menuStrip1.Name = "menuStrip1";
+ this.menuStrip1.Size = new System.Drawing.Size(524, 27);
+ this.menuStrip1.TabIndex = 0;
+ this.menuStrip1.Text = "menuStrip1";
+ //
+ // fileToolStripMenuItem
+ //
+ this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.openToolStripMenuItem,
+ this.saveToolStripMenuItem,
+ this.toolStripSeparator1,
+ this.exitToolStripMenuItem});
+ this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+ this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 23);
+ this.fileToolStripMenuItem.Text = "File";
+ //
+ // openToolStripMenuItem
+ //
+ this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+ this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+ this.openToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+ this.openToolStripMenuItem.Text = "Open";
+ this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
+ //
+ // saveToolStripMenuItem
+ //
+ this.saveToolStripMenuItem.Enabled = false;
+ this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+ this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+ this.saveToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+ this.saveToolStripMenuItem.Text = "Save";
+ this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(143, 6);
+ //
+ // exitToolStripMenuItem
+ //
+ this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+ this.exitToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));
+ this.exitToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+ this.exitToolStripMenuItem.Text = "Exit";
+ this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
+ //
+ // helpToolStripMenuItem
+ //
+ this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.aboutToolStripMenuItem});
+ this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+ this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 23);
+ this.helpToolStripMenuItem.Text = "Help";
+ //
+ // aboutToolStripMenuItem
+ //
+ this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+ this.aboutToolStripMenuItem.Size = new System.Drawing.Size(107, 22);
+ this.aboutToolStripMenuItem.Text = "About";
+ this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
+ //
+ // cbDifficulty
+ //
+ this.cbDifficulty.Enabled = false;
+ this.cbDifficulty.Name = "cbDifficulty";
+ this.cbDifficulty.Size = new System.Drawing.Size(121, 23);
+ this.cbDifficulty.Text = "Difficulty";
+ this.cbDifficulty.SelectedIndexChanged += new System.EventHandler(this.cbDifficulty_SelectedIndexChanged);
+ //
+ // cbStatisticTable
+ //
+ this.cbStatisticTable.Enabled = false;
+ this.cbStatisticTable.Items.AddRange(new object[] {
+ "Physical Stats",
+ "Resist Stats",
+ "Attack Stats",
+ "Movement Stats"});
+ this.cbStatisticTable.Name = "cbStatisticTable";
+ this.cbStatisticTable.Size = new System.Drawing.Size(121, 23);
+ this.cbStatisticTable.Text = "Statistic Table";
+ this.cbStatisticTable.SelectedIndexChanged += new System.EventHandler(this.cbStatisticTable_SelectedIndexChanged);
+ //
+ // dataOperationsToolStripMenuItem
+ //
+ this.dataOperationsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.addDifficultyToolStripMenuItem,
+ this.copyTableDataToToolStripMenuItem,
+ this.copyTableDataFromToolStripMenuItem});
+ this.dataOperationsToolStripMenuItem.Enabled = false;
+ this.dataOperationsToolStripMenuItem.Name = "dataOperationsToolStripMenuItem";
+ this.dataOperationsToolStripMenuItem.Size = new System.Drawing.Size(104, 23);
+ this.dataOperationsToolStripMenuItem.Text = "Data Operations";
+ //
+ // addDifficultyToolStripMenuItem
+ //
+ this.addDifficultyToolStripMenuItem.Name = "addDifficultyToolStripMenuItem";
+ this.addDifficultyToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.addDifficultyToolStripMenuItem.Text = "Add Difficulty";
+ this.addDifficultyToolStripMenuItem.Click += new System.EventHandler(this.addDifficultyToolStripMenuItem_Click);
+ //
+ // copyTableDataToToolStripMenuItem
+ //
+ this.copyTableDataToToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.cbCopyTableTo});
+ this.copyTableDataToToolStripMenuItem.Name = "copyTableDataToToolStripMenuItem";
+ this.copyTableDataToToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.copyTableDataToToolStripMenuItem.Text = "Copy table data to";
+ //
+ // cbCopyTableTo
+ //
+ this.cbCopyTableTo.Name = "cbCopyTableTo";
+ this.cbCopyTableTo.Size = new System.Drawing.Size(121, 23);
+ this.cbCopyTableTo.Text = "Select table";
+ this.cbCopyTableTo.SelectedIndexChanged += new System.EventHandler(this.cbCopyTableTo_SelectedIndexChanged);
+ //
+ // copyTableDataFromToolStripMenuItem
+ //
+ this.copyTableDataFromToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.cbCopyTableFrom});
+ this.copyTableDataFromToolStripMenuItem.Name = "copyTableDataFromToolStripMenuItem";
+ this.copyTableDataFromToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.copyTableDataFromToolStripMenuItem.Text = "Copy table data from";
+ //
+ // cbCopyTableFrom
+ //
+ this.cbCopyTableFrom.Name = "cbCopyTableFrom";
+ this.cbCopyTableFrom.Size = new System.Drawing.Size(121, 23);
+ this.cbCopyTableFrom.Text = "Select table";
+ this.cbCopyTableFrom.SelectedIndexChanged += new System.EventHandler(this.cbCopyTableFrom_SelectedIndexChanged);
+ //
+ // statusStrip1
+ //
+ this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.Status});
+ this.statusStrip1.Location = new System.Drawing.Point(0, 340);
+ this.statusStrip1.Name = "statusStrip1";
+ this.statusStrip1.Size = new System.Drawing.Size(524, 22);
+ this.statusStrip1.TabIndex = 1;
+ this.statusStrip1.Text = "statusStrip1";
+ //
+ // Status
+ //
+ this.Status.Name = "Status";
+ this.Status.Size = new System.Drawing.Size(39, 17);
+ this.Status.Text = "Ready";
+ //
+ // dataSet1
+ //
+ this.dataSet1.DataSetName = "NewDataSet";
+ //
+ // dgTableView
+ //
+ this.dgTableView.AllowUserToAddRows = false;
+ this.dgTableView.AllowUserToDeleteRows = false;
+ this.dgTableView.AllowUserToResizeColumns = false;
+ this.dgTableView.AllowUserToResizeRows = false;
+ dataGridViewCellStyle1.BackColor = System.Drawing.Color.Beige;
+ this.dgTableView.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;
+ this.dgTableView.BackgroundColor = System.Drawing.SystemColors.ControlDark;
+ this.dgTableView.BorderStyle = System.Windows.Forms.BorderStyle.None;
+ this.dgTableView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.dgTableView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.dgTableView.GridColor = System.Drawing.SystemColors.ControlDarkDark;
+ this.dgTableView.Location = new System.Drawing.Point(0, 27);
+ this.dgTableView.Name = "dgTableView";
+ this.dgTableView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.CellSelect;
+ this.dgTableView.Size = new System.Drawing.Size(524, 313);
+ this.dgTableView.TabIndex = 2;
+ this.dgTableView.CellMouseDown += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgTableView_CellMouseDown);
+ this.dgTableView.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgTableView_CellValueChanged);
+ this.dgTableView.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgTableView_ColumnHeaderMouseClick);
+ this.dgTableView.DataBindingComplete += new System.Windows.Forms.DataGridViewBindingCompleteEventHandler(this.dgTableView_DataBindingComplete);
+ this.dgTableView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.dgTableView_MouseDown);
+ //
+ // contextMenuStrip1
+ //
+ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.increaseByPToolStripMenuItem,
+ this.increaseByNToolStripMenuItem});
+ this.contextMenuStrip1.Name = "contextMenuStrip1";
+ this.contextMenuStrip1.Size = new System.Drawing.Size(147, 48);
+ //
+ // increaseByPToolStripMenuItem
+ //
+ this.increaseByPToolStripMenuItem.Name = "increaseByPToolStripMenuItem";
+ this.increaseByPToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+ this.increaseByPToolStripMenuItem.Text = "Increase by %";
+ this.increaseByPToolStripMenuItem.Click += new System.EventHandler(this.increaseByPToolStripMenuItem_Click);
+ //
+ // increaseByNToolStripMenuItem
+ //
+ this.increaseByNToolStripMenuItem.Name = "increaseByNToolStripMenuItem";
+ this.increaseByNToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+ this.increaseByNToolStripMenuItem.Text = "Increase by n";
+ this.increaseByNToolStripMenuItem.Click += new System.EventHandler(this.increaseByNToolStripMenuItem_Click);
+ //
+ // Form1
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(524, 362);
+ this.Controls.Add(this.dgTableView);
+ this.Controls.Add(this.statusStrip1);
+ this.Controls.Add(this.menuStrip1);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MainMenuStrip = this.menuStrip1;
+ this.MinimumSize = new System.Drawing.Size(540, 400);
+ this.Name = "Form1";
+ this.Text = "Battle Param Editor";
+ this.Load += new System.EventHandler(this.Form1_Load);
+ this.menuStrip1.ResumeLayout(false);
+ this.menuStrip1.PerformLayout();
+ this.statusStrip1.ResumeLayout(false);
+ this.statusStrip1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.dataSet1)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.dgTableView)).EndInit();
+ this.contextMenuStrip1.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.MenuStrip menuStrip1;
+ private System.Windows.Forms.StatusStrip statusStrip1;
+ private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+ private System.Windows.Forms.ToolStripComboBox cbDifficulty;
+ private System.Windows.Forms.ToolStripComboBox cbStatisticTable;
+ private System.Data.DataSet dataSet1;
+ private System.Windows.Forms.DataGridView dgTableView;
+ private System.Windows.Forms.ToolStripStatusLabel Status;
+ private System.Windows.Forms.ToolStripMenuItem dataOperationsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem addDifficultyToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem copyTableDataToToolStripMenuItem;
+ private System.Windows.Forms.ToolStripComboBox cbCopyTableTo;
+ private System.Windows.Forms.ToolStripMenuItem copyTableDataFromToolStripMenuItem;
+ private System.Windows.Forms.ToolStripComboBox cbCopyTableFrom;
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem increaseByPToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem increaseByNToolStripMenuItem;
+ }
+}
+
diff --git a/Form1.cs b/Form1.cs
new file mode 100644
index 0000000..913c5f5
--- /dev/null
+++ b/Form1.cs
@@ -0,0 +1,588 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.IO;
+
+namespace Battle_Param_Editor
+{
+ public partial class Form1 : Form
+ {
+ #region Variables
+ public DataSet dsParamData = null;
+ public int fileType;
+ public IList strDifficulties = new List {
+ "Normal",
+ "Hard",
+ "Very Hard",
+ "Ultimate"
+ };
+ ParamDataManager paramDataManager = new ParamDataManager();
+ #endregion
+
+ public Form1()
+ {
+ InitializeComponent();
+ SetDoubleBuffered(dgTableView);
+#if (PUBLICRELEASE)
+ addDifficultyToolStripMenuItem.Visible = false;
+#endif
+ }
+
+ private void Form1_Load(object sender, EventArgs e)
+ {
+
+ }
+
+ #region File load
+ private void openToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ OpenFileDialog openFileDialog1 = new OpenFileDialog();
+
+ openFileDialog1.InitialDirectory = ".";
+ openFileDialog1.Filter = "Episode 1 Offline|*battleparamentry.dat|Episode 1 Online|*battleparamentry_on.dat|Episode 2 Offline|*battleparamentry_lab.dat|Episode 2 Online|*battleparamentry_lab_on.dat|Episode 4 Offline|*battleparamentry_ep4.dat|Episode 4 Online|*battleparamentry_ep4_on.dat|All files|*.*";
+ openFileDialog1.FilterIndex = 1;
+ openFileDialog1.RestoreDirectory = true;
+
+ if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
+ {
+ CloseParamFile();
+ fileType = openFileDialog1.FilterIndex;
+ string fileName = openFileDialog1.FileName;
+
+ if (openFileDialog1.FilterIndex == 1 || openFileDialog1.FilterIndex == 2) paramDataManager.SetEpisode(0);
+ if (openFileDialog1.FilterIndex == 3 || openFileDialog1.FilterIndex == 4) paramDataManager.SetEpisode(1);
+ if (openFileDialog1.FilterIndex == 5 || openFileDialog1.FilterIndex == 6) paramDataManager.SetEpisode(2);
+ if ((dsParamData = paramDataManager.LoadParamData(fileName)) != null)
+ {
+ if (setDifficulties() == false)
+ {
+ MessageBox.Show("An error occured whilst trying to set difficulties", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ cbStatisticTable.Enabled = true;
+ cbDifficulty.Enabled = true;
+ dataOperationsToolStripMenuItem.Enabled = true;
+ cbStatisticTable.SelectedIndex = 0;
+ cbDifficulty.SelectedIndex = 0;
+ saveToolStripMenuItem.Enabled = true;
+ this.Width = 860;
+ Status.Text = fileName;
+ }
+ else
+ {
+ MessageBox.Show("Param file format is invalid or not supported.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ cbStatisticTable.Enabled = false;
+ cbDifficulty.Enabled = false;
+ dataOperationsToolStripMenuItem.Enabled = false;
+ saveToolStripMenuItem.Enabled = false;
+ Status.Text = "Ready";
+ MessageBox.Show("An error occured whilst trying to open the selected file: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void SetDataSource(string tableName, DataTable dtData, string Filter)
+ {
+ dgTableView.DataSource = dtData;
+ if (Filter != null)
+ {
+ (dgTableView.DataSource as DataTable).DefaultView.RowFilter = string.Format(Filter);
+ }
+ }
+
+ private void LoadDataTable(DataTable dtData, string Filter)
+ {
+ SetDataSource(dtData.TableName, dtData, Filter);
+ }
+
+ private void FormatTable()
+ {
+ foreach (DataGridViewColumn col in dgTableView.Columns)
+ {
+ col.SortMode = DataGridViewColumnSortMode.NotSortable;
+ if (col.Name == "Offset" || col.Name == "Difficulty") col.Visible = false;
+ if (col.Name == "Enemy Name" || col.Name == "Offset" || col.Name == "Difficulty") col.ReadOnly = true;
+ }
+
+ dgTableView.Columns["Enemy Name"].Width = 128;
+ dgTableView.Columns["Enemy Name"].DisplayIndex = 0;
+
+ if (GetTableName() == "Physical")
+ {
+ // Style
+ dgTableView.Columns["ATP"].Width = 48;
+ dgTableView.Columns["MST"].Width = 48;
+ dgTableView.Columns["EVP"].Width = 48;
+ dgTableView.Columns["HP"].Width = 48;
+ dgTableView.Columns["DFP"].Width = 48;
+ dgTableView.Columns["ATA"].Width = 48;
+ dgTableView.Columns["LCK"].Width = 48;
+ dgTableView.Columns["ESP"].Width = 48;
+ dgTableView.Columns["Range 1"].Width = 64;
+ dgTableView.Columns["Range 2"].Width = 64;
+ dgTableView.Columns["Boost"].Width = 48;
+ dgTableView.Columns["XP"].Width = 48;
+ dgTableView.Columns["TP"].Width = 48;
+
+ // Column order
+ dgTableView.Columns["ATP"].DisplayIndex = 1;
+ dgTableView.Columns["MST"].DisplayIndex = 2;
+ dgTableView.Columns["EVP"].DisplayIndex = 3;
+ dgTableView.Columns["HP"].DisplayIndex = 4;
+ dgTableView.Columns["DFP"].DisplayIndex = 5;
+ dgTableView.Columns["ATA"].DisplayIndex = 6;
+ dgTableView.Columns["LCK"].DisplayIndex = 7;
+ dgTableView.Columns["ESP"].DisplayIndex = 8;
+ dgTableView.Columns["Range 1"].DisplayIndex = 9;
+ dgTableView.Columns["Range 2"].DisplayIndex = 10;
+ dgTableView.Columns["Boost"].DisplayIndex = 11;
+ dgTableView.Columns["XP"].DisplayIndex = 12;
+ dgTableView.Columns["TP"].DisplayIndex = 13;
+ }
+
+ if (GetTableName() == "Resist")
+ {
+ // Visibility
+ dgTableView.Columns["Unknown 1"].Visible = false;
+ dgTableView.Columns["Reserved 1"].Visible = false;
+ dgTableView.Columns["Reserved 2"].Visible = false;
+ dgTableView.Columns["Reserved 3"].Visible = false;
+ dgTableView.Columns["Reserved 4"].Visible = false;
+ dgTableView.Columns["Reserved 5"].Visible = false;
+
+ // Style
+ dgTableView.Columns["EFR"].Width = 48;
+ dgTableView.Columns["EIC"].Width = 48;
+ dgTableView.Columns["ETH"].Width = 48;
+ dgTableView.Columns["ELT"].Width = 48;
+ dgTableView.Columns["EDK"].Width = 48;
+
+ // Column Order
+ dgTableView.Columns["EFR"].DisplayIndex = 1;
+ dgTableView.Columns["EIC"].DisplayIndex = 2;
+ dgTableView.Columns["ETH"].DisplayIndex = 3;
+ dgTableView.Columns["ELT"].DisplayIndex = 4;
+ dgTableView.Columns["EDK"].DisplayIndex = 5;
+ }
+
+ else if (GetTableName() == "Attack")
+ {
+ // Visibility
+ dgTableView.Columns["Unknown 1"].Visible = true;
+ dgTableView.Columns["Unknown 6"].Visible = false;
+ dgTableView.Columns["Unknown 7"].Visible = false;
+ dgTableView.Columns["Unknown 8"].Visible = false;
+ dgTableView.Columns["Unknown 9"].Visible = false;
+ dgTableView.Columns["Unknown 10"].Visible = false;
+ dgTableView.Columns["Unknown 11"].Visible = false;
+ dgTableView.Columns["Unknown 12"].Visible = false;
+ dgTableView.Columns["Angle X"].Visible = false;
+
+ // Style
+ dgTableView.Columns["Unknown 1"].Width = 72;
+ dgTableView.Columns["Unknown 2"].Width = 72;
+ dgTableView.Columns["Unknown 3"].Width = 72;
+ dgTableView.Columns["Unknown 4"].Width = 72;
+ dgTableView.Columns["Distance X"].Width = 72;
+ dgTableView.Columns["Angle X "].Width = 72;
+ dgTableView.Columns["Angle X "].DefaultCellStyle.Format = "#0.000\u00B0";
+ dgTableView.Columns["Distance Y"].Width = 72;
+
+ // Column Order
+ dgTableView.Columns["Unknown 1"].DisplayIndex = 1;
+ dgTableView.Columns["Unknown 2"].DisplayIndex = 2;
+ dgTableView.Columns["Unknown 3"].DisplayIndex = 3;
+ dgTableView.Columns["Unknown 4"].DisplayIndex = 4;
+ dgTableView.Columns["Distance X"].DisplayIndex = 5;
+ dgTableView.Columns["Angle X "].DisplayIndex = 6;
+ dgTableView.Columns["Distance Y"].DisplayIndex = 7;
+ }
+
+ if (GetTableName() == "Movement")
+ {
+ // Visibility
+ dgTableView.Columns["Unknown 1"].Visible = true;
+ dgTableView.Columns["Unknown 6"].Visible = true;
+ dgTableView.Columns["Unknown 7"].Visible = true;
+ dgTableView.Columns["Unknown 8"].Visible = true;
+
+ // Style
+ dgTableView.Columns["Idle Move Speed"].Width = 120;
+ dgTableView.Columns["Idle Animation Speed"].Width = 120;
+ dgTableView.Columns["Move Speed"].Width = 120;
+ dgTableView.Columns["Animation Speed"].Width = 120;
+ dgTableView.Columns["Unknown 1"].Width = 72;
+ dgTableView.Columns["Unknown 2"].Width = 72;
+ dgTableView.Columns["Unknown 3"].Width = 72;
+ dgTableView.Columns["Unknown 4"].Width = 72;
+ dgTableView.Columns["Unknown 5"].Width = 72;
+ dgTableView.Columns["Unknown 6"].Width = 72;
+ dgTableView.Columns["Unknown 7"].Width = 72;
+ dgTableView.Columns["Unknown 8"].Width = 72;
+
+ // Column Order
+ dgTableView.Columns["Idle Move Speed"].DisplayIndex = 1;
+ dgTableView.Columns["Idle Animation Speed"].DisplayIndex = 2;
+ dgTableView.Columns["Move Speed"].DisplayIndex = 3;
+ dgTableView.Columns["Animation Speed"].DisplayIndex = 4;
+ dgTableView.Columns["Unknown 1"].DisplayIndex = 5;
+ dgTableView.Columns["Unknown 2"].DisplayIndex = 6;
+ dgTableView.Columns["Unknown 3"].DisplayIndex = 7;
+ dgTableView.Columns["Unknown 4"].DisplayIndex = 8;
+ dgTableView.Columns["Unknown 5"].DisplayIndex = 9;
+ dgTableView.Columns["Unknown 6"].DisplayIndex = 10;
+ dgTableView.Columns["Unknown 7"].DisplayIndex = 11;
+ dgTableView.Columns["Unknown 8"].DisplayIndex = 12;
+ }
+ }
+
+ private void dgTableView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
+ {
+ FormatTable();
+ foreach (DataGridViewColumn col in dgTableView.Columns)
+ {
+ if (col.Name == "Enemy Name" || col.Name == "Offset")
+ {
+ col.Frozen = true;
+ foreach (DataGridViewRow row in dgTableView.Rows)
+ {
+ if (row.Index % 2 == 0)
+ {
+ row.Cells[col.Name].Style.BackColor = Color.FromArgb(250, 250, 250);
+ }
+ else
+ {
+ row.Cells[col.Name].Style.BackColor = Color.FromArgb(240, 240, 200);
+ }
+ }
+ }
+ }
+ }
+
+ private void CloseParamFile()
+ {
+ try
+ {
+ dsParamData = null;
+
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("An error occured whilst trying to Close the param data file: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ #endregion
+ #region File save
+ private void saveToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ SaveFileDialog saveFileDialog1 = new SaveFileDialog();
+ saveFileDialog1.InitialDirectory = ".";
+ saveFileDialog1.Filter = "Episode 1 Offline|*battleparamentry.dat|Episode 1 Online|*battleparamentry_on.dat|Episode 2 Offline|*battleparamentry_lab.dat|Episode 2 Online|*battleparamentry_lab_on.dat|Episode 4 Offline|*battleparamentry_ep4.dat|Episode 4 Online|*battleparamentry_ep4_on.dat|All files|*.*";
+ saveFileDialog1.FilterIndex = fileType;
+ saveFileDialog1.RestoreDirectory = true;
+ if (saveFileDialog1.ShowDialog(this) == DialogResult.OK)
+ {
+ string fileName = saveFileDialog1.FileName;
+ paramDataManager.SaveParamData(fileName, dsParamData);
+ }
+ }
+ catch(Exception ex)
+ {
+ MessageBox.Show("An error occured whilst trying to save file: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ #endregion
+ #region Data Processing
+ private bool setDifficulties()
+ {
+ DataRow[] dr = dsParamData.Tables["Constants"].Select("[Name] = 'DifficultyCount'");
+ if (dr.Length > 0)
+ {
+ int difficultyCount = Convert.ToInt32(dr[0]["int"]);
+ int difficultyItr = 0;
+ cbDifficulty.Items.Clear();
+
+ while (strDifficulties.Count < difficultyCount)
+ {
+ strDifficulties.Add("Custom " + ++difficultyItr);
+ }
+ for (int i = 0; i < difficultyCount; i++)
+ {
+ cbDifficulty.Items.Add(strDifficulties[i]);
+ }
+
+ return true;
+ }
+ else
+ return false;
+ }
+
+ private string GetTableName()
+ {
+ string tableName = "";
+ if (dgTableView.DataSource.GetType() == typeof(DataView))
+ tableName = ((DataView)dgTableView.DataSource).Table.TableName;
+ else
+ tableName = ((DataTable)dgTableView.DataSource).TableName;
+ return tableName;
+ }
+
+ public static void SetDoubleBuffered(System.Windows.Forms.Control control)
+ {
+ // set instance non-public property with name "DoubleBuffered" to true
+ typeof(System.Windows.Forms.Control).InvokeMember("DoubleBuffered",
+ System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic,
+ null, control, new object[] { true });
+ }
+
+ private void dgTableView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
+ {
+ if((GetTableName() == "Attack") && (dgTableView.Columns[e.ColumnIndex].Name == "Angle X "))
+ {
+ dsParamData.Tables["Attack"].Rows[e.RowIndex]["Angle X"] = Convert.ToUInt16(Convert.ToSingle(dsParamData.Tables["Attack"].Rows[e.RowIndex]["Angle X "]) * 182.0416666666667) % 0xFFFF;
+ }
+ }
+ #endregion
+ #region User UI
+ private void cbStatisticTable_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ string[] selected = cbStatisticTable.Text.Split(' ');
+ if (selected[0] == "Physical" || selected[0] == "Resist" || selected[0] == "Attack" || selected[0] == "Movement")
+ {
+ LoadDataTable(dsParamData.Tables[selected[0]], "[Enemy Name] <> 'INVALID' and [Difficulty] = " + cbDifficulty.SelectedIndex.ToString());
+ //LoadDataTable(dsParamData.Tables[selected[0]], "[Difficulty] = " + cbDifficulty.SelectedIndex.ToString());
+ }
+ cbCopyTableTo.Items.Clear();
+ cbCopyTableFrom.Items.Clear();
+ if (cbDifficulty.SelectedIndex != -1)
+ {
+ for (int i = 0; i < cbDifficulty.Items.Count; i++)
+ {
+ if (cbDifficulty.Items[cbDifficulty.SelectedIndex].ToString() != strDifficulties[i])
+ {
+ cbCopyTableTo.Items.Add(strDifficulties[i]);
+ cbCopyTableFrom.Items.Add(strDifficulties[i]);
+ }
+ }
+ }
+ dgTableView.Focus();
+ }
+
+
+ private void cbDifficulty_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ string[] selected = cbStatisticTable.Text.Split(' ');
+ if (selected[0] == "Physical" || selected[0] == "Resist" || selected[0] == "Attack" || selected[0] == "Movement")
+ {
+ LoadDataTable(dsParamData.Tables[selected[0]], "[Enemy Name] <> 'INVALID' and [Difficulty] = " + cbDifficulty.SelectedIndex.ToString());
+ //LoadDataTable(dsParamData.Tables[selected[0]], "[Difficulty] = " + cbDifficulty.SelectedIndex.ToString());
+ }
+ cbCopyTableTo.Items.Clear();
+ cbCopyTableFrom.Items.Clear();
+ for (int i = 0; i < cbDifficulty.Items.Count; i++ )
+ {
+ if (cbDifficulty.Items[cbDifficulty.SelectedIndex].ToString() != strDifficulties[i])
+ {
+ cbCopyTableTo.Items.Add(strDifficulties[i]);
+ cbCopyTableFrom.Items.Add(strDifficulties[i]);
+ }
+ }
+ dgTableView.Focus();
+ }
+
+ private void addDifficultyToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+#if (!PUBLICRELEASE)
+ paramDataManager.AddTable("Physical", paramDataManager.physicalSizes);
+ paramDataManager.AddTable("Attack", paramDataManager.attackSizes);
+ paramDataManager.AddTable("Resist", paramDataManager.resistSizes);
+ paramDataManager.AddTable("Movement", paramDataManager.movementSizes);
+
+ strDifficulties = new List {
+ "Normal",
+ "Hard",
+ "Very Hard",
+ "Ultimate"
+ };
+
+ DataRow[] dr = dsParamData.Tables["Constants"].Select("[Name] = 'DifficultyCount'");
+ if (dr.Length > 0)
+ {
+ int difficultyCount = Convert.ToInt32(dr[0]["int"]);
+ int difficultyItr = 0;
+ cbDifficulty.Items.Clear();
+ dr[0]["int"] = Convert.ToString(++difficultyCount);
+
+ while (strDifficulties.Count < difficultyCount)
+ {
+ strDifficulties.Add("Custom " + ++difficultyItr);
+ }
+ for (int i = 0; i < difficultyCount; i++)
+ {
+ cbDifficulty.Items.Add(strDifficulties[i]);
+ }
+ }
+
+ setDifficulties();
+#endif
+ }
+
+ private void cbCopyTableTo_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ dataOperationsToolStripMenuItem.DropDown.Close();
+ if (MessageBox.Show("Overwrite '" + cbCopyTableTo.Text.ToString() + "' table data with '" + cbDifficulty.Text.ToString() + "' table data?", "Copy confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ if (!paramDataManager.CopyTable(cbDifficulty.Text.ToString(), cbCopyTableTo.Text.ToString(), strDifficulties))
+ {
+ MessageBox.Show("Error copying table.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ cbCopyTableTo.Text = "Select table";
+ }
+
+ private void cbCopyTableFrom_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ dataOperationsToolStripMenuItem.DropDown.Close();
+ if (MessageBox.Show("Overwrite '" + cbDifficulty.Text.ToString() + "' table data with '" + cbCopyTableFrom.Text.ToString() + "' table data?", "Copy confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ if (!paramDataManager.CopyTable(cbCopyTableFrom.Text.ToString(), cbDifficulty.Text.ToString(), strDifficulties))
+ {
+ MessageBox.Show("Error copying table.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ cbCopyTableFrom.Text = "Select table";
+ }
+
+ private void dgTableView_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Right)
+ {
+ DataGridView.HitTestInfo hti = dgTableView.HitTest(e.X, e.Y);
+ if (hti.RowIndex > -1 && hti.ColumnIndex > 2)
+ {
+ dgTableView.ClearSelection();
+ dgTableView.Rows[hti.RowIndex].Cells[hti.ColumnIndex].Selected = true;
+ contextMenuStrip1.Show(dgTableView, e.Location);
+ }
+ }
+ }
+
+ private void dgTableView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Right && e.ColumnIndex > 2)
+ {
+ dgTableView.SelectionMode = DataGridViewSelectionMode.FullColumnSelect;
+ dgTableView.Columns[e.ColumnIndex].Selected = true;
+ contextMenuStrip1.Show(Cursor.Position);
+ }
+ }
+
+ private void increaseByPToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ DataModifier dataModifier = new DataModifier();
+ dataModifier.ShowDialog();
+ System.Type dataType;
+ if (dataModifier.DialogResult == DialogResult.OK)
+ {
+ dataModifier.Dispose();
+ foreach (DataGridViewCell cell in dgTableView.SelectedCells)
+ {
+ dataType = this.dsParamData.Tables[GetTableName()].Columns[cell.ColumnIndex].DataType;
+ if (dataType == typeof(System.Single))
+ {
+ cell.Value = Convert.ToSingle(Convert.ToSingle(cell.Value) + ((Convert.ToSingle(cell.Value) / 100) * Convert.ToSingle(dataModifier.nupAdjustment.Value))).ToString();
+ }
+ else if ((dataType == typeof(System.UInt16)) || (dataType == typeof(System.Int16)))
+ {
+ cell.Value = Convert.ToUInt16(Convert.ToSingle(cell.Value) + ((Convert.ToSingle(cell.Value) / 100) * Convert.ToSingle(dataModifier.nupAdjustment.Value))).ToString();
+ }
+ else if ((dataType == typeof(System.UInt32)) || (dataType == typeof(System.Int32)))
+ {
+ cell.Value = Convert.ToUInt32(Convert.ToSingle(cell.Value) + ((Convert.ToSingle(cell.Value) / 100) * Convert.ToSingle(dataModifier.nupAdjustment.Value))).ToString();
+ }
+ }
+ }
+ else
+ {
+ dataModifier.Dispose();
+ }
+ dgTableView.SelectionMode = DataGridViewSelectionMode.CellSelect;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("An error occured whilst increasing value: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void increaseByNToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ DataModifier dataModifier = new DataModifier();
+ dataModifier.ShowDialog();
+ System.Type dataType;
+ if (dataModifier.DialogResult == DialogResult.OK)
+ {
+ dataModifier.Dispose();
+ foreach (DataGridViewCell cell in dgTableView.SelectedCells)
+ {
+ dataType = this.dsParamData.Tables[GetTableName()].Columns[cell.ColumnIndex].DataType;
+ if (dataType == typeof(System.Single))
+ {
+ cell.Value = Convert.ToSingle(Convert.ToSingle(cell.Value) + (Convert.ToSingle(dataModifier.nupAdjustment.Value))).ToString();
+ }
+ else if ((dataType == typeof(System.UInt16)) || (dataType == typeof(System.Int16)))
+ {
+ cell.Value = Convert.ToUInt16(Convert.ToSingle(cell.Value) + (Convert.ToUInt16(dataModifier.nupAdjustment.Value))).ToString();
+ }
+ else if ((dataType == typeof(System.UInt32)) || (dataType == typeof(System.Int32)))
+ {
+ cell.Value = Convert.ToUInt32(Convert.ToSingle(cell.Value) + (Convert.ToUInt32(dataModifier.nupAdjustment.Value))).ToString();
+ }
+ }
+ }
+ else
+ {
+ dataModifier.Dispose();
+ }
+ dgTableView.SelectionMode = DataGridViewSelectionMode.CellSelect;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("An error occured whilst increasing value: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void dgTableView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
+ {
+ dgTableView.SelectionMode = DataGridViewSelectionMode.CellSelect;
+ }
+
+ private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ About about = new About();
+ about.ShowDialog();
+ }
+
+ private void exitToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+ #endregion
+ }
+}
diff --git a/Form1.resx b/Form1.resx
new file mode 100644
index 0000000..5241fb3
--- /dev/null
+++ b/Form1.resx
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+ 132, 17
+
+
+ 248, 15
+
+
+ 347, 15
+
+
+
+
+ AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAKAAAADgAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ AOAAAACgAAAAUAAAAAAAAAAAAAAAAAAAAFAAAADwU1RT8KWopfD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8
+ +PD4/Pjw+Pz48Ojs6PDo7OjwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAAUAAAAAAAAAAAAAQAoFNXU/D4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8
+ +PD4/Pjw+Pz48Pj8+PD4/Pjw+Pj48KWlpfAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAACgAAAAAAAAAAAABADgpaml8Pj8+PD4/Pjw+Pz48Pj8
+ +PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4+PjwpaWl8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAOAAAAAAAAAAAAAEAPD4/Pjw+Pz48Pj8
+ +PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj4+PClpaXwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAAAAAAAAAAQA8Pj8
+ +PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pj48FNTU/AAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAAAAAA
+ AAAAAADw+Pz48Pj8+PD4/Pjw8Pjw8PD48PDw+PDw8Pjw8PD08PDw9PDw8PTw8PD08PDQ0NDwRUVF8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAAAAAAAAAAAAAPD4/Pjw+Pz48Pj8+PDw+PDw8Pjw8PD48PDw+PDw8PTw8PD08PDw9PDwoKOg8EVF
+ RfAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAAAAAAAAAAAA8Pj8+PD4/Pjw+Pz48PD48PDw+PDw8Pjw8PD48PCgo6DwUFFQ8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAAAAAAAAAAAADw+Pz48Pj8+PD4/Pjw8Pjw8GVoZfAgICDwICAg8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAAAAAAAAAAgECPD4/PjwqKmo8AgECPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAAAAAAAACAQI8KipqPAIBAjwCAQI8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAAAAAAAAAIBAjwWFdY8AgE
+ CPAIBAjwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ 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
+ +PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48KWopfAAAADgAAAAAAAAAAAABACgU1dT8Pj8
+ +PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8
+ +PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/PjwU1RT8AAAAKAAAAAAAAAAAAAE
+ AFAABADwU1dT8KWppfD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8
+ +PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjw+Pz48Pj8+PD4/Pjwpaml8FNXU/AAAADwAAAAUAAA
+ AAAAAAAAAAQAAAAEAFAABACgAAQA4AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
+ APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAQA8AAEAPAABADgAAQAoAAA
+ AFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA/////+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAHAAAAD4AAAB/////8=
+
+
+
\ No newline at end of file
diff --git a/ParamData.cs b/ParamData.cs
new file mode 100644
index 0000000..425e330
--- /dev/null
+++ b/ParamData.cs
@@ -0,0 +1,143 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Battle_Param_Editor
+{
+ public class ParamData
+ {
+ public DataSet CreateDataStructure()
+ {
+ DataSet dsDataStructure = new DataSet("ParamDataStructure");
+
+ DataTable dtPhysical = new DataTable("Physical");
+ DataTable dtAttack = new DataTable("Attack");
+ DataTable dtResist = new DataTable("Resist");
+ DataTable dtMovement = new DataTable("Movement");
+
+ dtPhysical.Columns.Add("Enemy Name", System.Type.GetType("System.String"));
+ dtPhysical.Columns.Add("Offset", System.Type.GetType("System.UInt32"));
+ dtPhysical.Columns.Add("Difficulty", System.Type.GetType("System.UInt32"));
+ dtPhysical.Columns.Add("ATP", System.Type.GetType("System.UInt16"));
+ dtPhysical.Columns.Add("MST", System.Type.GetType("System.UInt16"));
+ dtPhysical.Columns.Add("EVP", System.Type.GetType("System.UInt16"));
+ dtPhysical.Columns.Add("HP", System.Type.GetType("System.UInt16"));
+ dtPhysical.Columns.Add("DFP", System.Type.GetType("System.UInt16"));
+ dtPhysical.Columns.Add("ATA", System.Type.GetType("System.UInt16"));
+ dtPhysical.Columns.Add("LCK", System.Type.GetType("System.UInt16"));
+ dtPhysical.Columns.Add("ESP", System.Type.GetType("System.UInt16"));
+ dtPhysical.Columns.Add("Range 1", System.Type.GetType("System.Single"));
+ dtPhysical.Columns.Add("Range 2", System.Type.GetType("System.Single"));
+ dtPhysical.Columns.Add("Boost", System.Type.GetType("System.UInt32"));
+ dtPhysical.Columns.Add("XP", System.Type.GetType("System.UInt32"));
+ dtPhysical.Columns.Add("TP", System.Type.GetType("System.UInt32"));
+ dtPhysical.Columns["ATP"].DefaultValue = 0;
+ dtPhysical.Columns["MST"].DefaultValue = 0;
+ dtPhysical.Columns["EVP"].DefaultValue = 0;
+ dtPhysical.Columns["HP"].DefaultValue = 0;
+ dtPhysical.Columns["DFP"].DefaultValue = 0;
+ dtPhysical.Columns["ATA"].DefaultValue = 0;
+ dtPhysical.Columns["LCK"].DefaultValue = 0;
+ dtPhysical.Columns["ESP"].DefaultValue = 0;
+ dtPhysical.Columns["Range 1"].DefaultValue = 0.0f;
+ dtPhysical.Columns["Range 2"].DefaultValue = 0.0f;
+ dtPhysical.Columns["Boost"].DefaultValue = 0;
+ dtPhysical.Columns["XP"].DefaultValue = 0;
+ dtPhysical.Columns["TP"].DefaultValue = 0;
+ dsDataStructure.Tables.Add(dtPhysical);
+
+ dtAttack.Columns.Add("Enemy Name", System.Type.GetType("System.String"));
+ dtAttack.Columns.Add("Offset", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns.Add("Difficulty", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns.Add("Angle X ", System.Type.GetType("System.Single"));
+ dtAttack.Columns.Add("Unknown 1", System.Type.GetType("System.UInt16"));
+ dtAttack.Columns.Add("Unknown 2", System.Type.GetType("System.UInt16"));
+ dtAttack.Columns.Add("Unknown 3", System.Type.GetType("System.UInt16"));
+ dtAttack.Columns.Add("Unknown 4", System.Type.GetType("System.UInt16"));
+ dtAttack.Columns.Add("Distance X", System.Type.GetType("System.Single"));
+ dtAttack.Columns.Add("Angle X", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns.Add("Distance Y", System.Type.GetType("System.Single"));
+ dtAttack.Columns.Add("Unknown 6", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns.Add("Unknown 7", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns.Add("Unknown 8", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns.Add("Unknown 9", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns.Add("Unknown 10", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns.Add("Unknown 11", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns.Add("Unknown 12", System.Type.GetType("System.UInt32"));
+ dtAttack.Columns["Unknown 1"].DefaultValue = 0;
+ dtAttack.Columns["Unknown 2"].DefaultValue = 0;
+ dtAttack.Columns["Unknown 3"].DefaultValue = 0;
+ dtAttack.Columns["Distance X"].DefaultValue = 0.0f;
+ dtAttack.Columns["Angle X"].DefaultValue = 0;
+ dtAttack.Columns["Distance Y"].DefaultValue = 0.0f;
+ dsDataStructure.Tables.Add(dtAttack);
+
+ dtResist.Columns.Add("Enemy Name", System.Type.GetType("System.String"));
+ dtResist.Columns.Add("Offset", System.Type.GetType("System.UInt32"));
+ dtResist.Columns.Add("Difficulty", System.Type.GetType("System.UInt32"));
+ dtResist.Columns.Add("Unknown 1", System.Type.GetType("System.UInt16"));
+ dtResist.Columns.Add("EFR", System.Type.GetType("System.UInt16"));
+ dtResist.Columns.Add("EIC", System.Type.GetType("System.UInt16"));
+ dtResist.Columns.Add("ETH", System.Type.GetType("System.UInt16"));
+ dtResist.Columns.Add("ELT", System.Type.GetType("System.UInt16"));
+ dtResist.Columns.Add("EDK", System.Type.GetType("System.UInt16"));
+ dtResist.Columns.Add("Reserved 1", System.Type.GetType("System.UInt32"));
+ dtResist.Columns.Add("Reserved 2", System.Type.GetType("System.UInt32"));
+ dtResist.Columns.Add("Reserved 3", System.Type.GetType("System.UInt32"));
+ dtResist.Columns.Add("Reserved 4", System.Type.GetType("System.UInt32"));
+ dtResist.Columns.Add("Reserved 5", System.Type.GetType("System.UInt32"));
+ dtResist.Columns["EFR"].DefaultValue = 0;
+ dtResist.Columns["EIC"].DefaultValue = 0;
+ dtResist.Columns["ETH"].DefaultValue = 0;
+ dtResist.Columns["ELT"].DefaultValue = 0;
+ dtResist.Columns["EDK"].DefaultValue = 0;
+ dsDataStructure.Tables.Add(dtResist);
+
+ dtMovement.Columns.Add("Enemy Name", System.Type.GetType("System.String"));
+ dtMovement.Columns.Add("Offset", System.Type.GetType("System.UInt32"));
+ dtMovement.Columns.Add("Difficulty", System.Type.GetType("System.UInt32"));
+ dtMovement.Columns.Add("Idle Move Speed", System.Type.GetType("System.Single"));
+ dtMovement.Columns.Add("Idle Animation Speed", System.Type.GetType("System.Single"));
+ dtMovement.Columns.Add("Move Speed", System.Type.GetType("System.Single"));
+ dtMovement.Columns.Add("Animation Speed", System.Type.GetType("System.Single"));
+ dtMovement.Columns.Add("Unknown 1", System.Type.GetType("System.Single"));
+ dtMovement.Columns.Add("Unknown 2", System.Type.GetType("System.Single"));
+ dtMovement.Columns.Add("Unknown 3", System.Type.GetType("System.UInt32"));
+ dtMovement.Columns.Add("Unknown 4", System.Type.GetType("System.UInt32"));
+ dtMovement.Columns.Add("Unknown 5", System.Type.GetType("System.UInt32"));
+ dtMovement.Columns.Add("Unknown 6", System.Type.GetType("System.UInt32"));
+ dtMovement.Columns.Add("Unknown 7", System.Type.GetType("System.UInt32"));
+ dtMovement.Columns.Add("Unknown 8", System.Type.GetType("System.UInt32"));
+ dtMovement.Columns["Idle Move Speed"].DefaultValue = 0.0f;
+ dtMovement.Columns["Idle Animation Speed"].DefaultValue = 0.0f;
+ dtMovement.Columns["Move Speed"].DefaultValue = 0;
+ dtMovement.Columns["Animation Speed"].DefaultValue = 0;
+ dsDataStructure.Tables.Add(dtMovement);
+
+ return dsDataStructure;
+ }
+
+ public DataTable CreateConstants()
+ {
+ DataTable dtConstants = new DataTable("Constants");
+ dtConstants.Columns.Add("Name", System.Type.GetType("System.String"));
+ dtConstants.Columns.Add("Int", System.Type.GetType("System.Int32"));
+ dtConstants.Columns.Add("Single", System.Type.GetType("System.Single"));
+ dtConstants.Columns.Add("String", System.Type.GetType("System.String"));
+
+ return dtConstants;
+ }
+
+ public DataTable CreatePointerStructure()
+ {
+ DataTable dtPointers = new DataTable("Pointers");
+ dtPointers.Columns.Add("Table name", System.Type.GetType("System.String"));
+ dtPointers.Columns.Add("Table address", System.Type.GetType("System.Int32"));
+
+ return dtPointers;
+ }
+ }
+}
diff --git a/ParamDataManager.cs b/ParamDataManager.cs
new file mode 100644
index 0000000..577b7d5
--- /dev/null
+++ b/ParamDataManager.cs
@@ -0,0 +1,1645 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Data;
+using System.IO;
+using System.Windows.Forms;
+
+namespace Battle_Param_Editor
+{
+ public class ParamDataManager
+ {
+ #region Structs
+
+ private struct TableLocation
+ {
+ public int startPosition;
+ public int endPosition;
+ };
+
+ #endregion
+ #region Variables
+ public DataSet dsParamData = null;
+ public List physicalSizes = new List() { 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4 };
+ public List resistSizes = new List() { 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4 };
+ public List attackSizes = new List() { 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 };
+ public List movementSizes = new List() { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 };
+ private int episode = 0;
+
+ private readonly IList paramTables = new List {
+ "Physical",
+ "Attack",
+ "Resist",
+ "Movement"
+ }.AsReadOnly();
+
+ private readonly IList[] ep1Names = {
+ new List { // Physical
+ "MonthMant",
+ "Monest",
+ "Savage Wolf",
+ "Barbarous Wolf",
+ "Poison Lily",
+ "Nar Lily",
+ "Sinow Beat",
+ "Canadine",
+ "Canadine (Ring)",
+ "Canane",
+ "Chaos Sorcerer",
+ "Bee R",
+ "Bee L",
+ "Chaos Bringer",
+ "Dark Belra",
+ "DE RO LE (Body)",
+ "DE RO LE (Shell)",
+ "DE RO LE (Tail Mine)",
+ "DRAGON",
+ "Sinow Gold",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Rag Rappy",
+ "AI Rappy",
+ "Nano Dragon",
+ "Dubchic",
+ "Gillchic",
+ "Garanz",
+ "Dark Gunner",
+ "Bul Claw",
+ "Claw",
+ "VOL OPT (Core)",
+ "VOL OPT (Pillar )",
+ "VOL OPT (Monitor)",
+ "VOL OPT (Celing Amp)",
+ "VOL OPT (2nd Core)",
+ "VOL OPT (2nd Trap)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Pofuilly Slime",
+ "Pan Arms",
+ "Hidoom",
+ "Migium",
+ "Pouilly Slime",
+ "Darvant (Mine Field)",
+ "DARK FALZ (Phase 1)",
+ "DARK FALZ (Phase 2)",
+ "DARK FALZ (Phase 3)",
+ "Darvant (Phase 2 Ult)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Dubswitch",
+ "HildeBear",
+ "HildeBlue",
+ "Booma",
+ "Go Booma",
+ "Gigo Booma",
+ "Grass Assasin",
+ "Evil Shark",
+ "Pal Shark",
+ "Guil Shark",
+ "Del Saber",
+ "Dimenian",
+ "La Dimenian",
+ "So Dimenian",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly(),
+ new List { // Resist
+ "MonthMant",
+ "Monest",
+ "Savage Wolf",
+ "Barbarous Wolf",
+ "Poison Lily",
+ "Nar Lily",
+ "Sinow Beat",
+ "Canadine",
+ "Canadine (Ring)",
+ "Canane",
+ "Chaos Sorcerer",
+ "Bee R",
+ "Bee L",
+ "Chaos Bringer",
+ "Dark Belra",
+ "DE RO LE (Body)",
+ "DE RO LE (Shell)",
+ "DE RO LE (Tail Mine)",
+ "DRAGON",
+ "Sinow Gold",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Rag Rappy",
+ "AI Rappy",
+ "Nano Dragon",
+ "Dubchic",
+ "Gillchic",
+ "Garanz",
+ "Dark Gunner",
+ "Bul Claw",
+ "Claw",
+ "VOL OPT (Core)",
+ "VOL OPT (Pillar )",
+ "VOL OPT (Monitor)",
+ "VOL OPT (Celing Amp)",
+ "VOL OPT (2nd Core)",
+ "VOL OPT (2nd Trap)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Pofuilly Slime",
+ "Pan Arms",
+ "Hidoom",
+ "Migium",
+ "Pouilly Slime",
+ "Darvant (Mine Field)",
+ "DARK FALZ (Phase 1)",
+ "DARK FALZ (Phase 2)",
+ "DARK FALZ (Phase 3)",
+ "Darvant (Phase 2 Ult)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "HildeBear",
+ "HildeBlue",
+ "Booma",
+ "Go Booma",
+ "Gigo Booma",
+ "Grass Assasin",
+ "Evil Shark",
+ "Pal Shark",
+ "Guil Shark",
+ "Del Saber",
+ "Dimenian",
+ "La Dimenian",
+ "So Dimenian",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly(),
+ new List { // Attack
+ "MonthMant",
+ "Monest",
+ "Savage Wolf",
+ "Barbarous Wolf",
+ "Poison Lily Peck",
+ "UNKNOWN",
+ "Sinow Beat Punch",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Chaos Bringer",
+ "INVALID",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Rag Rappy Peck",
+ "Al Rappy Peck",
+ "INVALID",
+ "Dubchic",
+ "Gilchic",
+ "INVALID",
+ "INVALID",
+ "Bul Claw",
+ "Claw",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Darvant (Mine Field)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Darvant (Phase 2 Ult)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "UNKNOWN",
+ "HildeBear Punch",
+ "HildeBear Tech",
+ "HildeBear Jump",
+ "HildeBlue Punch",
+ "HildeBlue Tech",
+ "HildeBlue Jump",
+ "Booma Punch",
+ "Go Booma Punch",
+ "Giga Booma Punch",
+ "Grass Assasin 1",
+ "Grass Assasin 2",
+ "Grass Assasin 3",
+ "Evil Shark Punch",
+ "Pal Shark Punch",
+ "Guil Shark Punch",
+ "Del Saber 1",
+ "Del Saber 2",
+ "Del Saber 3",
+ "Dimenian Punch",
+ "La Dimenian Punch",
+ "So Dimenian Punch",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly(),
+ new List { // Movement
+ "MonthMant",
+ "Monest",
+ "Savage Wolf",
+ "Barbarous Wolf",
+ "Poison Lily",
+ "Nar Lily",
+ "Sinow Beat",
+ "Canadine",
+ "Canadine (Ring)",
+ "Canane",
+ "Chaos Sorcerer",
+ "Bee R",
+ "Bee L",
+ "Chaos Bringer",
+ "Dark Belra",
+ "DE RO LE (Body)",
+ "DE RO LE (Shell)",
+ "DE RO LE (Tail Mine)",
+ "DRAGON",
+ "Sinow Gold",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Rag Rappy",
+ "AI Rappy",
+ "Nano Dragon",
+ "Dubchic",
+ "Gillchic",
+ "Garanz",
+ "Dark Gunner",
+ "Bul Claw",
+ "Claw",
+ "VOL OPT (Core)",
+ "VOL OPT (Pillar )",
+ "VOL OPT (Monitor)",
+ "VOL OPT (Celing Amp)",
+ "VOL OPT (2nd Core)",
+ "VOL OPT (2nd Trap)",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Pofuilly Slime",
+ "Pan Arms",
+ "Hidoom",
+ "Migium",
+ "Pouilly Slime",
+ "Darvant (Mine Field)",
+ "DARK FALZ (Phase 1)",
+ "DARK FALZ (Phase 2)",
+ "DARK FALZ (Phase 3)",
+ "Darvant (Phase 2 Ult)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "HildeBear",
+ "HildeBlue",
+ "Booma",
+ "Go Booma",
+ "Gigo Booma",
+ "Grass Assasin",
+ "Evil Shark",
+ "Pal Shark",
+ "Guil Shark",
+ "Del Saber",
+ "Dimenian",
+ "La Dimenian",
+ "So Dimenian",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly()
+ };
+
+ private readonly IList[] ep2Names = {
+ new List { // Physical
+ "Mothmant",
+ "Monest",
+ "Savage Wolf",
+ "Barbarous Wolf",
+ "Poison Lily",
+ "Nar Lily",
+ "Sinow Berill",
+ "Gee",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Chaos Sorceror",
+ "Bee R",
+ "Bee L",
+ "Delbiter",
+ "Dark Belra",
+ "Barba Ray",
+ "Pig Ray",
+ "Ul Ray",
+ "Gol Dragon",
+ "Sinow Spigell",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Rag Rappy",
+ "Love Rappy",
+ "Gi Gue",
+ "Dubchic",
+ "Gillchic",
+ "Garanz",
+ "Gal Gryphon",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Epsilon",
+ "Epsigard",
+ "Del Lily",
+ "Ill Gill",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Olga Flow Phase 1",
+ "Olga Flow Phase 2",
+ "Gael",
+ "Giel",
+ "INVALID",
+ "Deldepth",
+ "Pan Arms",
+ "Hidoom",
+ "Migium",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Mericarol",
+ "Ul Gibbon",
+ "Zol Gibbon",
+ "Gibbles",
+ "INVALID",
+ "INVALID",
+ "Morfos",
+ "Recobox",
+ "Recon",
+ "Sinow Zoa",
+ "Sinow Zele",
+ "Merikle ",
+ "Mericus",
+ "INVALID",
+ "INVALID",
+ "Hildebear",
+ "Hildeblue",
+ "Merillia",
+ "Meriltas",
+ "INVALID",
+ "Grass Assassin",
+ "Dolmolm",
+ "Dolmdarl",
+ "UNKNOWN",
+ "Delsaber",
+ "Dimenian",
+ "La Dimenian",
+ "So Dimenian",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly(),
+ new List { // Resist
+ "Mothmant",
+ "Monest",
+ "Savage Wolf",
+ "Barbarous Wolf",
+ "Poison Lily",
+ "Nar Lily",
+ "Sinow Berill",
+ "Gee",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Chaos Sorceror",
+ "Bee R",
+ "Bee L",
+ "Delbiter",
+ "Dark Belra",
+ "Barba Ray",
+ "Pig Ray",
+ "Ul Ray",
+ "Gol Dragon",
+ "Sinow Spigell",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Rag Rappy",
+ "Love Rappy",
+ "Gi Gue",
+ "Dubchic",
+ "Gillchic",
+ "Garanz",
+ "Gal Gryphon",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Epsilon",
+ "Epsigard",
+ "Del Lily",
+ "Ill Gill",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Olga Flow Phase 1",
+ "Olga Flow Phase 2",
+ "Gael",
+ "Giel",
+ "INVALID",
+ "Deldepth",
+ "Pan Arms",
+ "Hidoom",
+ "Migium",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Mericarol",
+ "Ul Gibbon",
+ "Zol Gibbon",
+ "Gibbles",
+ "INVALID",
+ "INVALID",
+ "Morfos",
+ "Recobox",
+ "Recon",
+ "Sinow Zoa",
+ "Sinow Zele",
+ "Merikle ",
+ "Mericus",
+ "INVALID",
+ "Hildebear",
+ "Hildeblue",
+ "Merillia",
+ "Meriltas",
+ "UNKNOWN",
+ "Grass Assassin",
+ "Dolmolm",
+ "Dolmdarl",
+ "UNKNOWN",
+ "Delsaber",
+ "Dimenian",
+ "La Dimenian",
+ "So Dimenian",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly(),
+ new List { // Attack
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN"
+ }.AsReadOnly(),
+ new List { // Movement
+ "Mothmant",
+ "Monest",
+ "Savage Wolf",
+ "Barbarous Wolf",
+ "Poison Lily",
+ "Nar Lily",
+ "Sinow Berill",
+ "Gee",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Chaos Sorceror",
+ "Bee R",
+ "Bee L",
+ "Delbiter",
+ "Dark Belra",
+ "Barba Ray",
+ "Pig Ray",
+ "Ul Ray",
+ "Gol Dragon",
+ "Sinow Spigell",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Rag Rappy",
+ "Love Rappy",
+ "Gi Gue",
+ "Dubchic",
+ "Gillchic",
+ "Garanz",
+ "Gal Gryphon",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Epsilon",
+ "Epsigard",
+ "Del Lily",
+ "Ill Gill",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Olga Flow Phase 1",
+ "Olga Flow Phase 2",
+ "Gael",
+ "Giel",
+ "INVALID",
+ "Deldepth",
+ "Pan Arms",
+ "Hidoom",
+ "Migium",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Mericarol",
+ "Ul Gibbon",
+ "Zol Gibbon",
+ "Gibbles",
+ "INVALID",
+ "INVALID",
+ "Morfos",
+ "Recobox",
+ "Recon",
+ "Sinow Zoa",
+ "Sinow Zele",
+ "Merikle ",
+ "Mericus",
+ "INVALID",
+ "Hildebear",
+ "Hildeblue",
+ "Merillia",
+ "Meriltas",
+ "UNKNOWN",
+ "Grass Assassin",
+ "Dolmolm",
+ "Dolmdarl",
+ "UNKNOWN",
+ "Delsaber",
+ "Dimenian",
+ "La Dimenian",
+ "So Dimenian",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly()
+ };
+
+ private readonly IList[] ep4Names = {
+ new List { // Physical
+ "Boota (Crater)",
+ "Ze Boota (Crater)",
+ "INVALID",
+ "Ba Boota (Crater)",
+ "INVALID",
+ "Sand Rappy (Crater)",
+ "Del Rappy (Crater)",
+ "Zu (Crater)",
+ "Pazuzu (Crater)",
+ "Astark (Crater)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Satellite Lizard (Crater)",
+ "Yowie (Crater)",
+ "Dorphon (Crater)",
+ "Dorphon Éclair (Crater)",
+ "Goran (Desert)",
+ "Pyro Goran (Desert)",
+ "Goran Detonator (Desert)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Sand Rappy (Desert)",
+ "Del Rappy (Desert)",
+ "Merissa A (Desert)",
+ "Merissa AA (Desert)",
+ "Zu (Desert)",
+ "Pazuzu (Desert)",
+ "Satellite Lizard (Desert)",
+ "Yowie (Desert)",
+ "Girtablulu (Desert)",
+ "Saint-Million (Part 1)",
+ "Spinning thing",
+ "Saint-Million (Part 2)",
+ "Spinning thing",
+ "Shambertin (Part 1)",
+ "Spinning thing",
+ "Shambertin (Part 2)",
+ "Spinning thing",
+ "Kondrieu (Part 1)",
+ "Spinning thing",
+ "Kondrieu (Part 2)",
+ "Spinning thing",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly(),
+ new List { // Resist
+ "Boota (Crater)",
+ "Ze Boota (Crater)",
+ "INVALID",
+ "Ba Boota (Crater)",
+ "INVALID",
+ "Sand Rappy (Crater)",
+ "Del Rappy (Crater)",
+ "Zu (Crater)",
+ "Pazuzu (Crater)",
+ "Astark (Crater)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Satellite Lizard (Crater)",
+ "Yowie (Crater)",
+ "Dorphon (Crater)",
+ "Dorphon Éclair (Crater)",
+ "Goran (Desert)",
+ "Pyro Goran (Desert)",
+ "Goran Detonator (Desert)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Sand Rappy (Desert)",
+ "Del Rappy (Desert)",
+ "Merissa A (Desert)",
+ "Merissa AA (Desert)",
+ "Zu (Desert)",
+ "Pazuzu (Desert)",
+ "Satellite Lizard (Desert)",
+ "Yowie (Desert)",
+ "Girtablulu (Desert)",
+ "Saint-Million (Part 1)",
+ "Spinning thing",
+ "Saint-Million (Part 2)",
+ "Spinning thing",
+ "Shambertin (Part 1)",
+ "Spinning thing",
+ "Shambertin (Part 2)",
+ "Spinning thing",
+ "Kondrieu (Part 1)",
+ "Spinning thing",
+ "Kondrieu (Part 2)",
+ "Spinning thing",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly(),
+ new List { // Attack
+ "Boota 1",
+ "Boota 2",
+ "Boota 3",
+ "Ze Boota 1",
+ "Ze Boota 2",
+ "Sand Rappy (Crater)",
+ "Del Rappy (Crater)",
+ "Zu (Crater)",
+ "Pazuzu (Crater)",
+ "Astark (Crater)",
+ "Astark Punch",
+ "Astark Poison",
+ "Astark Jump",
+ "Satellite Lizard (Crater)",
+ "Yowie (Crater)",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "UNKNOWN",
+ "Goran (Desert)",
+ "Pyro Goran (Desert)",
+ "Goran Detonator (Desert)",
+ "Sand Rappy (Desert)",
+ "Del Rappy (Desert)",
+ "Merissa A (Desert)",
+ "Merissa AA (Desert)",
+ "Zu (Desert)",
+ "Pazuzu (Desert)",
+ "Satellite Lizard (Desert)",
+ "Yowie (Desert)",
+ "Girtablulu (Desert)",
+ "Saint-Million 1",
+ "Saint-Million 2",
+ "Saint-Million 3",
+ "Saint-Million 4",
+ "Shambertin 1",
+ "Shambertin 2",
+ "Shambertin 3",
+ "Shambertin 4",
+ "Kondrieu 1",
+ "Kondrieu 2",
+ "Kondrieu 3",
+ "Kondrieu 4",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly(),
+ new List { // Movement
+ "Boota (Crater)",
+ "Ze Boota (Crater)",
+ "INVALID",
+ "Ba Boota (Crater)",
+ "INVALID",
+ "Sand Rappy (Crater)",
+ "Del Rappy (Crater)",
+ "Zu (Crater)",
+ "Pazuzu (Crater)",
+ "Astark (Crater)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Satellite Lizard (Crater)",
+ "Yowie (Crater)",
+ "Dorphon (Crater)",
+ "Dorphon Éclair (Crater)",
+ "Goran (Desert)",
+ "Pyro Goran (Desert)",
+ "Goran Detonator (Desert)",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "Sand Rappy (Desert)",
+ "Del Rappy (Desert)",
+ "Merissa A (Desert)",
+ "Merissa AA (Desert)",
+ "Zu (Desert)",
+ "Pazuzu (Desert)",
+ "Satellite Lizard (Desert)",
+ "Yowie (Desert)",
+ "Girtablulu (Desert)",
+ "Saint-Million 1",
+ "Saint-Million 2",
+ "Saint-Million 3",
+ "Saint-Million 4",
+ "Shambertin 1",
+ "Shambertin 2",
+ "Shambertin 3",
+ "Shambertin 4",
+ "Kondrieu 1",
+ "Kondrieu 2",
+ "Kondrieu 3",
+ "Kondrieu 4",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID",
+ "INVALID"
+ }.AsReadOnly()
+ };
+
+ #endregion
+ #region Load Data
+ public DataSet LoadParamData(string fileName)
+ {
+ ParamData paramData = new ParamData();
+ dsParamData = paramData.CreateDataStructure();
+
+
+ using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
+ {
+ // Get Difficulty Table Count
+ BinaryReader reader = new BinaryReader(stream);
+ uint difficultyTableCount = Convert.ToUInt32(stream.Length / 15744);
+#if (PUBLICRELEASE)
+ if(difficultyTableCount != 4)
+ {
+ return null;
+ }
+#endif
+ // Set Constants Table
+ DataTable dtConstants = paramData.CreateConstants();
+ dtConstants.Rows.Add(new object[] { "DifficultyCount", difficultyTableCount, null, null });
+ dsParamData.Tables.Add(dtConstants);
+
+ // Load Table Pointers
+ DataTable dtTablePointers = paramData.CreatePointerStructure();
+ dtTablePointers.Rows.Add(new object[] { "Physical", 0 });
+ dtTablePointers.Rows.Add(new object[] { "Attack", (3456 * difficultyTableCount) });
+ dtTablePointers.Rows.Add(new object[] { "Resist", ((3456 + 4608) * difficultyTableCount) });
+ dtTablePointers.Rows.Add(new object[] { "Movement", ((3456 + 3072 + 4608) * difficultyTableCount) });
+ dsParamData.Tables.Add(dtTablePointers);
+ }
+
+ using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
+ {
+ int size = (int)stream.Length;
+ byte[] data = new byte[size];
+ stream.Read(data, 0, size);
+
+ PopulateTable(data, "Physical", physicalSizes, size);
+ PopulateTable(data, "Attack", attackSizes, size);
+ PopulateTable(data, "Resist", resistSizes, size);
+ PopulateTable(data, "Movement", movementSizes, size);
+ }
+
+ SetFields("Attack");
+
+ return dsParamData;
+ }
+ #endregion
+ #region Save Data
+ public void SaveParamData(string fileName, DataSet dsSourceData)
+ {
+ using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
+ {
+ try
+ {
+ BinaryWriter writer = new BinaryWriter(stream);
+
+ foreach (string tableName in paramTables)
+ {
+ List fieldSizes = GetFieldSizesForTable(tableName);
+ int startCol = dsSourceData.Tables[tableName].Columns.Count - fieldSizes.Count;
+ int fieldSizePosition;
+ foreach (DataRow drAmendedData in dsSourceData.Tables[tableName].Rows)
+ {
+ fieldSizePosition = 0;
+ byte[] byteValue = null;
+
+ /*if(tableName == "Attack")
+ {
+ drAmendedData["Angle X"] = Convert.ToUInt32(Convert.ToSingle(drAmendedData["Angle X"]) * 182.0416666666667).ToString();
+ }*/
+
+ for (int colPos = startCol; colPos < dsSourceData.Tables[tableName].Columns.Count; colPos++)
+ {
+ // Write Single data types to file
+ if (dsSourceData.Tables[tableName].Columns[colPos].DataType == typeof(System.Single))
+ {
+ byteValue = BitConverter.GetBytes(Convert.ToSingle(drAmendedData[colPos]));
+ for (int i = 0; i < Convert.ToInt16(fieldSizes[fieldSizePosition]); i++)
+ {
+ stream.WriteByte(byteValue[i]);
+ }
+ }
+ // Write any other data types to file
+ else
+ {
+ byteValue = BitConverter.GetBytes(Convert.ToUInt32(drAmendedData[colPos]));
+ for (int i = 0; i < Convert.ToInt16(fieldSizes[fieldSizePosition]); i++)
+ {
+ stream.WriteByte(byteValue[i]);
+ }
+ }
+ fieldSizePosition++;
+ }
+ }
+ }
+ }
+ finally
+ {
+ stream.Close();
+ }
+ }
+ }
+ #endregion
+ #region Data Processing
+ private void PopulateTable(byte[] data, string TableName, List fieldSizes, int size)
+ {
+ TableLocation tableLocation = LookupTableLocation(TableName, size);
+ DataTable dtTable = dsParamData.Tables[TableName];
+ int startColumn = dtTable.Columns.Count - fieldSizes.Count;
+ int dataLength = 0;
+
+ //Calculate the total number of bytes for the data to populate the DataTable with
+ for (int i = 0; i < fieldSizes.Count; i++)
+ {
+ dataLength += Convert.ToInt32(fieldSizes[i]);
+ }
+
+ for (int j = tableLocation.startPosition; j < tableLocation.endPosition; j++)
+ {
+ DataRow newRow = dtTable.NewRow();
+ int fieldPos = 0;
+ newRow["Offset"] = j;
+ for (int k = 0; k < fieldSizes.Count; k++)
+ {
+ newRow[k + startColumn] = GetValue(data, j + fieldPos, Convert.ToInt32(fieldSizes[k]), dtTable.Columns[k + startColumn].DataType);
+ fieldPos += Convert.ToInt32(fieldSizes[k]);
+ }
+ j += (dataLength - 1);
+ dtTable.Rows.Add(newRow);
+ }
+ SetAdditionalColumns(TableName);
+ }
+
+ public void AddTable(string TableName, List fieldSizes)
+ {
+ DataTable dtTable = dsParamData.Tables[TableName];
+ int startColumn = dtTable.Columns.Count - fieldSizes.Count;
+ int dataLength = 0;
+
+ //Calculate the total number of bytes for the data to populate the DataTable with
+ for (int i = 0; i < fieldSizes.Count; i++)
+ {
+ dataLength += Convert.ToInt32(fieldSizes[i]);
+ }
+
+ for (int j = 0; j < 96; j++)
+ {
+ DataRow newRow = dtTable.NewRow();
+ newRow["Offset"] = 0;
+ for (int k = 0; k < fieldSizes.Count; k++)
+ {
+ newRow[k + startColumn] = GetDefaultValue(Convert.ToInt32(fieldSizes[k]), dtTable.Columns[k + startColumn].DataType);
+ }
+ dtTable.Rows.Add(newRow);
+ }
+ SetAdditionalColumns(TableName);
+ }
+
+ private TableLocation LookupTableLocation(string TableName, int size)
+ {
+ TableLocation tableLocation = new TableLocation();
+ DataRow[] drMatchingStartRows;
+ DataRow[] drMatchingEndRows;
+ string endTableName = "";
+
+ drMatchingStartRows = dsParamData.Tables["Pointers"].Select("[Table name] = '" + TableName + "'");
+ if (drMatchingStartRows.Length > 0)
+ tableLocation.startPosition = Convert.ToInt32(drMatchingStartRows[0]["Table address"]);
+ else tableLocation.startPosition = 0;
+
+ if (TableName == "Physical")
+ endTableName = "Attack";
+ else if (TableName == "Attack")
+ endTableName = "Resist";
+ else if (TableName == "Resist")
+ endTableName = "Movement";
+ else if (TableName == "Movement")
+ endTableName = "";
+
+ if (endTableName == "") tableLocation.endPosition = size;
+ else
+ {
+ drMatchingEndRows = dsParamData.Tables["Pointers"].Select("[Table name] = '" + endTableName + "'");
+ if (drMatchingStartRows.Length > 0)
+ tableLocation.endPosition = Convert.ToInt32(drMatchingEndRows[0]["Table address"]);
+ else tableLocation.endPosition = 0;
+ }
+ return tableLocation;
+ }
+
+ private List GetFieldSizesForTable(string tableName)
+ {
+ List fieldSizes = new List();
+
+ switch (tableName)
+ {
+ case "Physical":
+ fieldSizes = physicalSizes;
+ break;
+ case "Attack":
+ fieldSizes = attackSizes;
+ break;
+ case "Resist":
+ fieldSizes = resistSizes;
+ break;
+ case "Movement":
+ fieldSizes = movementSizes;
+ break;
+ }
+ return fieldSizes;
+ }
+
+ private object GetValue(byte[] data, int offset, int length, System.Type dataType)
+ {
+ object rv = null;
+
+ switch (length)
+ {
+ case 1:
+ if (dataType == typeof(System.SByte))
+ {
+ rv = (sbyte)data[offset];
+ }
+ else
+ rv = data[offset];
+ break;
+ case 2:
+ if (dataType == typeof(System.String))
+ {
+ byte bit1 = data[offset];
+ byte bit2 = data[offset + 1];
+ rv = string.Format("{0:X2}", bit1) + string.Format("{0:X2}", bit2);
+ }
+ else if (dataType == typeof(System.UInt16))
+ rv = BitConverter.ToUInt16(data, offset);
+ else
+ rv = BitConverter.ToInt16(data, offset);
+ break;
+ case 3:
+ if (dataType == typeof(System.String))
+ {
+ byte bit1 = data[offset];
+ byte bit2 = data[offset + 1];
+ byte bit3 = data[offset + 2];
+ rv = string.Format("{0:X2}", bit1) + string.Format("{0:X2}", bit2) + string.Format("{0:X2}", bit3);
+ }
+ else
+ rv = ConvertBytesToInt32(data, offset, 3);
+ break;
+ case 4:
+ if (dataType == typeof(System.Int32))
+ rv = BitConverter.ToInt32(data, offset);
+ else if (dataType == typeof(System.UInt32))
+ rv = BitConverter.ToUInt32(data, offset);
+ else if (dataType == typeof(System.Single))
+ {
+ if (dataType == typeof(System.Single)) rv = BitConverter.ToSingle(data, offset);
+ }
+ else if (dataType == typeof(System.String))
+ {
+ byte bit1 = data[offset];
+ byte bit2 = data[offset + 1];
+ byte bit3 = data[offset + 2];
+ byte bit4 = data[offset + 3];
+ rv = string.Format("{0:X2}", bit1) + string.Format("{0:X2}", bit2) + string.Format("{0:X2}", bit3) + string.Format("{0:X2}", bit4);
+ }
+ break;
+ }
+ return rv;
+ }
+
+ private object GetDefaultValue(int length, System.Type dataType)
+ {
+ object rv = null;
+
+ switch (length)
+ {
+ case 1:
+ if (dataType == typeof(System.SByte))
+ {
+ rv = (sbyte)0;
+ }
+ else
+ rv = 0;
+ break;
+ case 2:
+ if (dataType == typeof(System.String))
+ {
+ byte bit1 = 0;
+ byte bit2 = 0;
+ rv = string.Format("{0:X2}", bit1) + string.Format("{0:X2}", bit2);
+ }
+ else if (dataType == typeof(System.UInt16))
+ rv = Convert.ToUInt16(0);
+ else
+ rv = Convert.ToInt16(0);
+ break;
+ case 3:
+ if (dataType == typeof(System.String))
+ {
+ byte bit1 = 0;
+ byte bit2 = 0;
+ byte bit3 = 0;
+ rv = string.Format("{0:X2}", bit1) + string.Format("{0:X2}", bit2) + string.Format("{0:X2}", bit3);
+ }
+ else
+ rv = Convert.ToInt32(0);
+ break;
+ case 4:
+ if (dataType == typeof(System.Int32))
+ rv = Convert.ToInt32(0);
+ else if (dataType == typeof(System.UInt32))
+ rv = Convert.ToUInt32(0);
+ else if (dataType == typeof(System.Single))
+ {
+ if (dataType == typeof(System.Single)) rv = Convert.ToSingle(0);
+ }
+ else if (dataType == typeof(System.String))
+ {
+ byte bit1 = 0;
+ byte bit2 = 0;
+ byte bit3 = 0;
+ byte bit4 = 0;
+ rv = string.Format("{0:X2}", bit1) + string.Format("{0:X2}", bit2) + string.Format("{0:X2}", bit3) + string.Format("{0:X2}", bit4);
+ }
+ break;
+ }
+ return rv;
+ }
+
+ private Int32 ConvertBytesToInt32(byte[] data, int offset, int length)
+ {
+ byte[] fieldValue = new byte[length];
+ StringBuilder hexValue = new StringBuilder();
+
+ for (int i = 0; i < length; i++)
+ {
+ fieldValue[i] = data[offset + i];
+ }
+
+ for (int j = length - 1; j >= 0; j--)
+ {
+ hexValue.Append(string.Format("{0:X2}", fieldValue[j]));
+ }
+ return Convert.ToInt32(hexValue.ToString(), 16);
+ }
+
+ public void SetAdditionalColumns(string tableName)
+ {
+ int index = 0;
+ int difficulty = 0;
+ int tableType = 0;
+ if (tableName == "Physical") tableType = 0;
+ else if (tableName == "Resist") tableType = 1;
+ else if (tableName == "Attack") tableType = 2;
+ else if (tableName == "Movement") tableType = 3;
+ else return;
+ foreach (DataRow dr in dsParamData.Tables[tableName].Rows)
+ {
+ if (index >= 96) { index = 0; difficulty++; }
+ if (episode == 0) dr["Enemy Name"] = ep1Names[tableType][index];
+ else if (episode == 1) dr["Enemy Name"] = ep2Names[tableType][index];
+ else if (episode == 2) dr["Enemy Name"] = ep4Names[tableType][index];
+ dr["Difficulty"] = difficulty;
+ dr.EndEdit();
+ index++;
+ }
+ }
+ public void SetEpisode(int ep)
+ {
+ episode = ep;
+ }
+
+ private void SetFields(string TableName)
+ {
+ DataTable dtTable = dsParamData.Tables[TableName];
+ if(TableName == "Attack")
+ {
+ foreach (DataRow dr in dtTable.Rows)
+ {
+ dr["Angle X "] = Convert.ToSingle(dr["Angle X"]) / 182.0416666666667;
+ }
+ }
+ }
+
+ public bool CopyTable(string from, string to, IList strList)
+ {
+ try
+ {
+ int _from = strList.IndexOf(from);
+ int _to = strList.IndexOf(to);
+
+ for(int i = 0; i < paramTables.Count; i++)
+ {
+ DataRow[] drMatchingFromRows = dsParamData.Tables[paramTables[i]].Select("[Difficulty] = '" + _from + "'");
+ DataRow[] drMatchingToRows = dsParamData.Tables[paramTables[i]].Select("[Difficulty] = '" + _to + "'");
+
+ if (drMatchingFromRows.Length != 96 || drMatchingToRows.Length != 96)
+ return false;
+ else
+ {
+ for(int j = 0; j < 96; j++)
+ {
+ for (int k = 3; k < dsParamData.Tables[paramTables[i]].Columns.Count; k++)
+ {
+ drMatchingToRows[j][k] = drMatchingFromRows[j][k];
+ }
+ }
+ }
+ }
+ }
+ catch(Exception ex)
+ {
+ MessageBox.Show("Error copying table data: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ return true;
+ }
+ #endregion
+ }
+}
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..c18f5ca
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Battle_Param_Editor
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Form1());
+ }
+ }
+}
diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..8e0f557
--- /dev/null
+++ b/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Battle Param Editor")]
+[assembly: AssemblyDescription("Battle Param Editor for PSOBB")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Tofuman - Pioneer2.net")]
+[assembly: AssemblyProduct("Battle Param Editor")]
+[assembly: AssemblyCopyright("Copyright © 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("fa44c035-6e30-4fe7-9071-0b15f00c5f14")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..a5bb223
--- /dev/null
+++ b/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.34209
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Battle_Param_Editor.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Battle_Param_Editor.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Properties/Resources.resx b/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..ce244d0
--- /dev/null
+++ b/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.34209
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Battle_Param_Editor.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Properties/Settings.settings b/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..7063976
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+# Phantasy Star Online Battle Param Editor
+An editor I created years ago to edit the battle parameter files for phantasy star online. Closed source but is now open.
+
+Works with:
+ - PSOBB
+ - Gamecube
+ - Xbox