From ef1790b8a3e311ec8c773bcb566f3b51c09adfc5 Mon Sep 17 00:00:00 2001 From: Tofuman Date: Sat, 29 Oct 2022 16:24:41 +0100 Subject: [PATCH] Add project files. --- .nuget/packages.config | 4 + About.Designer.cs | 190 ++++ About.cs | 105 ++ About.resx | 603 +++++++++++ App.config | 6 + BPE_Icon.ico | Bin 0 -> 4286 bytes Battle Param Editor.csproj | 162 +++ Battle Param Editor.sln | 25 + DataModifier.Designer.cs | 108 ++ DataModifier.cs | 35 + DataModifier.resx | 120 +++ Form1.Designer.cs | 322 ++++++ Form1.cs | 588 +++++++++++ Form1.resx | 209 ++++ ParamData.cs | 143 +++ ParamDataManager.cs | 1645 ++++++++++++++++++++++++++++++ Program.cs | 22 + Properties/AssemblyInfo.cs | 36 + Properties/Resources.Designer.cs | 71 ++ Properties/Resources.resx | 117 +++ Properties/Settings.Designer.cs | 30 + Properties/Settings.settings | 7 + README.md | 7 + 23 files changed, 4555 insertions(+) create mode 100644 .nuget/packages.config create mode 100644 About.Designer.cs create mode 100644 About.cs create mode 100644 About.resx create mode 100644 App.config create mode 100644 BPE_Icon.ico create mode 100644 Battle Param Editor.csproj create mode 100644 Battle Param Editor.sln create mode 100644 DataModifier.Designer.cs create mode 100644 DataModifier.cs create mode 100644 DataModifier.resx create mode 100644 Form1.Designer.cs create mode 100644 Form1.cs create mode 100644 Form1.resx create mode 100644 ParamData.cs create mode 100644 ParamDataManager.cs create mode 100644 Program.cs create mode 100644 Properties/AssemblyInfo.cs create mode 100644 Properties/Resources.Designer.cs create mode 100644 Properties/Resources.resx create mode 100644 Properties/Settings.Designer.cs create mode 100644 Properties/Settings.settings create mode 100644 README.md 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 0000000000000000000000000000000000000000..738646c842625d5a3ab3fa1cc7519cca226b4a8e GIT binary patch literal 4286 zcmdUzzmC&D5XKh~2^SP85K8He^mzfAh@jI+iI9F(O%#yCY%jhy<1_ICkc>ad8s6S!~Ha zM}Il}remS`eC~$B;X(M(ENY9rxBp=3SGo;j$?AO+@=Lem@ z^OLK@p?!zE;@BCV*@xm!PA1;>`_3N>25ujvbL``fHr9B0E{g+V0ZraeYyxVhLcWv= z9@9NF=NDl5!$qP{L>5VJG{~HFARN1OM6YI(&=`U3|K5qnD#hl3m8P3(56fXmnJMek zzLo!Ve}B{b$+7CTk&g*%S8)2S`~K08k6cXDNboi08Sg-~-a~5Ifw93LE~Et?F@Oyb p$)?x&zUDRWV~h=kWYfVR%O5IMsYgGQdiat4Rq#IqmL(?Ge*u#5F$e$v literal 0 HcmV?d00001 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