From bf34bcaaae58739d885cb60ba3b607947a608a0e Mon Sep 17 00:00:00 2001 From: Leathl Date: Fri, 4 Dec 2009 00:10:46 +0000 Subject: [PATCH] Added TransmitMii 1.0 --- CustomizeMii/CustomizeMii.csproj | 154 - CustomizeMii/CustomizeMii.csproj.user | 17 - .../CustomizeMii_InputBox.Designer.cs | 119 - CustomizeMii/CustomizeMii_InputBox.cs | 64 - CustomizeMii/CustomizeMii_Main.Designer.cs | 1366 ---- CustomizeMii/CustomizeMii_Main.cs | 3070 --------- CustomizeMii/CustomizeMii_Main.resx | 134 - CustomizeMii/CustomizeMii_Preview.Designer.cs | 83 - CustomizeMii/CustomizeMii_Preview.cs | 40 - CustomizeMii/Instructions.txt | 125 - CustomizeMii/Properties/Resources.resx | 127 - CustomizeMii/Properties/Settings.Designer.cs | 47 - CustomizeMii/Properties/Settings.settings | 7 - CustomizeMii/Resources/CustomizeMii.ico | Bin 88878 -> 0 bytes CustomizeMii/Resources/Instructions.rtf | Bin 7947 -> 0 bytes CustomizeMii/Resources/Waninkoko.app | Bin 384224 -> 0 bytes CustomizeMii/Resources/comex.app | Bin 138752 -> 0 bytes CustomizeMii/Wii.cs | 5493 ----------------- CustomizeMii.sln => TransmitMii.sln | 10 +- TransmitMii.suo | Bin 0 -> 22528 bytes {CustomizeMii => TransmitMii}/License.txt | 0 {CustomizeMii => TransmitMii}/Program.cs | 16 +- .../Properties/AssemblyInfo.cs | 20 +- .../Properties/Resources.Designer.cs | 24 +- .../Properties/Resources.resx | 6 +- TransmitMii/Properties/Settings.Designer.cs | 67 + TransmitMii/Properties/Settings.settings | 12 + {CustomizeMii => TransmitMii}/Readme.txt | 41 +- TransmitMii/Resources/TransmitMii Icon.ico | Bin 0 -> 88878 bytes TransmitMii/TransmitMii.csproj | 90 + TransmitMii/TransmitMii.csproj.user | 1 + TransmitMii/TransmitMii_Main.Designer.cs | 189 + TransmitMii/TransmitMii_Main.cs | 361 ++ .../TransmitMii_Main.resx | 0 TransmitMii/app.config | 18 + 35 files changed, 781 insertions(+), 10920 deletions(-) delete mode 100644 CustomizeMii/CustomizeMii.csproj delete mode 100644 CustomizeMii/CustomizeMii.csproj.user delete mode 100644 CustomizeMii/CustomizeMii_InputBox.Designer.cs delete mode 100644 CustomizeMii/CustomizeMii_InputBox.cs delete mode 100644 CustomizeMii/CustomizeMii_Main.Designer.cs delete mode 100644 CustomizeMii/CustomizeMii_Main.cs delete mode 100644 CustomizeMii/CustomizeMii_Main.resx delete mode 100644 CustomizeMii/CustomizeMii_Preview.Designer.cs delete mode 100644 CustomizeMii/CustomizeMii_Preview.cs delete mode 100644 CustomizeMii/Instructions.txt delete mode 100644 CustomizeMii/Properties/Resources.resx delete mode 100644 CustomizeMii/Properties/Settings.Designer.cs delete mode 100644 CustomizeMii/Properties/Settings.settings delete mode 100644 CustomizeMii/Resources/CustomizeMii.ico delete mode 100644 CustomizeMii/Resources/Instructions.rtf delete mode 100644 CustomizeMii/Resources/Waninkoko.app delete mode 100644 CustomizeMii/Resources/comex.app delete mode 100644 CustomizeMii/Wii.cs rename CustomizeMii.sln => TransmitMii.sln (54%) create mode 100644 TransmitMii.suo rename {CustomizeMii => TransmitMii}/License.txt (100%) rename {CustomizeMii => TransmitMii}/Program.cs (67%) rename {CustomizeMii => TransmitMii}/Properties/AssemblyInfo.cs (74%) rename {CustomizeMii => TransmitMii}/Properties/Resources.Designer.cs (69%) rename CustomizeMii/CustomizeMii_Preview.resx => TransmitMii/Properties/Resources.resx (90%) create mode 100644 TransmitMii/Properties/Settings.Designer.cs create mode 100644 TransmitMii/Properties/Settings.settings rename {CustomizeMii => TransmitMii}/Readme.txt (50%) create mode 100644 TransmitMii/Resources/TransmitMii Icon.ico create mode 100644 TransmitMii/TransmitMii.csproj create mode 100644 TransmitMii/TransmitMii.csproj.user create mode 100644 TransmitMii/TransmitMii_Main.Designer.cs create mode 100644 TransmitMii/TransmitMii_Main.cs rename CustomizeMii/CustomizeMii_InputBox.resx => TransmitMii/TransmitMii_Main.resx (100%) create mode 100644 TransmitMii/app.config diff --git a/CustomizeMii/CustomizeMii.csproj b/CustomizeMii/CustomizeMii.csproj deleted file mode 100644 index f7ee603..0000000 --- a/CustomizeMii/CustomizeMii.csproj +++ /dev/null @@ -1,154 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {46B7F0BC-101B-4167-95AD-4C5D78AA0A20} - WinExe - Properties - CustomizeMii - CustomizeMii - v2.0 - 512 - - - Resources\CustomizeMii.ico - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.1.0.%2a - false - false - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - Form - - - CustomizeMii_Main.cs - - - Form - - - CustomizeMii_Preview.cs - - - Form - - - CustomizeMii_InputBox.cs - - - - - CustomizeMii_InputBox.cs - - - CustomizeMii_Main.cs - - - CustomizeMii_Preview.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - True - Settings.settings - True - - - - - - - - - - - - - False - .NET Framework Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - false - - - - - \ No newline at end of file diff --git a/CustomizeMii/CustomizeMii.csproj.user b/CustomizeMii/CustomizeMii.csproj.user deleted file mode 100644 index 3258829..0000000 --- a/CustomizeMii/CustomizeMii.csproj.user +++ /dev/null @@ -1,17 +0,0 @@ - - - publish\ - - - - - - - - - - - de-DE - false - - \ No newline at end of file diff --git a/CustomizeMii/CustomizeMii_InputBox.Designer.cs b/CustomizeMii/CustomizeMii_InputBox.Designer.cs deleted file mode 100644 index 6711986..0000000 --- a/CustomizeMii/CustomizeMii_InputBox.Designer.cs +++ /dev/null @@ -1,119 +0,0 @@ -/* This file is part of CustomizeMii - * Copyright (C) 2009 Leathl - * - * CustomizeMii is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * CustomizeMii is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace CustomizeMii -{ - partial class CustomizeMii_InputBox - { - /// - /// Erforderliche Designervariable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Verwendete Ressourcen bereinigen. - /// - /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Vom Windows Form-Designer generierter Code - - /// - /// Erforderliche Methode für die Designerunterstützung. - /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. - /// - private void InitializeComponent() - { - this.tbInput = new System.Windows.Forms.TextBox(); - this.lbInfo = new System.Windows.Forms.Label(); - this.btnOK = new System.Windows.Forms.Button(); - this.btnExit = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // tbInput - // - this.tbInput.Location = new System.Drawing.Point(7, 34); - this.tbInput.MaxLength = 3; - this.tbInput.Name = "tbInput"; - this.tbInput.Size = new System.Drawing.Size(222, 20); - this.tbInput.TabIndex = 0; - // - // lbInfo - // - this.lbInfo.AutoSize = true; - this.lbInfo.Location = new System.Drawing.Point(4, 9); - this.lbInfo.Name = "lbInfo"; - this.lbInfo.Size = new System.Drawing.Size(225, 13); - this.lbInfo.TabIndex = 1; - this.lbInfo.Text = "Please enter \"45e\" to create the Common-Key"; - // - // btnOK - // - this.btnOK.Location = new System.Drawing.Point(7, 62); - this.btnOK.Name = "btnOK"; - this.btnOK.Size = new System.Drawing.Size(108, 23); - this.btnOK.TabIndex = 2; - this.btnOK.Text = "OK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // btnExit - // - this.btnExit.Location = new System.Drawing.Point(121, 62); - this.btnExit.Name = "btnExit"; - this.btnExit.Size = new System.Drawing.Size(108, 23); - this.btnExit.TabIndex = 3; - this.btnExit.Text = "Exit"; - this.btnExit.UseVisualStyleBackColor = true; - this.btnExit.Click += new System.EventHandler(this.btnExit_Click); - // - // CustomizeMii_InputBox - // - this.AcceptButton = this.btnOK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnExit; - this.ClientSize = new System.Drawing.Size(238, 92); - this.Controls.Add(this.btnExit); - this.Controls.Add(this.btnOK); - this.Controls.Add(this.lbInfo); - this.Controls.Add(this.tbInput); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; - this.Name = "CustomizeMii_InputBox"; - this.ShowInTaskbar = false; - this.Text = "InputBox"; - this.Load += new System.EventHandler(this.CustomizeMii_InputBox_Load); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox tbInput; - private System.Windows.Forms.Label lbInfo; - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.Button btnExit; - } -} \ No newline at end of file diff --git a/CustomizeMii/CustomizeMii_InputBox.cs b/CustomizeMii/CustomizeMii_InputBox.cs deleted file mode 100644 index 337ba6a..0000000 --- a/CustomizeMii/CustomizeMii_InputBox.cs +++ /dev/null @@ -1,64 +0,0 @@ -/* This file is part of CustomizeMii - * Copyright (C) 2009 Leathl - * - * CustomizeMii is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * CustomizeMii is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace CustomizeMii -{ - public partial class CustomizeMii_InputBox : Form - { - public string Input - { - get { return tbInput.Text; } - } - - public CustomizeMii_InputBox() - { - InitializeComponent(); - } - - private void CustomizeMii_InputBox_Load(object sender, EventArgs e) - { - this.CenterToScreen(); - } - - private void btnExit_Click(object sender, EventArgs e) - { - Application.Exit(); - } - - private void btnOK_Click(object sender, EventArgs e) - { - if (tbInput.Text == "45e") - { - this.DialogResult = DialogResult.OK; - this.Close(); - } - else - { - tbInput.Focus(); - tbInput.SelectAll(); - } - } - } -} diff --git a/CustomizeMii/CustomizeMii_Main.Designer.cs b/CustomizeMii/CustomizeMii_Main.Designer.cs deleted file mode 100644 index d37be45..0000000 --- a/CustomizeMii/CustomizeMii_Main.Designer.cs +++ /dev/null @@ -1,1366 +0,0 @@ -/* This file is part of CustomizeMii - * Copyright (C) 2009 Leathl - * - * CustomizeMii is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * CustomizeMii is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace CustomizeMii -{ - partial class CustomizeMii_Main - { - /// - /// Erforderliche Designervariable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Verwendete Ressourcen bereinigen. - /// - /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Vom Windows Form-Designer generierter Code - - /// - /// Erforderliche Methode für die Designerunterstützung. - /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CustomizeMii_Main)); - this.btnCreateWad = new System.Windows.Forms.Button(); - this.tabControl = new System.Windows.Forms.TabControl(); - this.tabSource = new System.Windows.Forms.TabPage(); - this.tbReplace = new System.Windows.Forms.TextBox(); - this.btnBrowseReplace = new System.Windows.Forms.Button(); - this.btnClearReplace = new System.Windows.Forms.Button(); - this.cmbReplace = new System.Windows.Forms.ComboBox(); - this.btnSaveBaseWad = new System.Windows.Forms.Button(); - this.btnPreviewBaseWad = new System.Windows.Forms.Button(); - this.btnLoadBaseWad = new System.Windows.Forms.Button(); - this.lbxBaseWads = new System.Windows.Forms.ListBox(); - this.btnBrowseSource = new System.Windows.Forms.Button(); - this.tbSourceWad = new System.Windows.Forms.TextBox(); - this.lbSource = new System.Windows.Forms.Label(); - this.tabTitle = new System.Windows.Forms.TabPage(); - this.tbItalian = new System.Windows.Forms.TextBox(); - this.tbFrench = new System.Windows.Forms.TextBox(); - this.tbJapanese = new System.Windows.Forms.TextBox(); - this.tbDutch = new System.Windows.Forms.TextBox(); - this.tbSpanish = new System.Windows.Forms.TextBox(); - this.tbGerman = new System.Windows.Forms.TextBox(); - this.tbEnglish = new System.Windows.Forms.TextBox(); - this.lbDutch = new System.Windows.Forms.Label(); - this.lbItalian = new System.Windows.Forms.Label(); - this.lbSpanish = new System.Windows.Forms.Label(); - this.lbFrench = new System.Windows.Forms.Label(); - this.lbGerman = new System.Windows.Forms.Label(); - this.lbJapanese = new System.Windows.Forms.Label(); - this.lbEnglish = new System.Windows.Forms.Label(); - this.lbSpecificLanguageTitles = new System.Windows.Forms.Label(); - this.tbAllLanguages = new System.Windows.Forms.TextBox(); - this.lbAllLanguages = new System.Windows.Forms.Label(); - this.tabOptions = new System.Windows.Forms.TabPage(); - this.cbLz77 = new System.Windows.Forms.CheckBox(); - this.lbOptionsOptional = new System.Windows.Forms.Label(); - this.btnBrowseSound = new System.Windows.Forms.Button(); - this.tbSound = new System.Windows.Forms.TextBox(); - this.cmbNandLoader = new System.Windows.Forms.ComboBox(); - this.btnBrowseDol = new System.Windows.Forms.Button(); - this.tbDol = new System.Windows.Forms.TextBox(); - this.tbTitleID = new System.Windows.Forms.TextBox(); - this.lbNewSound = new System.Windows.Forms.Label(); - this.lbNandLoader = new System.Windows.Forms.Label(); - this.lbNewDol = new System.Windows.Forms.Label(); - this.lbTitleID = new System.Windows.Forms.Label(); - this.tabBanner = new System.Windows.Forms.TabPage(); - this.cbBannerMakeTransparent = new System.Windows.Forms.CheckBox(); - this.cmbFormatBanner = new System.Windows.Forms.ComboBox(); - this.lbFormatBanner = new System.Windows.Forms.Label(); - this.btnPreviewBanner = new System.Windows.Forms.Button(); - this.btnExtractBanner = new System.Windows.Forms.Button(); - this.btnDeleteBanner = new System.Windows.Forms.Button(); - this.btnAddBanner = new System.Windows.Forms.Button(); - this.btnReplaceBanner = new System.Windows.Forms.Button(); - this.lbxBannerTpls = new System.Windows.Forms.ListBox(); - this.tabIcon = new System.Windows.Forms.TabPage(); - this.cbIconMakeTransparent = new System.Windows.Forms.CheckBox(); - this.cmbFormatIcon = new System.Windows.Forms.ComboBox(); - this.lbFormatIcon = new System.Windows.Forms.Label(); - this.btnPreviewIcon = new System.Windows.Forms.Button(); - this.btnExtractIcon = new System.Windows.Forms.Button(); - this.btnAddIcon = new System.Windows.Forms.Button(); - this.btnDeleteIcon = new System.Windows.Forms.Button(); - this.btnReplaceIcon = new System.Windows.Forms.Button(); - this.lbxIconTpls = new System.Windows.Forms.ListBox(); - this.tabBrlyt = new System.Windows.Forms.TabPage(); - this.btnBrlytListTpls = new System.Windows.Forms.Button(); - this.lbBrlytWarning = new System.Windows.Forms.Label(); - this.lbBrlytActions = new System.Windows.Forms.Label(); - this.btnBrlytExtract = new System.Windows.Forms.Button(); - this.btnBrlytReplace = new System.Windows.Forms.Button(); - this.lbBrlytIcon = new System.Windows.Forms.Label(); - this.lbBrlytBanner = new System.Windows.Forms.Label(); - this.lbxBrlytIcon = new System.Windows.Forms.ListBox(); - this.lbxBrlytBanner = new System.Windows.Forms.ListBox(); - this.tabBrlan = new System.Windows.Forms.TabPage(); - this.lbBrlanWarning = new System.Windows.Forms.Label(); - this.lbBrlanActions = new System.Windows.Forms.Label(); - this.btnBrlanExtract = new System.Windows.Forms.Button(); - this.btnBrlanDelete = new System.Windows.Forms.Button(); - this.btnBrlanReplace = new System.Windows.Forms.Button(); - this.lbBrlanIcon = new System.Windows.Forms.Label(); - this.lbBrlanBanner = new System.Windows.Forms.Label(); - this.btnBrlanAdd = new System.Windows.Forms.Button(); - this.lbxBrlanIcon = new System.Windows.Forms.ListBox(); - this.lbxBrlanBanner = new System.Windows.Forms.ListBox(); - this.tabInstructions = new System.Windows.Forms.TabPage(); - this.rtbInstructions = new System.Windows.Forms.RichTextBox(); - this.tabCredits = new System.Windows.Forms.TabPage(); - this.llbUpdateAvailabe = new System.Windows.Forms.LinkLabel(); - this.llbSite = new System.Windows.Forms.LinkLabel(); - this.lbCreditThanks = new System.Windows.Forms.Label(); - this.lbCreditVersion = new System.Windows.Forms.Label(); - this.lbCreditInfo = new System.Windows.Forms.Label(); - this.ssMain = new System.Windows.Forms.StatusStrip(); - this.lbStatus = new System.Windows.Forms.ToolStripStatusLabel(); - this.lbStatusText = new System.Windows.Forms.ToolStripStatusLabel(); - this.pbProgress = new System.Windows.Forms.ToolStripProgressBar(); - this.tabControl.SuspendLayout(); - this.tabSource.SuspendLayout(); - this.tabTitle.SuspendLayout(); - this.tabOptions.SuspendLayout(); - this.tabBanner.SuspendLayout(); - this.tabIcon.SuspendLayout(); - this.tabBrlyt.SuspendLayout(); - this.tabBrlan.SuspendLayout(); - this.tabInstructions.SuspendLayout(); - this.tabCredits.SuspendLayout(); - this.ssMain.SuspendLayout(); - this.SuspendLayout(); - // - // btnCreateWad - // - this.btnCreateWad.Dock = System.Windows.Forms.DockStyle.Bottom; - this.btnCreateWad.Location = new System.Drawing.Point(0, 235); - this.btnCreateWad.Name = "btnCreateWad"; - this.btnCreateWad.Size = new System.Drawing.Size(451, 33); - this.btnCreateWad.TabIndex = 0; - this.btnCreateWad.Text = "Create WAD"; - this.btnCreateWad.UseVisualStyleBackColor = true; - this.btnCreateWad.Click += new System.EventHandler(this.btnCreateWad_Click); - // - // tabControl - // - this.tabControl.Controls.Add(this.tabSource); - this.tabControl.Controls.Add(this.tabTitle); - this.tabControl.Controls.Add(this.tabOptions); - this.tabControl.Controls.Add(this.tabBanner); - this.tabControl.Controls.Add(this.tabIcon); - this.tabControl.Controls.Add(this.tabBrlyt); - this.tabControl.Controls.Add(this.tabBrlan); - this.tabControl.Controls.Add(this.tabInstructions); - this.tabControl.Controls.Add(this.tabCredits); - this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill; - this.tabControl.Location = new System.Drawing.Point(0, 0); - this.tabControl.Name = "tabControl"; - this.tabControl.SelectedIndex = 0; - this.tabControl.Size = new System.Drawing.Size(451, 235); - this.tabControl.TabIndex = 1; - this.tabControl.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabControl_Selecting); - // - // tabSource - // - this.tabSource.Controls.Add(this.tbReplace); - this.tabSource.Controls.Add(this.btnBrowseReplace); - this.tabSource.Controls.Add(this.btnClearReplace); - this.tabSource.Controls.Add(this.cmbReplace); - this.tabSource.Controls.Add(this.btnSaveBaseWad); - this.tabSource.Controls.Add(this.btnPreviewBaseWad); - this.tabSource.Controls.Add(this.btnLoadBaseWad); - this.tabSource.Controls.Add(this.lbxBaseWads); - this.tabSource.Controls.Add(this.btnBrowseSource); - this.tabSource.Controls.Add(this.tbSourceWad); - this.tabSource.Controls.Add(this.lbSource); - this.tabSource.Location = new System.Drawing.Point(4, 22); - this.tabSource.Name = "tabSource"; - this.tabSource.Padding = new System.Windows.Forms.Padding(3); - this.tabSource.Size = new System.Drawing.Size(443, 209); - this.tabSource.TabIndex = 0; - this.tabSource.Text = "Source"; - this.tabSource.UseVisualStyleBackColor = true; - // - // tbReplace - // - this.tbReplace.Location = new System.Drawing.Point(100, 173); - this.tbReplace.Name = "tbReplace"; - this.tbReplace.ReadOnly = true; - this.tbReplace.Size = new System.Drawing.Size(173, 20); - this.tbReplace.TabIndex = 10; - this.tbReplace.Tag = "Disabled"; - // - // btnBrowseReplace - // - this.btnBrowseReplace.Location = new System.Drawing.Point(279, 172); - this.btnBrowseReplace.Name = "btnBrowseReplace"; - this.btnBrowseReplace.Size = new System.Drawing.Size(75, 23); - this.btnBrowseReplace.TabIndex = 9; - this.btnBrowseReplace.Text = "Browse..."; - this.btnBrowseReplace.UseVisualStyleBackColor = true; - this.btnBrowseReplace.Click += new System.EventHandler(this.btnBrowseReplace_Click); - // - // btnClearReplace - // - this.btnClearReplace.Location = new System.Drawing.Point(360, 172); - this.btnClearReplace.Name = "btnClearReplace"; - this.btnClearReplace.Size = new System.Drawing.Size(75, 23); - this.btnClearReplace.TabIndex = 8; - this.btnClearReplace.Text = "Clear"; - this.btnClearReplace.UseVisualStyleBackColor = true; - this.btnClearReplace.Click += new System.EventHandler(this.btnClearReplace_Click); - // - // cmbReplace - // - this.cmbReplace.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbReplace.FormattingEnabled = true; - this.cmbReplace.Items.AddRange(new object[] { - "Banner", - "Icon", - "Sound"}); - this.cmbReplace.Location = new System.Drawing.Point(11, 172); - this.cmbReplace.Name = "cmbReplace"; - this.cmbReplace.Size = new System.Drawing.Size(83, 21); - this.cmbReplace.TabIndex = 7; - this.cmbReplace.SelectedIndexChanged += new System.EventHandler(this.cmbReplace_SelectedIndexChanged); - // - // btnSaveBaseWad - // - this.btnSaveBaseWad.Location = new System.Drawing.Point(360, 127); - this.btnSaveBaseWad.Name = "btnSaveBaseWad"; - this.btnSaveBaseWad.Size = new System.Drawing.Size(75, 23); - this.btnSaveBaseWad.TabIndex = 6; - this.btnSaveBaseWad.Text = "Save"; - this.btnSaveBaseWad.UseVisualStyleBackColor = true; - this.btnSaveBaseWad.Click += new System.EventHandler(this.btnSaveBaseWad_Click); - // - // btnPreviewBaseWad - // - this.btnPreviewBaseWad.Location = new System.Drawing.Point(360, 93); - this.btnPreviewBaseWad.Name = "btnPreviewBaseWad"; - this.btnPreviewBaseWad.Size = new System.Drawing.Size(75, 23); - this.btnPreviewBaseWad.TabIndex = 5; - this.btnPreviewBaseWad.Text = "Preview"; - this.btnPreviewBaseWad.UseVisualStyleBackColor = true; - this.btnPreviewBaseWad.Click += new System.EventHandler(this.btnPreviewBaseWad_Click); - // - // btnLoadBaseWad - // - this.btnLoadBaseWad.Location = new System.Drawing.Point(360, 59); - this.btnLoadBaseWad.Name = "btnLoadBaseWad"; - this.btnLoadBaseWad.Size = new System.Drawing.Size(75, 23); - this.btnLoadBaseWad.TabIndex = 4; - this.btnLoadBaseWad.Text = "Load"; - this.btnLoadBaseWad.UseVisualStyleBackColor = true; - this.btnLoadBaseWad.Click += new System.EventHandler(this.btnLoadBaseWad_Click); - // - // lbxBaseWads - // - this.lbxBaseWads.FormattingEnabled = true; - this.lbxBaseWads.Items.AddRange(new object[] { - "Static Base", - "Genesis Plus GX", - "MPlayer CE (No Wii)", - "MPlayer CE (With Wii)", - "Snes9xGX", - "FCE Ultra (Wilsoff)", - "FCE Ultra (Leathl)", - "Wii64", - "WiiSX Full", - "WiiSX Retro", - "WADder Base 1", - "WADder Base 2", - "WADder Base 3", - "UniiLoader", - "Backup Channel"}); - this.lbxBaseWads.Location = new System.Drawing.Point(11, 51); - this.lbxBaseWads.Name = "lbxBaseWads"; - this.lbxBaseWads.Size = new System.Drawing.Size(343, 108); - this.lbxBaseWads.TabIndex = 3; - // - // btnBrowseSource - // - this.btnBrowseSource.Location = new System.Drawing.Point(360, 12); - this.btnBrowseSource.Name = "btnBrowseSource"; - this.btnBrowseSource.Size = new System.Drawing.Size(75, 23); - this.btnBrowseSource.TabIndex = 2; - this.btnBrowseSource.Text = "Browse..."; - this.btnBrowseSource.UseVisualStyleBackColor = true; - this.btnBrowseSource.Click += new System.EventHandler(this.btnBrowseSource_Click); - // - // tbSourceWad - // - this.tbSourceWad.Location = new System.Drawing.Point(84, 15); - this.tbSourceWad.Name = "tbSourceWad"; - this.tbSourceWad.ReadOnly = true; - this.tbSourceWad.Size = new System.Drawing.Size(270, 20); - this.tbSourceWad.TabIndex = 1; - this.tbSourceWad.Tag = "Disabled"; - // - // lbSource - // - this.lbSource.AutoSize = true; - this.lbSource.Location = new System.Drawing.Point(8, 18); - this.lbSource.Name = "lbSource"; - this.lbSource.Size = new System.Drawing.Size(70, 13); - this.lbSource.TabIndex = 0; - this.lbSource.Text = "Source Wad:"; - // - // tabTitle - // - this.tabTitle.Controls.Add(this.tbItalian); - this.tabTitle.Controls.Add(this.tbFrench); - this.tabTitle.Controls.Add(this.tbJapanese); - this.tabTitle.Controls.Add(this.tbDutch); - this.tabTitle.Controls.Add(this.tbSpanish); - this.tabTitle.Controls.Add(this.tbGerman); - this.tabTitle.Controls.Add(this.tbEnglish); - this.tabTitle.Controls.Add(this.lbDutch); - this.tabTitle.Controls.Add(this.lbItalian); - this.tabTitle.Controls.Add(this.lbSpanish); - this.tabTitle.Controls.Add(this.lbFrench); - this.tabTitle.Controls.Add(this.lbGerman); - this.tabTitle.Controls.Add(this.lbJapanese); - this.tabTitle.Controls.Add(this.lbEnglish); - this.tabTitle.Controls.Add(this.lbSpecificLanguageTitles); - this.tabTitle.Controls.Add(this.tbAllLanguages); - this.tabTitle.Controls.Add(this.lbAllLanguages); - this.tabTitle.Location = new System.Drawing.Point(4, 22); - this.tabTitle.Name = "tabTitle"; - this.tabTitle.Padding = new System.Windows.Forms.Padding(3); - this.tabTitle.Size = new System.Drawing.Size(443, 209); - this.tabTitle.TabIndex = 1; - this.tabTitle.Text = "Title"; - this.tabTitle.UseVisualStyleBackColor = true; - // - // tbItalian - // - this.tbItalian.Location = new System.Drawing.Point(301, 143); - this.tbItalian.MaxLength = 20; - this.tbItalian.Name = "tbItalian"; - this.tbItalian.Size = new System.Drawing.Size(124, 20); - this.tbItalian.TabIndex = 16; - // - // tbFrench - // - this.tbFrench.Location = new System.Drawing.Point(301, 115); - this.tbFrench.MaxLength = 20; - this.tbFrench.Name = "tbFrench"; - this.tbFrench.Size = new System.Drawing.Size(124, 20); - this.tbFrench.TabIndex = 15; - // - // tbJapanese - // - this.tbJapanese.Location = new System.Drawing.Point(301, 87); - this.tbJapanese.MaxLength = 20; - this.tbJapanese.Name = "tbJapanese"; - this.tbJapanese.Size = new System.Drawing.Size(124, 20); - this.tbJapanese.TabIndex = 14; - // - // tbDutch - // - this.tbDutch.Location = new System.Drawing.Point(70, 171); - this.tbDutch.MaxLength = 20; - this.tbDutch.Name = "tbDutch"; - this.tbDutch.Size = new System.Drawing.Size(124, 20); - this.tbDutch.TabIndex = 13; - // - // tbSpanish - // - this.tbSpanish.Location = new System.Drawing.Point(70, 143); - this.tbSpanish.MaxLength = 20; - this.tbSpanish.Name = "tbSpanish"; - this.tbSpanish.Size = new System.Drawing.Size(124, 20); - this.tbSpanish.TabIndex = 12; - // - // tbGerman - // - this.tbGerman.Location = new System.Drawing.Point(70, 115); - this.tbGerman.MaxLength = 20; - this.tbGerman.Name = "tbGerman"; - this.tbGerman.Size = new System.Drawing.Size(124, 20); - this.tbGerman.TabIndex = 11; - // - // tbEnglish - // - this.tbEnglish.Location = new System.Drawing.Point(70, 87); - this.tbEnglish.MaxLength = 20; - this.tbEnglish.Name = "tbEnglish"; - this.tbEnglish.Size = new System.Drawing.Size(124, 20); - this.tbEnglish.TabIndex = 10; - // - // lbDutch - // - this.lbDutch.AutoSize = true; - this.lbDutch.Location = new System.Drawing.Point(8, 174); - this.lbDutch.Name = "lbDutch"; - this.lbDutch.Size = new System.Drawing.Size(39, 13); - this.lbDutch.TabIndex = 9; - this.lbDutch.Text = "Dutch:"; - // - // lbItalian - // - this.lbItalian.AutoSize = true; - this.lbItalian.Location = new System.Drawing.Point(221, 146); - this.lbItalian.Name = "lbItalian"; - this.lbItalian.Size = new System.Drawing.Size(38, 13); - this.lbItalian.TabIndex = 8; - this.lbItalian.Text = "Italian:"; - // - // lbSpanish - // - this.lbSpanish.AutoSize = true; - this.lbSpanish.Location = new System.Drawing.Point(8, 146); - this.lbSpanish.Name = "lbSpanish"; - this.lbSpanish.Size = new System.Drawing.Size(48, 13); - this.lbSpanish.TabIndex = 7; - this.lbSpanish.Text = "Spanish:"; - // - // lbFrench - // - this.lbFrench.AutoSize = true; - this.lbFrench.Location = new System.Drawing.Point(221, 118); - this.lbFrench.Name = "lbFrench"; - this.lbFrench.Size = new System.Drawing.Size(43, 13); - this.lbFrench.TabIndex = 6; - this.lbFrench.Text = "French:"; - // - // lbGerman - // - this.lbGerman.AutoSize = true; - this.lbGerman.Location = new System.Drawing.Point(8, 118); - this.lbGerman.Name = "lbGerman"; - this.lbGerman.Size = new System.Drawing.Size(47, 13); - this.lbGerman.TabIndex = 5; - this.lbGerman.Text = "German:"; - // - // lbJapanese - // - this.lbJapanese.AutoSize = true; - this.lbJapanese.Location = new System.Drawing.Point(221, 90); - this.lbJapanese.Name = "lbJapanese"; - this.lbJapanese.Size = new System.Drawing.Size(56, 13); - this.lbJapanese.TabIndex = 4; - this.lbJapanese.Text = "Japanese:"; - // - // lbEnglish - // - this.lbEnglish.AutoSize = true; - this.lbEnglish.Location = new System.Drawing.Point(8, 90); - this.lbEnglish.Name = "lbEnglish"; - this.lbEnglish.Size = new System.Drawing.Size(44, 13); - this.lbEnglish.TabIndex = 3; - this.lbEnglish.Text = "English:"; - // - // lbSpecificLanguageTitles - // - this.lbSpecificLanguageTitles.AutoSize = true; - this.lbSpecificLanguageTitles.Location = new System.Drawing.Point(8, 63); - this.lbSpecificLanguageTitles.Name = "lbSpecificLanguageTitles"; - this.lbSpecificLanguageTitles.Size = new System.Drawing.Size(175, 13); - this.lbSpecificLanguageTitles.TabIndex = 2; - this.lbSpecificLanguageTitles.Text = "Specific Language Titles (Optional):"; - // - // tbAllLanguages - // - this.tbAllLanguages.Location = new System.Drawing.Point(114, 19); - this.tbAllLanguages.MaxLength = 20; - this.tbAllLanguages.Name = "tbAllLanguages"; - this.tbAllLanguages.Size = new System.Drawing.Size(311, 20); - this.tbAllLanguages.TabIndex = 1; - // - // lbAllLanguages - // - this.lbAllLanguages.AutoSize = true; - this.lbAllLanguages.Location = new System.Drawing.Point(8, 22); - this.lbAllLanguages.Name = "lbAllLanguages"; - this.lbAllLanguages.Size = new System.Drawing.Size(77, 13); - this.lbAllLanguages.TabIndex = 0; - this.lbAllLanguages.Text = "All Languages:"; - // - // tabOptions - // - this.tabOptions.Controls.Add(this.cbLz77); - this.tabOptions.Controls.Add(this.lbOptionsOptional); - this.tabOptions.Controls.Add(this.btnBrowseSound); - this.tabOptions.Controls.Add(this.tbSound); - this.tabOptions.Controls.Add(this.cmbNandLoader); - this.tabOptions.Controls.Add(this.btnBrowseDol); - this.tabOptions.Controls.Add(this.tbDol); - this.tabOptions.Controls.Add(this.tbTitleID); - this.tabOptions.Controls.Add(this.lbNewSound); - this.tabOptions.Controls.Add(this.lbNandLoader); - this.tabOptions.Controls.Add(this.lbNewDol); - this.tabOptions.Controls.Add(this.lbTitleID); - this.tabOptions.Location = new System.Drawing.Point(4, 22); - this.tabOptions.Name = "tabOptions"; - this.tabOptions.Padding = new System.Windows.Forms.Padding(3); - this.tabOptions.Size = new System.Drawing.Size(443, 209); - this.tabOptions.TabIndex = 2; - this.tabOptions.Text = "Options"; - this.tabOptions.UseVisualStyleBackColor = true; - // - // cbLz77 - // - this.cbLz77.AutoSize = true; - this.cbLz77.Location = new System.Drawing.Point(11, 180); - this.cbLz77.Name = "cbLz77"; - this.cbLz77.Size = new System.Drawing.Size(134, 17); - this.cbLz77.TabIndex = 11; - this.cbLz77.Text = "Use Lz77 Compression"; - this.cbLz77.UseVisualStyleBackColor = true; - // - // lbOptionsOptional - // - this.lbOptionsOptional.Location = new System.Drawing.Point(-7, 9); - this.lbOptionsOptional.Name = "lbOptionsOptional"; - this.lbOptionsOptional.Size = new System.Drawing.Size(457, 34); - this.lbOptionsOptional.TabIndex = 10; - this.lbOptionsOptional.Text = "These are optional. Fill them in only if you want to change them.\r\nIf you want a " + - "looped sound, set the loop points first (e.g. with Wavosaur)."; - this.lbOptionsOptional.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // btnBrowseSound - // - this.btnBrowseSound.Location = new System.Drawing.Point(360, 144); - this.btnBrowseSound.Name = "btnBrowseSound"; - this.btnBrowseSound.Size = new System.Drawing.Size(75, 23); - this.btnBrowseSound.TabIndex = 9; - this.btnBrowseSound.Text = "Browse..."; - this.btnBrowseSound.UseVisualStyleBackColor = true; - this.btnBrowseSound.Click += new System.EventHandler(this.btnBrowseSound_Click); - // - // tbSound - // - this.tbSound.Location = new System.Drawing.Point(90, 147); - this.tbSound.Name = "tbSound"; - this.tbSound.ReadOnly = true; - this.tbSound.Size = new System.Drawing.Size(264, 20); - this.tbSound.TabIndex = 8; - this.tbSound.Tag = "Disabled"; - // - // cmbNandLoader - // - this.cmbNandLoader.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbNandLoader.FormattingEnabled = true; - this.cmbNandLoader.Items.AddRange(new object[] { - "comex", - "Waninkoko"}); - this.cmbNandLoader.Location = new System.Drawing.Point(143, 111); - this.cmbNandLoader.Name = "cmbNandLoader"; - this.cmbNandLoader.Size = new System.Drawing.Size(211, 21); - this.cmbNandLoader.TabIndex = 7; - // - // btnBrowseDol - // - this.btnBrowseDol.Location = new System.Drawing.Point(360, 80); - this.btnBrowseDol.Name = "btnBrowseDol"; - this.btnBrowseDol.Size = new System.Drawing.Size(75, 23); - this.btnBrowseDol.TabIndex = 6; - this.btnBrowseDol.Text = "Browse..."; - this.btnBrowseDol.UseVisualStyleBackColor = true; - this.btnBrowseDol.Click += new System.EventHandler(this.btnBrowseDol_Click); - // - // tbDol - // - this.tbDol.Location = new System.Drawing.Point(90, 83); - this.tbDol.Name = "tbDol"; - this.tbDol.ReadOnly = true; - this.tbDol.Size = new System.Drawing.Size(264, 20); - this.tbDol.TabIndex = 5; - this.tbDol.Tag = "Disabled"; - // - // tbTitleID - // - this.tbTitleID.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; - this.tbTitleID.Location = new System.Drawing.Point(90, 49); - this.tbTitleID.MaxLength = 4; - this.tbTitleID.Name = "tbTitleID"; - this.tbTitleID.Size = new System.Drawing.Size(55, 20); - this.tbTitleID.TabIndex = 4; - // - // lbNewSound - // - this.lbNewSound.AutoSize = true; - this.lbNewSound.Location = new System.Drawing.Point(8, 150); - this.lbNewSound.Name = "lbNewSound"; - this.lbNewSound.Size = new System.Drawing.Size(66, 13); - this.lbNewSound.TabIndex = 3; - this.lbNewSound.Text = "New Sound:"; - // - // lbNandLoader - // - this.lbNandLoader.AutoSize = true; - this.lbNandLoader.Location = new System.Drawing.Point(49, 114); - this.lbNandLoader.Name = "lbNandLoader"; - this.lbNandLoader.Size = new System.Drawing.Size(77, 13); - this.lbNandLoader.TabIndex = 2; - this.lbNandLoader.Text = "NAND Loader:"; - // - // lbNewDol - // - this.lbNewDol.AutoSize = true; - this.lbNewDol.Location = new System.Drawing.Point(8, 86); - this.lbNewDol.Name = "lbNewDol"; - this.lbNewDol.Size = new System.Drawing.Size(57, 13); - this.lbNewDol.TabIndex = 1; - this.lbNewDol.Text = "New DOL:"; - // - // lbTitleID - // - this.lbTitleID.AutoSize = true; - this.lbTitleID.Location = new System.Drawing.Point(8, 52); - this.lbTitleID.Name = "lbTitleID"; - this.lbTitleID.Size = new System.Drawing.Size(44, 13); - this.lbTitleID.TabIndex = 0; - this.lbTitleID.Text = "Title ID:"; - // - // tabBanner - // - this.tabBanner.Controls.Add(this.cbBannerMakeTransparent); - this.tabBanner.Controls.Add(this.cmbFormatBanner); - this.tabBanner.Controls.Add(this.lbFormatBanner); - this.tabBanner.Controls.Add(this.btnPreviewBanner); - this.tabBanner.Controls.Add(this.btnExtractBanner); - this.tabBanner.Controls.Add(this.btnDeleteBanner); - this.tabBanner.Controls.Add(this.btnAddBanner); - this.tabBanner.Controls.Add(this.btnReplaceBanner); - this.tabBanner.Controls.Add(this.lbxBannerTpls); - this.tabBanner.Location = new System.Drawing.Point(4, 22); - this.tabBanner.Name = "tabBanner"; - this.tabBanner.Padding = new System.Windows.Forms.Padding(3); - this.tabBanner.Size = new System.Drawing.Size(443, 209); - this.tabBanner.TabIndex = 3; - this.tabBanner.Text = "Banner"; - this.tabBanner.UseVisualStyleBackColor = true; - // - // cbBannerMakeTransparent - // - this.cbBannerMakeTransparent.AutoSize = true; - this.cbBannerMakeTransparent.Location = new System.Drawing.Point(11, 189); - this.cbBannerMakeTransparent.Name = "cbBannerMakeTransparent"; - this.cbBannerMakeTransparent.Size = new System.Drawing.Size(113, 17); - this.cbBannerMakeTransparent.TabIndex = 6; - this.cbBannerMakeTransparent.Text = "Make Transparent"; - this.cbBannerMakeTransparent.UseVisualStyleBackColor = true; - this.cbBannerMakeTransparent.CheckedChanged += new System.EventHandler(this.cbBannerMakeTransparent_CheckedChanged); - // - // cmbFormatBanner - // - this.cmbFormatBanner.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbFormatBanner.FormattingEnabled = true; - this.cmbFormatBanner.Items.AddRange(new object[] { - "RGBA8", - "RGB565", - "RGB5A3", - "IA8", - "IA4", - "I8", - "I4", - "CMP"}); - this.cmbFormatBanner.Location = new System.Drawing.Point(360, 182); - this.cmbFormatBanner.Name = "cmbFormatBanner"; - this.cmbFormatBanner.Size = new System.Drawing.Size(75, 21); - this.cmbFormatBanner.TabIndex = 5; - // - // lbFormatBanner - // - this.lbFormatBanner.AutoSize = true; - this.lbFormatBanner.Location = new System.Drawing.Point(360, 166); - this.lbFormatBanner.Name = "lbFormatBanner"; - this.lbFormatBanner.Size = new System.Drawing.Size(42, 13); - this.lbFormatBanner.TabIndex = 4; - this.lbFormatBanner.Text = "Format:"; - // - // btnPreviewBanner - // - this.btnPreviewBanner.Location = new System.Drawing.Point(360, 132); - this.btnPreviewBanner.Name = "btnPreviewBanner"; - this.btnPreviewBanner.Size = new System.Drawing.Size(75, 23); - this.btnPreviewBanner.TabIndex = 3; - this.btnPreviewBanner.Text = "Preview"; - this.btnPreviewBanner.UseVisualStyleBackColor = true; - this.btnPreviewBanner.Click += new System.EventHandler(this.btnPreviewBanner_Click); - // - // btnExtractBanner - // - this.btnExtractBanner.Location = new System.Drawing.Point(360, 102); - this.btnExtractBanner.Name = "btnExtractBanner"; - this.btnExtractBanner.Size = new System.Drawing.Size(75, 23); - this.btnExtractBanner.TabIndex = 2; - this.btnExtractBanner.Text = "Extract"; - this.btnExtractBanner.UseVisualStyleBackColor = true; - this.btnExtractBanner.Click += new System.EventHandler(this.btnExtractBanner_Click); - // - // btnDeleteBanner - // - this.btnDeleteBanner.Location = new System.Drawing.Point(360, 42); - this.btnDeleteBanner.Name = "btnDeleteBanner"; - this.btnDeleteBanner.Size = new System.Drawing.Size(75, 23); - this.btnDeleteBanner.TabIndex = 1; - this.btnDeleteBanner.Text = "Delete"; - this.btnDeleteBanner.UseVisualStyleBackColor = true; - this.btnDeleteBanner.Click += new System.EventHandler(this.btnDeleteBanner_Click); - // - // btnAddBanner - // - this.btnAddBanner.Location = new System.Drawing.Point(360, 12); - this.btnAddBanner.Name = "btnAddBanner"; - this.btnAddBanner.Size = new System.Drawing.Size(75, 23); - this.btnAddBanner.TabIndex = 1; - this.btnAddBanner.Text = "Add"; - this.btnAddBanner.UseVisualStyleBackColor = true; - this.btnAddBanner.Click += new System.EventHandler(this.btnAddBanner_Click); - // - // btnReplaceBanner - // - this.btnReplaceBanner.Location = new System.Drawing.Point(360, 72); - this.btnReplaceBanner.Name = "btnReplaceBanner"; - this.btnReplaceBanner.Size = new System.Drawing.Size(75, 23); - this.btnReplaceBanner.TabIndex = 1; - this.btnReplaceBanner.Text = "Replace"; - this.btnReplaceBanner.UseVisualStyleBackColor = true; - this.btnReplaceBanner.Click += new System.EventHandler(this.btnReplaceBanner_Click); - // - // lbxBannerTpls - // - this.lbxBannerTpls.FormattingEnabled = true; - this.lbxBannerTpls.Location = new System.Drawing.Point(11, 12); - this.lbxBannerTpls.Name = "lbxBannerTpls"; - this.lbxBannerTpls.Size = new System.Drawing.Size(343, 173); - this.lbxBannerTpls.Sorted = true; - this.lbxBannerTpls.TabIndex = 0; - this.lbxBannerTpls.SelectedIndexChanged += new System.EventHandler(this.lbxBannerTpls_SelectedIndexChanged); - // - // tabIcon - // - this.tabIcon.Controls.Add(this.cbIconMakeTransparent); - this.tabIcon.Controls.Add(this.cmbFormatIcon); - this.tabIcon.Controls.Add(this.lbFormatIcon); - this.tabIcon.Controls.Add(this.btnPreviewIcon); - this.tabIcon.Controls.Add(this.btnExtractIcon); - this.tabIcon.Controls.Add(this.btnAddIcon); - this.tabIcon.Controls.Add(this.btnDeleteIcon); - this.tabIcon.Controls.Add(this.btnReplaceIcon); - this.tabIcon.Controls.Add(this.lbxIconTpls); - this.tabIcon.Location = new System.Drawing.Point(4, 22); - this.tabIcon.Name = "tabIcon"; - this.tabIcon.Padding = new System.Windows.Forms.Padding(3); - this.tabIcon.Size = new System.Drawing.Size(443, 209); - this.tabIcon.TabIndex = 4; - this.tabIcon.Text = "Icon"; - this.tabIcon.UseVisualStyleBackColor = true; - // - // cbIconMakeTransparent - // - this.cbIconMakeTransparent.AutoSize = true; - this.cbIconMakeTransparent.Location = new System.Drawing.Point(11, 189); - this.cbIconMakeTransparent.Name = "cbIconMakeTransparent"; - this.cbIconMakeTransparent.Size = new System.Drawing.Size(113, 17); - this.cbIconMakeTransparent.TabIndex = 12; - this.cbIconMakeTransparent.Text = "Make Transparent"; - this.cbIconMakeTransparent.UseVisualStyleBackColor = true; - this.cbIconMakeTransparent.CheckedChanged += new System.EventHandler(this.cbIconMakeTransparent_CheckedChanged); - // - // cmbFormatIcon - // - this.cmbFormatIcon.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbFormatIcon.FormattingEnabled = true; - this.cmbFormatIcon.Items.AddRange(new object[] { - "RGBA8", - "RGB565", - "RGB5A3", - "IA8", - "IA4", - "I8", - "I4", - "CMP"}); - this.cmbFormatIcon.Location = new System.Drawing.Point(360, 182); - this.cmbFormatIcon.Name = "cmbFormatIcon"; - this.cmbFormatIcon.Size = new System.Drawing.Size(75, 21); - this.cmbFormatIcon.TabIndex = 11; - // - // lbFormatIcon - // - this.lbFormatIcon.AutoSize = true; - this.lbFormatIcon.Location = new System.Drawing.Point(360, 166); - this.lbFormatIcon.Name = "lbFormatIcon"; - this.lbFormatIcon.Size = new System.Drawing.Size(42, 13); - this.lbFormatIcon.TabIndex = 10; - this.lbFormatIcon.Text = "Format:"; - // - // btnPreviewIcon - // - this.btnPreviewIcon.Location = new System.Drawing.Point(360, 132); - this.btnPreviewIcon.Name = "btnPreviewIcon"; - this.btnPreviewIcon.Size = new System.Drawing.Size(75, 23); - this.btnPreviewIcon.TabIndex = 9; - this.btnPreviewIcon.Text = "Preview"; - this.btnPreviewIcon.UseVisualStyleBackColor = true; - this.btnPreviewIcon.Click += new System.EventHandler(this.btnPreviewIcon_Click); - // - // btnExtractIcon - // - this.btnExtractIcon.Location = new System.Drawing.Point(360, 102); - this.btnExtractIcon.Name = "btnExtractIcon"; - this.btnExtractIcon.Size = new System.Drawing.Size(75, 23); - this.btnExtractIcon.TabIndex = 8; - this.btnExtractIcon.Text = "Extract"; - this.btnExtractIcon.UseVisualStyleBackColor = true; - this.btnExtractIcon.Click += new System.EventHandler(this.btnExtractIcon_Click); - // - // btnAddIcon - // - this.btnAddIcon.Location = new System.Drawing.Point(360, 12); - this.btnAddIcon.Name = "btnAddIcon"; - this.btnAddIcon.Size = new System.Drawing.Size(75, 23); - this.btnAddIcon.TabIndex = 7; - this.btnAddIcon.Text = "Add"; - this.btnAddIcon.UseVisualStyleBackColor = true; - this.btnAddIcon.Click += new System.EventHandler(this.btnAddIcon_Click); - // - // btnDeleteIcon - // - this.btnDeleteIcon.Location = new System.Drawing.Point(360, 42); - this.btnDeleteIcon.Name = "btnDeleteIcon"; - this.btnDeleteIcon.Size = new System.Drawing.Size(75, 23); - this.btnDeleteIcon.TabIndex = 7; - this.btnDeleteIcon.Text = "Delete"; - this.btnDeleteIcon.UseVisualStyleBackColor = true; - this.btnDeleteIcon.Click += new System.EventHandler(this.btnDeleteIcon_Click); - // - // btnReplaceIcon - // - this.btnReplaceIcon.Location = new System.Drawing.Point(360, 72); - this.btnReplaceIcon.Name = "btnReplaceIcon"; - this.btnReplaceIcon.Size = new System.Drawing.Size(75, 23); - this.btnReplaceIcon.TabIndex = 7; - this.btnReplaceIcon.Text = "Replace"; - this.btnReplaceIcon.UseVisualStyleBackColor = true; - this.btnReplaceIcon.Click += new System.EventHandler(this.btnReplaceIcon_Click); - // - // lbxIconTpls - // - this.lbxIconTpls.FormattingEnabled = true; - this.lbxIconTpls.Location = new System.Drawing.Point(11, 12); - this.lbxIconTpls.Name = "lbxIconTpls"; - this.lbxIconTpls.Size = new System.Drawing.Size(343, 173); - this.lbxIconTpls.Sorted = true; - this.lbxIconTpls.TabIndex = 6; - this.lbxIconTpls.SelectedIndexChanged += new System.EventHandler(this.lbxIconTpls_SelectedIndexChanged); - // - // tabBrlyt - // - this.tabBrlyt.Controls.Add(this.btnBrlytListTpls); - this.tabBrlyt.Controls.Add(this.lbBrlytWarning); - this.tabBrlyt.Controls.Add(this.lbBrlytActions); - this.tabBrlyt.Controls.Add(this.btnBrlytExtract); - this.tabBrlyt.Controls.Add(this.btnBrlytReplace); - this.tabBrlyt.Controls.Add(this.lbBrlytIcon); - this.tabBrlyt.Controls.Add(this.lbBrlytBanner); - this.tabBrlyt.Controls.Add(this.lbxBrlytIcon); - this.tabBrlyt.Controls.Add(this.lbxBrlytBanner); - this.tabBrlyt.Location = new System.Drawing.Point(4, 22); - this.tabBrlyt.Name = "tabBrlyt"; - this.tabBrlyt.Padding = new System.Windows.Forms.Padding(3); - this.tabBrlyt.Size = new System.Drawing.Size(443, 209); - this.tabBrlyt.TabIndex = 6; - this.tabBrlyt.Text = "brlyt"; - this.tabBrlyt.UseVisualStyleBackColor = true; - // - // btnBrlytListTpls - // - this.btnBrlytListTpls.Location = new System.Drawing.Point(360, 131); - this.btnBrlytListTpls.Name = "btnBrlytListTpls"; - this.btnBrlytListTpls.Size = new System.Drawing.Size(75, 23); - this.btnBrlytListTpls.TabIndex = 8; - this.btnBrlytListTpls.Text = "List TPLs"; - this.btnBrlytListTpls.UseVisualStyleBackColor = true; - this.btnBrlytListTpls.Click += new System.EventHandler(this.btnBrlytListTpls_Click); - // - // lbBrlytWarning - // - this.lbBrlytWarning.ForeColor = System.Drawing.Color.Red; - this.lbBrlytWarning.Location = new System.Drawing.Point(-4, 192); - this.lbBrlytWarning.Name = "lbBrlytWarning"; - this.lbBrlytWarning.Size = new System.Drawing.Size(451, 23); - this.lbBrlytWarning.TabIndex = 7; - this.lbBrlytWarning.Text = "Be careful with these features, wrong handling WILL BRICK your Wii!"; - this.lbBrlytWarning.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // lbBrlytActions - // - this.lbBrlytActions.Location = new System.Drawing.Point(357, 42); - this.lbBrlytActions.Name = "lbBrlytActions"; - this.lbBrlytActions.Size = new System.Drawing.Size(78, 11); - this.lbBrlytActions.TabIndex = 6; - this.lbBrlytActions.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // btnBrlytExtract - // - this.btnBrlytExtract.Location = new System.Drawing.Point(360, 98); - this.btnBrlytExtract.Name = "btnBrlytExtract"; - this.btnBrlytExtract.Size = new System.Drawing.Size(75, 23); - this.btnBrlytExtract.TabIndex = 5; - this.btnBrlytExtract.Text = "Extract"; - this.btnBrlytExtract.UseVisualStyleBackColor = true; - this.btnBrlytExtract.Click += new System.EventHandler(this.btnBrlytExtract_Click); - // - // btnBrlytReplace - // - this.btnBrlytReplace.Location = new System.Drawing.Point(360, 65); - this.btnBrlytReplace.Name = "btnBrlytReplace"; - this.btnBrlytReplace.Size = new System.Drawing.Size(75, 23); - this.btnBrlytReplace.TabIndex = 5; - this.btnBrlytReplace.Text = "Replace"; - this.btnBrlytReplace.UseVisualStyleBackColor = true; - this.btnBrlytReplace.Click += new System.EventHandler(this.btnBrlytReplace_Click); - // - // lbBrlytIcon - // - this.lbBrlytIcon.AutoSize = true; - this.lbBrlytIcon.Location = new System.Drawing.Point(11, 102); - this.lbBrlytIcon.Name = "lbBrlytIcon"; - this.lbBrlytIcon.Size = new System.Drawing.Size(31, 13); - this.lbBrlytIcon.TabIndex = 4; - this.lbBrlytIcon.Text = "Icon:"; - // - // lbBrlytBanner - // - this.lbBrlytBanner.AutoSize = true; - this.lbBrlytBanner.Location = new System.Drawing.Point(11, 11); - this.lbBrlytBanner.Name = "lbBrlytBanner"; - this.lbBrlytBanner.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.lbBrlytBanner.Size = new System.Drawing.Size(44, 13); - this.lbBrlytBanner.TabIndex = 3; - this.lbBrlytBanner.Text = "Banner:"; - // - // lbxBrlytIcon - // - this.lbxBrlytIcon.FormattingEnabled = true; - this.lbxBrlytIcon.Location = new System.Drawing.Point(11, 120); - this.lbxBrlytIcon.Name = "lbxBrlytIcon"; - this.lbxBrlytIcon.Size = new System.Drawing.Size(343, 69); - this.lbxBrlytIcon.Sorted = true; - this.lbxBrlytIcon.TabIndex = 1; - this.lbxBrlytIcon.SelectedIndexChanged += new System.EventHandler(this.lbxBrlytIcon_SelectedIndexChanged); - // - // lbxBrlytBanner - // - this.lbxBrlytBanner.FormattingEnabled = true; - this.lbxBrlytBanner.Location = new System.Drawing.Point(11, 29); - this.lbxBrlytBanner.Name = "lbxBrlytBanner"; - this.lbxBrlytBanner.Size = new System.Drawing.Size(343, 69); - this.lbxBrlytBanner.Sorted = true; - this.lbxBrlytBanner.TabIndex = 0; - this.lbxBrlytBanner.SelectedIndexChanged += new System.EventHandler(this.lbxBrlytBanner_SelectedIndexChanged); - // - // tabBrlan - // - this.tabBrlan.Controls.Add(this.lbBrlanWarning); - this.tabBrlan.Controls.Add(this.lbBrlanActions); - this.tabBrlan.Controls.Add(this.btnBrlanExtract); - this.tabBrlan.Controls.Add(this.btnBrlanDelete); - this.tabBrlan.Controls.Add(this.btnBrlanReplace); - this.tabBrlan.Controls.Add(this.lbBrlanIcon); - this.tabBrlan.Controls.Add(this.lbBrlanBanner); - this.tabBrlan.Controls.Add(this.btnBrlanAdd); - this.tabBrlan.Controls.Add(this.lbxBrlanIcon); - this.tabBrlan.Controls.Add(this.lbxBrlanBanner); - this.tabBrlan.Location = new System.Drawing.Point(4, 22); - this.tabBrlan.Name = "tabBrlan"; - this.tabBrlan.Padding = new System.Windows.Forms.Padding(3); - this.tabBrlan.Size = new System.Drawing.Size(443, 209); - this.tabBrlan.TabIndex = 7; - this.tabBrlan.Text = "brlan"; - this.tabBrlan.UseVisualStyleBackColor = true; - // - // lbBrlanWarning - // - this.lbBrlanWarning.ForeColor = System.Drawing.Color.Red; - this.lbBrlanWarning.Location = new System.Drawing.Point(-4, 192); - this.lbBrlanWarning.Name = "lbBrlanWarning"; - this.lbBrlanWarning.Size = new System.Drawing.Size(451, 23); - this.lbBrlanWarning.TabIndex = 15; - this.lbBrlanWarning.Text = "Be careful with these features, wrong handling WILL BRICK your Wii!"; - this.lbBrlanWarning.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // lbBrlanActions - // - this.lbBrlanActions.Location = new System.Drawing.Point(357, 14); - this.lbBrlanActions.Name = "lbBrlanActions"; - this.lbBrlanActions.Size = new System.Drawing.Size(78, 13); - this.lbBrlanActions.TabIndex = 14; - this.lbBrlanActions.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // btnBrlanExtract - // - this.btnBrlanExtract.Location = new System.Drawing.Point(360, 153); - this.btnBrlanExtract.Name = "btnBrlanExtract"; - this.btnBrlanExtract.Size = new System.Drawing.Size(75, 23); - this.btnBrlanExtract.TabIndex = 11; - this.btnBrlanExtract.Text = "Extract"; - this.btnBrlanExtract.UseVisualStyleBackColor = true; - this.btnBrlanExtract.Click += new System.EventHandler(this.btnBrlanExtract_Click); - // - // btnBrlanDelete - // - this.btnBrlanDelete.Location = new System.Drawing.Point(360, 77); - this.btnBrlanDelete.Name = "btnBrlanDelete"; - this.btnBrlanDelete.Size = new System.Drawing.Size(75, 23); - this.btnBrlanDelete.TabIndex = 12; - this.btnBrlanDelete.Text = "Delete"; - this.btnBrlanDelete.UseVisualStyleBackColor = true; - this.btnBrlanDelete.Click += new System.EventHandler(this.btnBrlanDelete_Click); - // - // btnBrlanReplace - // - this.btnBrlanReplace.Location = new System.Drawing.Point(360, 115); - this.btnBrlanReplace.Name = "btnBrlanReplace"; - this.btnBrlanReplace.Size = new System.Drawing.Size(75, 23); - this.btnBrlanReplace.TabIndex = 13; - this.btnBrlanReplace.Text = "Replace"; - this.btnBrlanReplace.UseVisualStyleBackColor = true; - this.btnBrlanReplace.Click += new System.EventHandler(this.btnBrlanReplace_Click); - // - // lbBrlanIcon - // - this.lbBrlanIcon.AutoSize = true; - this.lbBrlanIcon.Location = new System.Drawing.Point(11, 102); - this.lbBrlanIcon.Name = "lbBrlanIcon"; - this.lbBrlanIcon.Size = new System.Drawing.Size(31, 13); - this.lbBrlanIcon.TabIndex = 10; - this.lbBrlanIcon.Text = "Icon:"; - // - // lbBrlanBanner - // - this.lbBrlanBanner.AutoSize = true; - this.lbBrlanBanner.Location = new System.Drawing.Point(11, 11); - this.lbBrlanBanner.Name = "lbBrlanBanner"; - this.lbBrlanBanner.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.lbBrlanBanner.Size = new System.Drawing.Size(44, 13); - this.lbBrlanBanner.TabIndex = 9; - this.lbBrlanBanner.Text = "Banner:"; - // - // btnBrlanAdd - // - this.btnBrlanAdd.Location = new System.Drawing.Point(360, 39); - this.btnBrlanAdd.Name = "btnBrlanAdd"; - this.btnBrlanAdd.Size = new System.Drawing.Size(75, 23); - this.btnBrlanAdd.TabIndex = 8; - this.btnBrlanAdd.Text = "Add"; - this.btnBrlanAdd.UseVisualStyleBackColor = true; - this.btnBrlanAdd.Click += new System.EventHandler(this.btnBrlanAdd_Click); - // - // lbxBrlanIcon - // - this.lbxBrlanIcon.FormattingEnabled = true; - this.lbxBrlanIcon.Location = new System.Drawing.Point(11, 120); - this.lbxBrlanIcon.Name = "lbxBrlanIcon"; - this.lbxBrlanIcon.Size = new System.Drawing.Size(343, 69); - this.lbxBrlanIcon.Sorted = true; - this.lbxBrlanIcon.TabIndex = 7; - this.lbxBrlanIcon.SelectedIndexChanged += new System.EventHandler(this.lbxBrlanIcon_SelectedIndexChanged); - // - // lbxBrlanBanner - // - this.lbxBrlanBanner.FormattingEnabled = true; - this.lbxBrlanBanner.Location = new System.Drawing.Point(11, 29); - this.lbxBrlanBanner.Name = "lbxBrlanBanner"; - this.lbxBrlanBanner.Size = new System.Drawing.Size(343, 69); - this.lbxBrlanBanner.Sorted = true; - this.lbxBrlanBanner.TabIndex = 6; - this.lbxBrlanBanner.SelectedIndexChanged += new System.EventHandler(this.lbxBrlanBanner_SelectedIndexChanged); - // - // tabInstructions - // - this.tabInstructions.Controls.Add(this.rtbInstructions); - this.tabInstructions.Location = new System.Drawing.Point(4, 22); - this.tabInstructions.Name = "tabInstructions"; - this.tabInstructions.Padding = new System.Windows.Forms.Padding(3); - this.tabInstructions.Size = new System.Drawing.Size(443, 209); - this.tabInstructions.TabIndex = 8; - this.tabInstructions.Text = "Instructions"; - this.tabInstructions.UseVisualStyleBackColor = true; - // - // rtbInstructions - // - this.rtbInstructions.BackColor = System.Drawing.SystemColors.Window; - this.rtbInstructions.Dock = System.Windows.Forms.DockStyle.Fill; - this.rtbInstructions.Location = new System.Drawing.Point(3, 3); - this.rtbInstructions.Name = "rtbInstructions"; - this.rtbInstructions.ReadOnly = true; - this.rtbInstructions.Size = new System.Drawing.Size(437, 203); - this.rtbInstructions.TabIndex = 0; - this.rtbInstructions.Text = ""; - // - // tabCredits - // - this.tabCredits.Controls.Add(this.llbUpdateAvailabe); - this.tabCredits.Controls.Add(this.llbSite); - this.tabCredits.Controls.Add(this.lbCreditThanks); - this.tabCredits.Controls.Add(this.lbCreditVersion); - this.tabCredits.Controls.Add(this.lbCreditInfo); - this.tabCredits.Location = new System.Drawing.Point(4, 22); - this.tabCredits.Name = "tabCredits"; - this.tabCredits.Padding = new System.Windows.Forms.Padding(3); - this.tabCredits.Size = new System.Drawing.Size(443, 209); - this.tabCredits.TabIndex = 5; - this.tabCredits.Text = "Credits"; - this.tabCredits.UseVisualStyleBackColor = true; - // - // llbUpdateAvailabe - // - this.llbUpdateAvailabe.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.llbUpdateAvailabe.Location = new System.Drawing.Point(0, 62); - this.llbUpdateAvailabe.Name = "llbUpdateAvailabe"; - this.llbUpdateAvailabe.Size = new System.Drawing.Size(443, 13); - this.llbUpdateAvailabe.TabIndex = 4; - this.llbUpdateAvailabe.TabStop = true; - this.llbUpdateAvailabe.Text = "Version X is availabe, get it here!"; - this.llbUpdateAvailabe.TextAlign = System.Drawing.ContentAlignment.TopCenter; - this.llbUpdateAvailabe.Visible = false; - this.llbUpdateAvailabe.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llbUpdateAvailabe_LinkClicked); - // - // llbSite - // - this.llbSite.Location = new System.Drawing.Point(0, 35); - this.llbSite.Name = "llbSite"; - this.llbSite.Size = new System.Drawing.Size(443, 13); - this.llbSite.TabIndex = 3; - this.llbSite.TabStop = true; - this.llbSite.Text = "http://customizemii.googlecode.com"; - this.llbSite.TextAlign = System.Drawing.ContentAlignment.TopCenter; - this.llbSite.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llbSite_LinkClicked); - // - // lbCreditThanks - // - this.lbCreditThanks.Location = new System.Drawing.Point(0, 91); - this.lbCreditThanks.Name = "lbCreditThanks"; - this.lbCreditThanks.Size = new System.Drawing.Size(443, 79); - this.lbCreditThanks.TabIndex = 2; - this.lbCreditThanks.Text = resources.GetString("lbCreditThanks.Text"); - this.lbCreditThanks.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // lbCreditVersion - // - this.lbCreditVersion.Location = new System.Drawing.Point(0, 13); - this.lbCreditVersion.Name = "lbCreditVersion"; - this.lbCreditVersion.Size = new System.Drawing.Size(443, 13); - this.lbCreditVersion.TabIndex = 1; - this.lbCreditVersion.Text = "CustomizeMii Version X by Leathl"; - this.lbCreditVersion.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // lbCreditInfo - // - this.lbCreditInfo.ForeColor = System.Drawing.Color.Red; - this.lbCreditInfo.Location = new System.Drawing.Point(0, 189); - this.lbCreditInfo.Name = "lbCreditInfo"; - this.lbCreditInfo.Size = new System.Drawing.Size(443, 16); - this.lbCreditInfo.TabIndex = 0; - this.lbCreditInfo.Text = "Thanks to icefire / Xuzz for the basic idea of this Application!"; - this.lbCreditInfo.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // ssMain - // - this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.lbStatus, - this.lbStatusText, - this.pbProgress}); - this.ssMain.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow; - this.ssMain.Location = new System.Drawing.Point(0, 268); - this.ssMain.Name = "ssMain"; - this.ssMain.Size = new System.Drawing.Size(451, 22); - this.ssMain.SizingGrip = false; - this.ssMain.TabIndex = 2; - this.ssMain.Text = "ssMain"; - // - // lbStatus - // - this.lbStatus.Name = "lbStatus"; - this.lbStatus.Size = new System.Drawing.Size(45, 17); - this.lbStatus.Text = "Status: "; - // - // lbStatusText - // - this.lbStatusText.Name = "lbStatusText"; - this.lbStatusText.Size = new System.Drawing.Size(0, 17); - this.lbStatusText.Spring = true; - this.lbStatusText.TextChanged += new System.EventHandler(this.lbStatusText_TextChanged); - // - // pbProgress - // - this.pbProgress.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.pbProgress.Name = "pbProgress"; - this.pbProgress.Size = new System.Drawing.Size(100, 16); - this.pbProgress.Value = 100; - // - // CustomizeMii_Main - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(451, 290); - this.Controls.Add(this.tabControl); - this.Controls.Add(this.btnCreateWad); - this.Controls.Add(this.ssMain); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MaximizeBox = false; - this.Name = "CustomizeMii_Main"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "CustomizeMii X by Leathl"; - this.Load += new System.EventHandler(this.CustomizeMii_Main_Load); - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.CustomizeMii_Main_FormClosing); - this.tabControl.ResumeLayout(false); - this.tabSource.ResumeLayout(false); - this.tabSource.PerformLayout(); - this.tabTitle.ResumeLayout(false); - this.tabTitle.PerformLayout(); - this.tabOptions.ResumeLayout(false); - this.tabOptions.PerformLayout(); - this.tabBanner.ResumeLayout(false); - this.tabBanner.PerformLayout(); - this.tabIcon.ResumeLayout(false); - this.tabIcon.PerformLayout(); - this.tabBrlyt.ResumeLayout(false); - this.tabBrlyt.PerformLayout(); - this.tabBrlan.ResumeLayout(false); - this.tabBrlan.PerformLayout(); - this.tabInstructions.ResumeLayout(false); - this.tabCredits.ResumeLayout(false); - this.ssMain.ResumeLayout(false); - this.ssMain.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button btnCreateWad; - private System.Windows.Forms.TabControl tabControl; - private System.Windows.Forms.TabPage tabSource; - private System.Windows.Forms.TabPage tabTitle; - private System.Windows.Forms.TabPage tabOptions; - private System.Windows.Forms.TabPage tabBanner; - private System.Windows.Forms.TabPage tabIcon; - private System.Windows.Forms.TabPage tabCredits; - private System.Windows.Forms.Label lbSource; - private System.Windows.Forms.Button btnBrowseSource; - private System.Windows.Forms.TextBox tbSourceWad; - private System.Windows.Forms.ListBox lbxBaseWads; - private System.Windows.Forms.Button btnSaveBaseWad; - private System.Windows.Forms.Button btnPreviewBaseWad; - private System.Windows.Forms.Button btnLoadBaseWad; - private System.Windows.Forms.TextBox tbAllLanguages; - private System.Windows.Forms.Label lbAllLanguages; - private System.Windows.Forms.Label lbSpecificLanguageTitles; - private System.Windows.Forms.Label lbEnglish; - private System.Windows.Forms.Label lbJapanese; - private System.Windows.Forms.Label lbDutch; - private System.Windows.Forms.Label lbItalian; - private System.Windows.Forms.Label lbSpanish; - private System.Windows.Forms.Label lbFrench; - private System.Windows.Forms.Label lbGerman; - private System.Windows.Forms.TextBox tbItalian; - private System.Windows.Forms.TextBox tbFrench; - private System.Windows.Forms.TextBox tbJapanese; - private System.Windows.Forms.TextBox tbDutch; - private System.Windows.Forms.TextBox tbSpanish; - private System.Windows.Forms.TextBox tbGerman; - private System.Windows.Forms.TextBox tbEnglish; - private System.Windows.Forms.Label lbNewDol; - private System.Windows.Forms.Label lbTitleID; - private System.Windows.Forms.Label lbNandLoader; - private System.Windows.Forms.Label lbNewSound; - private System.Windows.Forms.Button btnBrowseDol; - private System.Windows.Forms.TextBox tbDol; - private System.Windows.Forms.TextBox tbTitleID; - private System.Windows.Forms.ComboBox cmbNandLoader; - private System.Windows.Forms.TextBox tbSound; - private System.Windows.Forms.Button btnBrowseSound; - private System.Windows.Forms.Label lbOptionsOptional; - private System.Windows.Forms.Button btnPreviewBanner; - private System.Windows.Forms.Button btnExtractBanner; - private System.Windows.Forms.Button btnReplaceBanner; - private System.Windows.Forms.ListBox lbxBannerTpls; - private System.Windows.Forms.Label lbFormatBanner; - private System.Windows.Forms.ComboBox cmbFormatBanner; - private System.Windows.Forms.ComboBox cmbFormatIcon; - private System.Windows.Forms.Label lbFormatIcon; - private System.Windows.Forms.Button btnPreviewIcon; - private System.Windows.Forms.Button btnExtractIcon; - private System.Windows.Forms.Button btnReplaceIcon; - private System.Windows.Forms.ListBox lbxIconTpls; - private System.Windows.Forms.Label lbCreditInfo; - private System.Windows.Forms.Label lbCreditVersion; - private System.Windows.Forms.Label lbCreditThanks; - private System.Windows.Forms.StatusStrip ssMain; - private System.Windows.Forms.ToolStripProgressBar pbProgress; - private System.Windows.Forms.ToolStripStatusLabel lbStatus; - private System.Windows.Forms.ToolStripStatusLabel lbStatusText; - private System.Windows.Forms.ComboBox cmbReplace; - private System.Windows.Forms.TextBox tbReplace; - private System.Windows.Forms.Button btnBrowseReplace; - private System.Windows.Forms.Button btnClearReplace; - private System.Windows.Forms.CheckBox cbLz77; - private System.Windows.Forms.LinkLabel llbSite; - private System.Windows.Forms.TabPage tabBrlyt; - private System.Windows.Forms.TabPage tabBrlan; - private System.Windows.Forms.ListBox lbxBrlytIcon; - private System.Windows.Forms.ListBox lbxBrlytBanner; - private System.Windows.Forms.Label lbBrlytIcon; - private System.Windows.Forms.Label lbBrlytBanner; - private System.Windows.Forms.Button btnBrlytReplace; - private System.Windows.Forms.Button btnBrlytExtract; - private System.Windows.Forms.Button btnBrlanExtract; - private System.Windows.Forms.Button btnBrlanDelete; - private System.Windows.Forms.Button btnBrlanReplace; - private System.Windows.Forms.Label lbBrlanIcon; - private System.Windows.Forms.Label lbBrlanBanner; - private System.Windows.Forms.Button btnBrlanAdd; - private System.Windows.Forms.ListBox lbxBrlanIcon; - private System.Windows.Forms.ListBox lbxBrlanBanner; - private System.Windows.Forms.Label lbBrlytActions; - private System.Windows.Forms.Label lbBrlanActions; - private System.Windows.Forms.Label lbBrlytWarning; - private System.Windows.Forms.Label lbBrlanWarning; - private System.Windows.Forms.LinkLabel llbUpdateAvailabe; - private System.Windows.Forms.Button btnDeleteBanner; - private System.Windows.Forms.Button btnAddBanner; - private System.Windows.Forms.Button btnAddIcon; - private System.Windows.Forms.Button btnDeleteIcon; - private System.Windows.Forms.Button btnBrlytListTpls; - private System.Windows.Forms.CheckBox cbBannerMakeTransparent; - private System.Windows.Forms.CheckBox cbIconMakeTransparent; - private System.Windows.Forms.TabPage tabInstructions; - private System.Windows.Forms.RichTextBox rtbInstructions; - } -} - diff --git a/CustomizeMii/CustomizeMii_Main.cs b/CustomizeMii/CustomizeMii_Main.cs deleted file mode 100644 index 28d73f6..0000000 --- a/CustomizeMii/CustomizeMii_Main.cs +++ /dev/null @@ -1,3070 +0,0 @@ -/* This file is part of CustomizeMii - * Copyright (C) 2009 Leathl - * - * CustomizeMii is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * CustomizeMii is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Drawing; -using System.IO; -using System.Net; -using System.Text.RegularExpressions; -using System.Windows.Forms; - -namespace CustomizeMii -{ - public partial class CustomizeMii_Main : Form - { - const string Version = "1.1"; //Hint for myself: Never use a char in the Version (UpdateCheck)! - const int SoundMaxLength = 30; //In seconds - const int SoundWarningLength = 20; //In seconds - protected string TempWadPath = Path.GetTempPath() + "CustomizeMii_Temp\\TempWad.wad"; - protected string TempUnpackPath = Path.GetTempPath() + "CustomizeMii_Temp\\Unpack\\"; - protected string TempBannerPath = Path.GetTempPath() + "CustomizeMii_Temp\\Banner\\"; - protected string TempIconPath = Path.GetTempPath() + "CustomizeMii_Temp\\Icon\\"; - protected string TempSoundPath = Path.GetTempPath() + "CustomizeMii_Temp\\sound.bin"; - protected string TempTempPath = Path.GetTempPath() + "CustomizeMii_Temp\\Temp\\"; - protected string TempUnpackBannerTplPath = Path.GetTempPath() + "CustomizeMii_Temp\\Unpack\\00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\timg\\"; - protected string TempUnpackIconTplPath = Path.GetTempPath() + "CustomizeMii_Temp\\Unpack\\00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\timg\\"; - protected string TempUnpackBannerBrlytPath = Path.GetTempPath() + "CustomizeMii_Temp\\Unpack\\00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\blyt\\"; - protected string TempUnpackIconBrlytPath = Path.GetTempPath() + "CustomizeMii_Temp\\Unpack\\00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\blyt\\"; - protected string TempUnpackBannerBrlanPath = Path.GetTempPath() + "CustomizeMii_Temp\\Unpack\\00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\anim\\"; - protected string TempUnpackIconBrlanPath = Path.GetTempPath() + "CustomizeMii_Temp\\Unpack\\00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\anim\\"; - protected string[] ButtonTexts = new string[] { "Create WAD!", "Fire!", "Go Go Go!", "Let's do it!", "What are you waitin' for?", "I want my Channel!", "Houston, We've Got a Problem!", "Error, please contact anyone!", "Isn't she sweet?", "Is that milk?", "In your face!", "_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_", "Wo ist der Notausgang?", "Take me to a higher place!", "What's goin' on?", "I'm a Button!", "Click!", "Today's date is " + DateTime.Now.ToShortDateString(), "Launch Time: " + DateTime.Now.ToLongTimeString() }; - protected string[] SourceWadUrls = new string[] { "http://wadder.net/bases/StaticBase.wad", "http://wadder.net/bases/GenesisGX.wad", "http://wadder.net/bases/MP-CE-Std.wad", "http://wadder.net/bases/MP-CE-Ext.wad", "http://wadder.net/bases/SNES9XGX.wad", "http://wadder.net/bases/FCEUGX-wilsoff.wad", "http://wadder.net/bases/FCEUGX.wad", "http://wadder.net/bases/Wii64.wad", "http://wadder.net/bases/WiiSXFull.wad", "http://wadder.net/bases/WiiSXRetro.wad", "http://wadder.net/bases/WADderBase1.wad", "http://wadder.net/bases/WADderBase2.wad", "http://wadder.net/bases/WADderBase3.wad", "http://wadder.net/bases/UniiLoader.wad", "http://wadder.net/bases/BackupChannel.wad" }; - protected string[] SourceWadPreviewUrls = new string[] { "http://www.youtube.com/watch?v=pFNKldTYQq0", "http://www.youtube.com/watch?v=p9A6iEQvv9w", "http://www.youtube.com/watch?v=Up1RZebUc_U", "http://www.youtube.com/watch?v=Up1RZebUc_U", "http://www.youtube.com/watch?v=P-Mxd6DMvFY", "http://www.youtube.com/watch?v=wrbrg-DH_h4", "http://www.youtube.com/watch?v=MfiVbQaiXw8", "http://www.youtube.com/watch?v=krCQ2J7ZH8Y", "http://www.youtube.com/watch?v=rZC1DKUM6QI", "http://www.youtube.com/watch?v=Uiy8w-bp1kI", "http://www.youtube.com/watch?v=BbSYCSI8tz8", "http://www.youtube.com/watch?v=PIFZevHQ8lQ", "http://www.youtube.com/watch?v=OIhvDNjphhc", "http://www.youtube.com/watch?v=KLcncEArQLY&NR=1", "http://www.youtube.com/watch?v=xE_EgdCRV1I" }; - private string BannerTplPath = string.Empty; - private string IconTplPath = string.Empty; - private string SourceWad = string.Empty; - private string BannerBrlytPath = string.Empty; - private string IconBrlytPath = string.Empty; - private string BannerBrlanPath = string.Empty; - private string IconBrlanPath = string.Empty; - private string BannerReplace = string.Empty; - private string IconReplace = string.Empty; - private string SoundReplace = string.Empty; - private int NandLoader = 0; - private TextBox tbToChange; - private string textToChange; - private bool BrlytChanged = false; - private bool BrlanChanged = false; - private int ProgressValue; - private string ProgressState; - private EventHandler ProgressUpdate; - private ToolTip TTip = new ToolTip(); - private int UnpackFolderErrorCount = 0; - private Stopwatch CreationTimer = new Stopwatch(); - List Transparents = new List(); - - public CustomizeMii_Main() - { - InitializeComponent(); - this.Icon = global::CustomizeMii.Properties.Resources.CustomizeMii; - } - - private void CustomizeMii_Main_Load(object sender, EventArgs e) - { - InitializeStartup(); - CommonKeyCheck(); - } - - private void CustomizeMii_Main_FormClosing(object sender, FormClosingEventArgs e) - { - if (Directory.Exists(Path.GetTempPath() + "CustomizeMii_Temp")) Directory.Delete(Path.GetTempPath() + "CustomizeMii_Temp", true); - } - - private void InitializeStartup() - { - this.Text = this.Text.Replace("X", Version); - this.lbCreditVersion.Text = this.lbCreditVersion.Text.Replace("X", Version); - ProgressUpdate = new EventHandler(this.UpdateProgress); - SetButtonText(); - cmbNandLoader.SelectedIndex = 0; - cmbFormatBanner.SelectedIndex = 0; - cmbFormatIcon.SelectedIndex = 0; - cmbReplace.SelectedIndex = 0; - pbProgress.Value = 100; - BrlanChanged = false; - BrlytChanged = false; - UpdateCheck(); - DisableControls(null, null); - SetToolTips(); - btnBrowseDol.Text = "Browse..."; - btnBrowseSound.Text = "Browse..."; - rtbInstructions.Rtf = Properties.Resources.Instructions; - rtbInstructions.LinkClicked += new LinkClickedEventHandler(rtbInstructions_LinkClicked); - } - - void rtbInstructions_LinkClicked(object sender, LinkClickedEventArgs e) - { - try - { - Process.Start(e.LinkText); - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - - private void CommonKeyCheck() - { - if (!File.Exists(Application.StartupPath + "\\common-key.bin") && !File.Exists(Application.StartupPath + "\\key.bin")) - { - CustomizeMii_InputBox ib = new CustomizeMii_InputBox(); - - if (ib.ShowDialog() == DialogResult.OK) - { - Wii.Tools.CreateCommonKey(ib.Input, Application.StartupPath); - } - } - else - { - if (File.Exists(Application.StartupPath + "\\common-key.bin")) - { - if (Wii.Tools.CheckCommonKey(Application.StartupPath + "\\common-key.bin") == false) - { - File.Delete(Application.StartupPath + "\\common-key.bin"); - CommonKeyCheck(); - } - } - else if (File.Exists(Application.StartupPath + "\\key.bin")) - { - if (Wii.Tools.CheckCommonKey(Application.StartupPath + "\\key.bin") == false) - { - File.Delete(Application.StartupPath + "\\key.bin"); - CommonKeyCheck(); - } - } - } - } - - private void Initialize(object sender, EventArgs e) - { - InitializeStartup(); - ClearAll(); - } - - private void ClearAll() - { - tbAllLanguages.Text = string.Empty; - tbDol.Text = string.Empty; - tbDutch.Text = string.Empty; - tbEnglish.Text = string.Empty; - tbFrench.Text = string.Empty; - tbGerman.Text = string.Empty; - tbItalian.Text = string.Empty; - tbJapanese.Text = string.Empty; - tbReplace.Text = string.Empty; - tbSound.Text = string.Empty; - tbSourceWad.Text = string.Empty; - tbSpanish.Text = string.Empty; - tbTitleID.Text = string.Empty; - - BannerReplace = string.Empty; - IconReplace = string.Empty; - SoundReplace = string.Empty; - SourceWad = string.Empty; - BannerTplPath = string.Empty; - IconTplPath = string.Empty; - - lbxBannerTpls.Items.Clear(); - lbxBrlanBanner.Items.Clear(); - lbxBrlanIcon.Items.Clear(); - lbxBrlytBanner.Items.Clear(); - lbxBrlytIcon.Items.Clear(); - lbxIconTpls.Items.Clear(); - - cbLz77.Checked = false; - cbIconMakeTransparent.Checked = false; - cbBannerMakeTransparent.Checked = false; - } - - private void SetToolTips() - { - TTip.SetToolTip(btnCreateWad, "Create WAD..."); - TTip.SetToolTip(btnBrowseSource, "Browse for a WAD that is used as a Base..."); - TTip.SetToolTip(btnLoadBaseWad, "Load the selected Base WAD..."); - TTip.SetToolTip(btnPreviewBaseWad, "Preview the selected Base WAD, a Browserwindow will be opened..."); - TTip.SetToolTip(btnSaveBaseWad, "Download and save the selected Base WAD to your HDD..."); - TTip.SetToolTip(btnBrowseReplace, "Browse for a Banner / Icon / Sound to use instead of the one within the Base WAD...\nWAD's, 00000000.app's and banner.bin's / icon.bin's / sound.bin's can be loaded..."); - TTip.SetToolTip(btnClearReplace, "Clear the replaced Banner / Icon / Sound and use the one within the Base WAD..."); - TTip.SetToolTip(btnBrowseDol, "Browse for a DOL file that will be inserted into the WAD..."); - TTip.SetToolTip(btnBrowseSound, "Browse for a WAV sound that will be inserted into the WAD..."); - TTip.SetToolTip(btnAddBanner, "Add an image or TPL to the Banner..."); - TTip.SetToolTip(btnAddIcon, "Add an image or TPL to the Icon..."); - TTip.SetToolTip(btnDeleteBanner, "Delete the selected TPL...\nRequired TPLs can't be deleted..."); - TTip.SetToolTip(btnDeleteIcon, "Delete the selected TPL...\nRequired TPLs can't be deleted..."); - TTip.SetToolTip(btnReplaceBanner, "Replace the selected TPL with any image...\nThe image wil be stretched to fit the size of the TPL..."); - TTip.SetToolTip(btnReplaceIcon, "Replace the selected TPL with any image...\nThe image wil be stretched to fit the size of the TPL..."); - TTip.SetToolTip(btnExtractBanner, "Extract the selected TPL as an image..."); - TTip.SetToolTip(btnExtractIcon, "Extract the selected TPL as an image..."); - TTip.SetToolTip(btnPreviewBanner, "Preview the selected TPL..."); - TTip.SetToolTip(btnPreviewIcon, "Preview the selected TPL..."); - TTip.SetToolTip(btnBrlytReplace, "Replace the selected brlyt with any other...\nThis is for advanced users only!"); - TTip.SetToolTip(btnBrlytExtract, "Extract the selected brlyt..."); - TTip.SetToolTip(btnBrlytListTpls, "List the TPLs required by the selected brlyt..."); - TTip.SetToolTip(btnBrlanAdd, "Add a brlan file...\nThis is for advanced users only!"); - TTip.SetToolTip(btnBrlanDelete, "Delete the selected brlan file...\nThis is for advanced users only!"); - TTip.SetToolTip(btnBrlanReplace, "Replace the selected brlan file...\nThis is for advanced users only!"); - TTip.SetToolTip(btnBrlanExtract, "Extract the selected brlan file..."); - - TTip.SetToolTip(cbLz77, "Use Lz77 compression for the banner.bin, icon.bin and sound.bin...\nIf the created WAD does not work, try it without compression first..."); - } - - private void SetButtonText() - { - Random randomize = new Random(); - btnCreateWad.Text = ButtonTexts[randomize.Next(0, ButtonTexts.Length - 1)]; - } - - private void ErrorBox(string message) - { - MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - - private void InfoBox(string message) - { - MessageBox.Show(message, "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - - private bool CheckInet() - { - try - { - System.Net.IPHostEntry IpHost = System.Net.Dns.GetHostEntry("www.google.com"); - return true; - } - catch - { - return false; - } - } - - private void UpdateProgress(object sender, EventArgs e) - { - pbProgress.Value = ProgressValue; - - if (!string.IsNullOrEmpty(ProgressState)) - lbStatusText.Text = ProgressState; - } - - private void AddBannerTpls(object sender, EventArgs e) - { - try - { - string[] BannerTpls; - if (string.IsNullOrEmpty(BannerReplace)) - BannerTpls = Directory.GetFiles(TempUnpackBannerTplPath); - else - BannerTpls = Directory.GetFiles(TempBannerPath + "arc\\timg"); - - AddBannerTpls(BannerTpls); - } - catch { } - } - - private void AddIconTpls(object sender, EventArgs e) - { - try - { - string[] IconTpls; - if (string.IsNullOrEmpty(IconReplace)) - IconTpls = Directory.GetFiles(TempUnpackIconTplPath); - else - IconTpls = Directory.GetFiles(TempIconPath + "arc\\timg"); - - AddIconTpls(IconTpls); - } - catch { } - } - - private void AddBannerTpls(string[] tpls) - { - if (tpls.Length > 0) - { - lbxBannerTpls.Items.Clear(); - BannerTplPath = tpls[0].Remove(tpls[0].LastIndexOf('\\') + 1); - - for (int i = 0; i < tpls.Length; i++) - { - if (Transparents.Contains(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1))) - lbxBannerTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1) + " (Transparent)"); - else - lbxBannerTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1)); - } - } - } - - private void AddIconTpls(string[] tpls) - { - if (tpls.Length > 0) - { - lbxIconTpls.Items.Clear(); - IconTplPath = tpls[0].Remove(tpls[0].LastIndexOf('\\') + 1); - - for (int i = 0; i < tpls.Length; i++) - { - if (Transparents.Contains(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1))) - lbxIconTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1) + " (Transparent)"); - else - lbxIconTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1)); - } - } - } - - private void AddBannerBrlyt(string[] brlyt) - { - if (brlyt.Length > 0) - { - lbxBrlytBanner.Items.Clear(); - BannerBrlytPath = brlyt[0].Remove(brlyt[0].LastIndexOf('\\') + 1); - - for (int i = 0; i < brlyt.Length; i++) - { - lbxBrlytBanner.Items.Add(brlyt[i].Remove(0, brlyt[i].LastIndexOf('\\') + 1)); - } - } - } - - private void AddIconBrlyt(string[] brlyt) - { - if (brlyt.Length > 0) - { - lbxBrlytIcon.Items.Clear(); - IconBrlytPath = brlyt[0].Remove(brlyt[0].LastIndexOf('\\') + 1); - - for (int i = 0; i < brlyt.Length; i++) - { - lbxBrlytIcon.Items.Add(brlyt[i].Remove(0, brlyt[i].LastIndexOf('\\') + 1)); - } - } - } - - private void AddBannerBrlan(string[] brlan) - { - if (brlan.Length > 0) - { - lbxBrlanBanner.Items.Clear(); - BannerBrlanPath = brlan[0].Remove(brlan[0].LastIndexOf('\\') + 1); - - for (int i = 0; i < brlan.Length; i++) - { - lbxBrlanBanner.Items.Add(brlan[i].Remove(0, brlan[i].LastIndexOf('\\') + 1)); - } - } - } - - private void AddIconBrlan(string[] brlan) - { - if (brlan.Length > 0) - { - lbxBrlanIcon.Items.Clear(); - IconBrlanPath = brlan[0].Remove(brlan[0].LastIndexOf('\\') + 1); - - for (int i = 0; i < brlan.Length; i++) - { - lbxBrlanIcon.Items.Add(brlan[i].Remove(0, brlan[i].LastIndexOf('\\') + 1)); - } - } - } - - private void SetText(TextBox tb, string text) - { - EventHandler ChangeText = new EventHandler(this.ChangeText); - tbToChange = tb; - textToChange = text; - this.Invoke(ChangeText); - } - - private string GetCurBannerPath() - { - if (string.IsNullOrEmpty(BannerReplace)) - return TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\"; - else - return TempBannerPath + "arc\\"; - } - - private string GetCurIconPath() - { - if (string.IsNullOrEmpty(IconReplace)) - return TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\"; - else - return TempIconPath + "arc\\"; - } - - private void ChangeText(object sender, EventArgs e) - { - tbToChange.Text = textToChange; - } - - private void SetSourceWad(object sender, EventArgs e) - { - tbSourceWad.Text = SourceWad; - } - - private void tabControl_Selecting(object sender, TabControlCancelEventArgs e) - { - if (tabControl.SelectedTab == tabBanner) - { - lbxBannerTpls.SelectedIndex = -1; - cbBannerMakeTransparent.Checked = false; - cbBannerMakeTransparent.Enabled = false; - AddBannerTpls(null, null); - } - else if (tabControl.SelectedTab == tabIcon) - { - lbxIconTpls.SelectedIndex = -1; - cbIconMakeTransparent.Checked = false; - cbIconMakeTransparent.Enabled = false; - AddIconTpls(null, null); - } - else if (tabControl.SelectedTab == tabBrlyt) - { - try - { - string[] BannerBrlyt; - if (string.IsNullOrEmpty(BannerReplace)) - BannerBrlyt = Directory.GetFiles(TempUnpackBannerBrlytPath); - else - BannerBrlyt = Directory.GetFiles(TempBannerPath + "arc\\blyt"); - - string[] IconBrlyt; - if (string.IsNullOrEmpty(IconReplace)) - IconBrlyt = Directory.GetFiles(TempUnpackIconBrlytPath); - else - IconBrlyt = Directory.GetFiles(TempIconPath + "arc\\blyt"); - - AddBannerBrlyt(BannerBrlyt); - AddIconBrlyt(IconBrlyt); - - if (lbxBrlytBanner.SelectedIndex == -1 && lbxBrlytIcon.SelectedIndex == -1) - { - if (lbxBrlytBanner.Items.Count > 0) lbxBrlytBanner.SelectedIndex = 0; - else if (lbxBrlytIcon.Items.Count > 0) lbxBrlytIcon.SelectedIndex = 0; - } - } - catch { } - } - else if (tabControl.SelectedTab == tabBrlan) - { - try - { - string[] BannerBrlan; - if (string.IsNullOrEmpty(BannerReplace)) - BannerBrlan = Directory.GetFiles(TempUnpackBannerBrlanPath); - else - BannerBrlan = Directory.GetFiles(TempBannerPath + "arc\\anim"); - - string[] IconBrlan; - if (string.IsNullOrEmpty(IconReplace)) - IconBrlan = Directory.GetFiles(TempUnpackIconBrlanPath); - else - IconBrlan = Directory.GetFiles(TempIconPath + "arc\\anim"); - - AddBannerBrlan(BannerBrlan); - AddIconBrlan(IconBrlan); - - if (lbxBrlanBanner.SelectedIndex == -1 && lbxBrlanIcon.SelectedIndex == -1) - { - if (lbxBrlanBanner.Items.Count > 0) lbxBrlanBanner.SelectedIndex = 0; - else if (lbxBrlanIcon.Items.Count > 0) lbxBrlanIcon.SelectedIndex = 0; - } - } - catch { } - } - } - - private void lbStatusText_TextChanged(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(lbStatusText.Text) && pbProgress.Value == 100) - { - if (tabControl.SelectedTab == tabBanner) - { - try - { - string[] BannerTpls; - if (string.IsNullOrEmpty(BannerReplace)) - BannerTpls = Directory.GetFiles(TempUnpackBannerTplPath); - else - BannerTpls = Directory.GetFiles(TempBannerPath + "arc\\timg"); - - AddBannerTpls(BannerTpls); - } - catch { } - } - else if (tabControl.SelectedTab == tabIcon) - { - try - { - string[] IconTpls; - if (string.IsNullOrEmpty(IconReplace)) - IconTpls = Directory.GetFiles(TempUnpackIconTplPath); - else - IconTpls = Directory.GetFiles(TempIconPath + "arc\\timg"); - - AddIconTpls(IconTpls); - } - catch { } - } - else if (tabControl.SelectedTab == tabBrlyt) - { - try - { - string[] BannerBrlyt; - if (string.IsNullOrEmpty(BannerReplace)) - BannerBrlyt = Directory.GetFiles(TempUnpackBannerBrlytPath); - else - BannerBrlyt = Directory.GetFiles(TempBannerPath + "arc\\blyt"); - - string[] IconBrlyt; - if (string.IsNullOrEmpty(IconReplace)) - IconBrlyt = Directory.GetFiles(TempUnpackIconBrlytPath); - else - IconBrlyt = Directory.GetFiles(TempIconPath + "arc\\blyt"); - - AddBannerBrlyt(BannerBrlyt); - AddIconBrlyt(IconBrlyt); - } - catch { } - } - else if (tabControl.SelectedTab == tabBrlan) - { - try - { - string[] BannerBrlan; - if (string.IsNullOrEmpty(BannerReplace)) - BannerBrlan = Directory.GetFiles(TempUnpackBannerBrlanPath); - else - BannerBrlan = Directory.GetFiles(TempBannerPath + "arc\\anim"); - - string[] IconBrlan; - if (string.IsNullOrEmpty(IconReplace)) - IconBrlan = Directory.GetFiles(TempUnpackIconBrlanPath); - else - IconBrlan = Directory.GetFiles(TempIconPath + "arc\\anim"); - - AddBannerBrlan(BannerBrlan); - AddIconBrlan(IconBrlan); - } - catch { } - } - } - } - - private Image ResizeImage(Image img, int x, int y) - { - Image newimage = new Bitmap(x, y); - using (Graphics gfx = Graphics.FromImage(newimage)) - { - gfx.DrawImage(img, 0, 0, x, y); - } - return newimage; - } - - private void MakeBannerTplsTransparent() - { - foreach (string thisTpl in lbxBannerTpls.Items) - { - if (thisTpl.EndsWith("(Transparent)")) - { - string Tpl = BannerTplPath + thisTpl.Replace(" (Transparent)", string.Empty); - byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); - int Width = Wii.TPL.GetTextureWidth(TplArray); - int Height = Wii.TPL.GetTextureHeight(TplArray); - - Image Img = new Bitmap(Width, Height); - Wii.TPL.ConvertToTPL(Img, Tpl, 5); - } - } - } - - private void MakeIconTplsTransparent() - { - foreach (string thisTpl in lbxIconTpls.Items) - { - if (thisTpl.EndsWith("(Transparent)")) - { - string Tpl = IconTplPath + thisTpl.Replace(" (Transparent)", string.Empty); - byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); - int Width = Wii.TPL.GetTextureWidth(TplArray); - int Height = Wii.TPL.GetTextureHeight(TplArray); - - Image Img = new Bitmap(Width, Height); - Wii.TPL.ConvertToTPL(Img, Tpl, 5); - } - } - } - - private void EnableControls(object sender, EventArgs e) - { - for (int i = 0; i < tabControl.TabCount; i++) - { - if (tabControl.TabPages[i] != tabSource) - { - foreach (Control Ctrl in tabControl.TabPages[i].Controls) - { - if (Ctrl is Button) Ctrl.Enabled = true; - else if ((Ctrl is TextBox) && (Ctrl.Tag != (object)"Disabled")) Ctrl.Enabled = true; - else if (Ctrl is CheckBox && Ctrl == cbLz77) Ctrl.Enabled = true; - else if (Ctrl is ComboBox) Ctrl.Enabled = true; - } - } - } - } - - private void DisableControls(object sender, EventArgs e) - { - for (int i = 0; i < tabControl.TabCount; i++) - { - if (tabControl.TabPages[i] != tabSource) - { - foreach (Control Ctrl in tabControl.TabPages[i].Controls) - { - if (Ctrl is Button) Ctrl.Enabled = false; - else if ((Ctrl is TextBox) && (Ctrl.Tag != (object)"Disabled")) Ctrl.Enabled = false; - else if (Ctrl is CheckBox) Ctrl.Enabled = false; - else if (Ctrl is ComboBox) Ctrl.Enabled = false; - } - } - } - } - - private void UpdateCheck() - { - if (CheckInet() == true) - { - try - { - WebClient GetVersion = new WebClient(); - string NewVersion = GetVersion.DownloadString("http://customizemii.googlecode.com/svn/version.txt"); //TODO: Replace - - int newVersion = Convert.ToInt32(NewVersion.Replace(".", string.Empty).Length == 2 ? (NewVersion.Replace(".", string.Empty) + "0") : NewVersion.Replace(".", string.Empty)); - int thisVersion = Convert.ToInt32(Version.Replace(".", string.Empty).Length == 2 ? (Version.Replace(".", string.Empty) + "0") : Version.Replace(".", string.Empty)); - - if (newVersion > thisVersion) - { - llbUpdateAvailabe.Text = llbUpdateAvailabe.Text.Replace("X", NewVersion); - llbUpdateAvailabe.Visible = true; - - if (MessageBox.Show("Version " + NewVersion + - " is availabe.\nDo you want the download page to be opened?", - "Update availabe", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == - DialogResult.Yes) - { - Process.Start("http://code.google.com/p/customizemii/downloads/list"); - } - } - } - catch { } - } - } - - private void llbSite_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - try - { - llbSite.LinkVisited = true; - Process.Start("http://customizemii.googlecode.com"); - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - - private void btnBrowseSource_Click(object sender, EventArgs e) - { - if (pbProgress.Value == 100) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "Wii Channels|*.wad"; - - if (ofd.ShowDialog() == DialogResult.OK) - { - SourceWad = ofd.FileName; - BackgroundWorker bwLoadChannel = new BackgroundWorker(); - bwLoadChannel.DoWork += new DoWorkEventHandler(bwLoadChannel_DoWork); - bwLoadChannel.ProgressChanged += new ProgressChangedEventHandler(bwLoadChannel_ProgressChanged); - bwLoadChannel.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwLoadChannel_RunWorkerCompleted); - bwLoadChannel.WorkerReportsProgress = true; - bwLoadChannel.RunWorkerAsync(ofd.FileName); - } - } - } - - void bwLoadChannel_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - pbProgress.Value = 100; - lbStatusText.Text = string.Empty; - } - - void bwLoadChannel_ProgressChanged(object sender, ProgressChangedEventArgs e) - { - ProgressValue = e.ProgressPercentage; - ProgressState = (string)e.UserState; - - this.Invoke(ProgressUpdate); - } - - void bwLoadChannel_DoWork(object sender, DoWorkEventArgs e) - { - try - { - BackgroundWorker bwLoadChannel = sender as BackgroundWorker; - EventHandler SetSourceWad = new EventHandler(this.SetSourceWad); - byte[] WadFile = Wii.Tools.LoadFileToByteArray((string)e.Argument); - - if (Directory.Exists(TempUnpackPath)) Directory.Delete(TempUnpackPath, true); - - bwLoadChannel.ReportProgress(0, "Loading WAD..."); - Wii.WadUnpack.UnpackWad(WadFile, TempUnpackPath); - if (Wii.U8.CheckU8(TempUnpackPath + "00000000.app") == false) - throw new Exception("CustomizeMii only edits Channel WADs!"); - - this.Invoke(SetSourceWad); - - bwLoadChannel.ReportProgress(25, "Loading 00000000.app..."); - Wii.U8.UnpackU8(TempUnpackPath + "00000000.app", TempUnpackPath + "00000000.app_OUT"); - - bwLoadChannel.ReportProgress(50, "Loading banner.bin..."); - Wii.U8.UnpackU8(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin", TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT"); - - bwLoadChannel.ReportProgress(75, "Loading icon.bin..."); - Wii.U8.UnpackU8(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin", TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT"); - - bwLoadChannel.ReportProgress(90, "Gathering Information..."); - string[] ChannelTitles = Wii.WadInfo.GetChannelTitles(WadFile); - string TitleID = Wii.WadInfo.GetTitleID(WadFile, 1); - - SetText(tbAllLanguages, ChannelTitles[1]); - - if (ChannelTitles[0] != ChannelTitles[1]) - SetText(tbJapanese, ChannelTitles[0]); - if (ChannelTitles[2] != ChannelTitles[1]) - SetText(tbGerman, ChannelTitles[2]); - if (ChannelTitles[3] != ChannelTitles[1]) - SetText(tbFrench, ChannelTitles[3]); - if (ChannelTitles[4] != ChannelTitles[1]) - SetText(tbSpanish, ChannelTitles[4]); - if (ChannelTitles[5] != ChannelTitles[1]) - SetText(tbItalian, ChannelTitles[5]); - if (ChannelTitles[6] != ChannelTitles[1]) - SetText(tbDutch, ChannelTitles[6]); - - SetText(tbTitleID, TitleID); - - EventHandler AddBannerTpls = new EventHandler(this.AddBannerTpls); - EventHandler AddIconTpls = new EventHandler(this.AddIconTpls); - this.Invoke(AddBannerTpls); - this.Invoke(AddIconTpls); - - bwLoadChannel.ReportProgress(100); - EventHandler EnableCtrls = new EventHandler(this.EnableControls); - this.Invoke(EnableCtrls); - } - catch (Exception ex) - { - if (Directory.Exists(TempUnpackPath)) Directory.Delete(TempUnpackPath, true); - SourceWad = string.Empty; - ErrorBox(ex.Message); - } - } - - private void btnLoadBaseWad_Click(object sender, EventArgs e) - { - if (lbxBaseWads.SelectedIndex != -1) - { - if (CheckInet() == true) - { - if (pbProgress.Value == 100) - { - try - { - SourceWad = SourceWadUrls[lbxBaseWads.SelectedIndex]; - tbSourceWad.Text = SourceWad; - WebClient Client = new WebClient(); - Client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Client_DownloadProgressChanged); - Client.DownloadFileCompleted += new AsyncCompletedEventHandler(Client_DownloadFileCompleted); - - lbStatusText.Text = "Downloading Base WAD..."; - pbProgress.Value = 0; - if (!Directory.Exists(TempWadPath.Remove(TempWadPath.LastIndexOf('\\')))) - Directory.CreateDirectory(TempWadPath.Remove(TempWadPath.LastIndexOf('\\'))); - Client.DownloadFileAsync(new Uri(SourceWad), TempWadPath); - } - catch (Exception ex) - { - tbSourceWad.Text = string.Empty; - ErrorBox(ex.Message); - } - } - - } - else - { - ErrorBox("You're not connected to the Internet!"); - } - } - } - - void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) - { - pbProgress.Value = e.ProgressPercentage; - } - - void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) - { - BackgroundWorker bwLoadChannel = new BackgroundWorker(); - bwLoadChannel.DoWork += new DoWorkEventHandler(bwLoadChannel_DoWork); - bwLoadChannel.ProgressChanged += new ProgressChangedEventHandler(bwLoadChannel_ProgressChanged); - bwLoadChannel.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwLoadChannel_RunWorkerCompleted); - bwLoadChannel.WorkerReportsProgress = true; - bwLoadChannel.RunWorkerAsync(TempWadPath); - } - - private void btnPreviewBaseWad_Click(object sender, EventArgs e) - { - if (lbxBaseWads.SelectedIndex != -1) - { - if (CheckInet() == true) - { - if (!string.IsNullOrEmpty(SourceWadPreviewUrls[lbxBaseWads.SelectedIndex])) - { - try - { - Process.Start(SourceWadPreviewUrls[lbxBaseWads.SelectedIndex]); - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - else - InfoBox("There's no preview of this channel availabe, sorry!"); - } - else - { - ErrorBox("You're not connected to the Internet!"); - } - } - } - - private void btnSaveBaseWad_Click(object sender, EventArgs e) - { - if (lbxBaseWads.SelectedIndex != -1) - { - if (CheckInet() == true) - { - if (pbProgress.Value == 100) - { - string Url = SourceWadUrls[lbxBaseWads.SelectedIndex]; - SaveFileDialog sfd = new SaveFileDialog(); - sfd.Filter = "Wii Channels|*.wad"; - sfd.FileName = Url.Remove(0, Url.LastIndexOf('/') + 1); - - if (sfd.ShowDialog() == DialogResult.OK) - { - try - { - WebClient SaveClient = new WebClient(); - SaveClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(SaveClient_DownloadProgressChanged); - SaveClient.DownloadFileCompleted += new AsyncCompletedEventHandler(SaveClient_DownloadFileCompleted); - - lbStatusText.Text = "Downloading Base WAD..."; - pbProgress.Value = 0; - SaveClient.DownloadFileAsync(new Uri(Url), sfd.FileName); - } - catch (Exception ex) - { - ErrorBox(ex.Message); - } - } - } - - } - else - { - ErrorBox("You're not connected to the Internet!"); - } - } - } - - void SaveClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) - { - pbProgress.Value = e.ProgressPercentage; - } - - void SaveClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) - { - lbStatusText.Text = string.Empty; - pbProgress.Value = 100; - } - - private void cmbReplace_SelectedIndexChanged(object sender, EventArgs e) - { - switch (cmbReplace.SelectedIndex) - { - case 1: - tbReplace.Text = IconReplace; - break; - case 2: - tbReplace.Text = SoundReplace; - break; - default: - tbReplace.Text = BannerReplace; - break; - } - } - - private void btnBrowseReplace_Click(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(tbSourceWad.Text)){ - if (pbProgress.Value == 100) - { - if (cmbReplace.SelectedIndex == 2) //sound - { - try - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "Wii Channels|*.wad|00000000.app|00000000.app|sound.bin|sound.bin|All|*.wad;00000000.app;sound.bin"; - ofd.FilterIndex = 4; - - if (ofd.ShowDialog() == DialogResult.OK) - { - SoundReplace = ofd.FileName; - SetText(tbReplace, SoundReplace); - BackgroundWorker bwSoundReplace = new BackgroundWorker(); - bwSoundReplace.DoWork += new DoWorkEventHandler(bwSoundReplace_DoWork); - bwSoundReplace.ProgressChanged += new ProgressChangedEventHandler(bwSoundReplace_ProgressChanged); - bwSoundReplace.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwSoundReplace_RunWorkerCompleted); - bwSoundReplace.WorkerReportsProgress = true; - bwSoundReplace.RunWorkerAsync(ofd.FileName); - } - } - catch (Exception ex) - { - SoundReplace = string.Empty; - SetText(tbReplace, SoundReplace); - ErrorBox(ex.Message); - } - } - else if (cmbReplace.SelectedIndex == 1) //icon - { - try - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "Wii Channels|*.wad|00000000.app|00000000.app|icon.bin|icon.bin|All|*.wad;00000000.app;icon.bin"; - ofd.FilterIndex = 4; - - if (ofd.ShowDialog() == DialogResult.OK) - { - IconReplace = ofd.FileName; - SetText(tbReplace, IconReplace); - BackgroundWorker bwIconReplace = new BackgroundWorker(); - bwIconReplace.DoWork += new DoWorkEventHandler(bwIconReplace_DoWork); - bwIconReplace.ProgressChanged += new ProgressChangedEventHandler(bwIconReplace_ProgressChanged); - bwIconReplace.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwIconReplace_RunWorkerCompleted); - bwIconReplace.WorkerReportsProgress = true; - bwIconReplace.RunWorkerAsync(ofd.FileName); - } - } - catch (Exception ex) - { - IconReplace = string.Empty; - SetText(tbReplace, IconReplace); - ErrorBox(ex.Message); - } - } - else //banner - { - try - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "Wii Channels|*.wad|00000000.app|00000000.app|banner.bin|banner.bin|All|*.wad;00000000.app;banner.bin"; - ofd.FilterIndex = 4; - - if (ofd.ShowDialog() == DialogResult.OK) - { - BannerReplace = ofd.FileName; - SetText(tbReplace, BannerReplace); - BackgroundWorker bwBannerReplace = new BackgroundWorker(); - bwBannerReplace.DoWork += new DoWorkEventHandler(bwBannerReplace_DoWork); - bwBannerReplace.ProgressChanged += new ProgressChangedEventHandler(bwBannerReplace_ProgressChanged); - bwBannerReplace.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwBannerReplace_RunWorkerCompleted); - bwBannerReplace.WorkerReportsProgress = true; - bwBannerReplace.RunWorkerAsync(ofd.FileName); - } - } - catch (Exception ex) - { - BannerReplace = string.Empty; - SetText(tbReplace, BannerReplace); - ErrorBox(ex.Message); - } - } - } - } - } - - void bwBannerReplace_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - pbProgress.Value = 100; - lbStatusText.Text = string.Empty; - SetText(tbReplace, BannerReplace); - } - - void bwBannerReplace_ProgressChanged(object sender, ProgressChangedEventArgs e) - { - ProgressValue = e.ProgressPercentage; - ProgressState = (string)e.UserState; - - this.Invoke(ProgressUpdate); - } - - void bwBannerReplace_DoWork(object sender, DoWorkEventArgs e) - { - try - { - BackgroundWorker bwBannerReplace = sender as BackgroundWorker; - string thisFile = (string)e.Argument; - if (Directory.Exists(TempTempPath)) Directory.Delete(TempTempPath, true); - if (Directory.Exists(TempBannerPath)) Directory.Delete(TempBannerPath, true); - - if (thisFile.EndsWith(".bin")) - { - bwBannerReplace.ReportProgress(0, "Loading banner.bin..."); - Wii.U8.UnpackU8(thisFile, TempBannerPath); - } - else if (thisFile.EndsWith(".app")) - { - bwBannerReplace.ReportProgress(0, "Loading 00000000.app..."); - Wii.U8.UnpackU8(thisFile, TempTempPath); - bwBannerReplace.ReportProgress(50, "Loading banner.bin..."); - Wii.U8.UnpackU8(TempTempPath + "meta\\banner.bin", TempBannerPath); - Directory.Delete(TempTempPath, true); - } - else - { - bwBannerReplace.ReportProgress(0, "Loading WAD..."); - Wii.WadUnpack.UnpackWad(thisFile, TempTempPath); - if (Wii.U8.CheckU8(TempTempPath + "00000000.app") == false) - throw new Exception("CustomizeMii only handles Channel WADs!"); - bwBannerReplace.ReportProgress(30, "Loading 00000000.app..."); - Wii.U8.UnpackU8(TempTempPath + "00000000.app", TempTempPath + "00000000.app_OUT"); - bwBannerReplace.ReportProgress(60, "Loading banner.bin..."); - Wii.U8.UnpackU8(TempTempPath + "00000000.app_OUT\\meta\\banner.bin", TempBannerPath); - Directory.Delete(TempTempPath, true); - } - - EventHandler AddBannerTpls = new EventHandler(this.AddBannerTpls); - EventHandler AddIconTpls = new EventHandler(this.AddIconTpls); - this.Invoke(AddBannerTpls); - this.Invoke(AddIconTpls); - } - catch (Exception ex) - { - if (Directory.Exists(TempTempPath)) Directory.Delete(TempTempPath, true); - if (Directory.Exists(TempBannerPath)) Directory.Delete(TempBannerPath, true); - BannerReplace = string.Empty; - ErrorBox(ex.Message); - } - } - - void bwIconReplace_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - pbProgress.Value = 100; - lbStatusText.Text = string.Empty; - SetText(tbReplace, IconReplace); - } - - void bwIconReplace_ProgressChanged(object sender, ProgressChangedEventArgs e) - { - ProgressValue = e.ProgressPercentage; - ProgressState = (string)e.UserState; - - this.Invoke(ProgressUpdate); - } - - void bwIconReplace_DoWork(object sender, DoWorkEventArgs e) - { - try - { - BackgroundWorker bwIconReplace = sender as BackgroundWorker; - string thisFile = (string)e.Argument; - if (Directory.Exists(TempTempPath)) Directory.Delete(TempTempPath, true); - if (Directory.Exists(TempIconPath)) Directory.Delete(TempIconPath, true); - - if (thisFile.EndsWith(".bin")) - { - bwIconReplace.ReportProgress(0, "Loading icon.bin..."); - Wii.U8.UnpackU8(thisFile, TempIconPath); - } - else if (thisFile.EndsWith(".app")) - { - bwIconReplace.ReportProgress(0, "Loading 00000000.app..."); - Wii.U8.UnpackU8(thisFile, TempTempPath); - bwIconReplace.ReportProgress(50, "Loading icon.bin..."); - Wii.U8.UnpackU8(TempTempPath + "meta\\icon.bin", TempIconPath); - Directory.Delete(TempTempPath, true); - } - else - { - bwIconReplace.ReportProgress(0, "Loading WAD..."); - Wii.WadUnpack.UnpackWad(thisFile, TempTempPath); - if (Wii.U8.CheckU8(TempTempPath + "00000000.app") == false) - throw new Exception("CustomizeMii only handles Channel WADs!"); - bwIconReplace.ReportProgress(30, "Loading 00000000.app..."); - Wii.U8.UnpackU8(TempTempPath + "00000000.app", TempTempPath + "00000000.app_OUT"); - bwIconReplace.ReportProgress(60, "Loading icon.bin..."); - Wii.U8.UnpackU8(TempTempPath + "00000000.app_OUT\\meta\\icon.bin", TempIconPath); - Directory.Delete(TempTempPath, true); - } - - EventHandler AddBannerTpls = new EventHandler(this.AddBannerTpls); - EventHandler AddIconTpls = new EventHandler(this.AddIconTpls); - this.Invoke(AddBannerTpls); - this.Invoke(AddIconTpls); - } - catch (Exception ex) - { - if (Directory.Exists(TempTempPath)) Directory.Delete(TempTempPath, true); - if (Directory.Exists(TempIconPath)) Directory.Delete(TempIconPath, true); - IconReplace = string.Empty; - ErrorBox(ex.Message); - } - } - - void bwSoundReplace_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - pbProgress.Value = 100; - lbStatusText.Text = string.Empty; - SetText(tbReplace, SoundReplace); - } - - void bwSoundReplace_ProgressChanged(object sender, ProgressChangedEventArgs e) - { - ProgressValue = e.ProgressPercentage; - ProgressState = (string)e.UserState; - - this.Invoke(ProgressUpdate); - } - - void bwSoundReplace_DoWork(object sender, DoWorkEventArgs e) - { - try - { - BackgroundWorker bwSoundReplace = sender as BackgroundWorker; - string thisFile = (string)e.Argument; - if (File.Exists(TempSoundPath)) File.Delete(TempSoundPath); - if (Directory.Exists(TempTempPath)) Directory.Delete(TempTempPath, true); - - if (thisFile.EndsWith(".bin")) - { - bwSoundReplace.ReportProgress(0, "Copying sound.bin..."); - File.Copy(thisFile, TempSoundPath); - } - else if (thisFile.EndsWith(".app")) - { - bwSoundReplace.ReportProgress(0, "Loading 00000000.app..."); - Wii.U8.UnpackU8(thisFile, TempTempPath); - bwSoundReplace.ReportProgress(80, "Copying sound.bin..."); - File.Copy(TempTempPath + "meta\\sound.bin", TempSoundPath); - Directory.Delete(TempTempPath, true); - } - else - { - bwSoundReplace.ReportProgress(0, "Loading WAD..."); - Wii.WadUnpack.UnpackWad(thisFile, TempTempPath); - if (Wii.U8.CheckU8(TempTempPath + "00000000.app") == false) - throw new Exception("CustomizeMii only handles Channel WADs!"); - bwSoundReplace.ReportProgress(50, "Loading 00000000.app..."); - Wii.U8.UnpackU8(TempTempPath + "00000000.app", TempTempPath + "00000000.app_OUT"); - bwSoundReplace.ReportProgress(90, "Copying sound.bin..."); - File.Copy(TempTempPath + "00000000.app_OUT\\meta\\sound.bin", TempSoundPath); - Directory.Delete(TempTempPath, true); - } - - SetText(tbSound, SoundReplace); - } - catch (Exception ex) - { - if (Directory.Exists(TempTempPath)) Directory.Delete(TempTempPath, true); - if (File.Exists(TempSoundPath)) File.Delete(TempSoundPath); - SoundReplace = string.Empty; - ErrorBox(ex.Message); - } - } - - private void btnClearReplace_Click(object sender, EventArgs e) - { - if (cmbReplace.SelectedIndex == 2) //sound - { - SoundReplace = string.Empty; - SetText(tbReplace, SoundReplace); - if (File.Exists(TempSoundPath)) File.Delete(TempSoundPath); - SetText(tbSound, string.Empty); - } - else if (cmbReplace.SelectedIndex == 1) //icon - { - IconReplace = string.Empty; - SetText(tbReplace, IconReplace); - if (Directory.Exists(TempIconPath)) Directory.Delete(TempIconPath, true); - } - else //banner - { - BannerReplace = string.Empty; - SetText(tbReplace, BannerReplace); - if (Directory.Exists(TempBannerPath)) Directory.Delete(TempBannerPath, true); - } - } - - private void btnBrowseDol_Click(object sender, EventArgs e) - { - if (btnBrowseDol.Text == "Clear") - { - SetText(tbDol, string.Empty); - btnBrowseDol.Text = "Browse..."; - } - else - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "DOL Files|*.dol"; - - if (ofd.ShowDialog() == DialogResult.OK) - { - SetText(tbDol, ofd.FileName); - btnBrowseDol.Text = "Clear"; - } - } - } - - private void btnBrowseSound_Click(object sender, EventArgs e) - { - if (btnBrowseSound.Text == "Clear") - { - SetText(tbSound, string.Empty); - btnBrowseSound.Text = "Browse..."; - } - else - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "Wave Files|*.wav"; - - if (ofd.ShowDialog() == DialogResult.OK) - { - SetText(tbSound, ofd.FileName); - btnBrowseSound.Text = "Clear"; - - if (!string.IsNullOrEmpty(SoundReplace)) - { - SoundReplace = string.Empty; - if (cmbReplace.SelectedIndex == 2) SetText(tbReplace, SoundReplace); - if (File.Exists(TempSoundPath)) File.Delete(TempSoundPath); - } - } - } - } - - private void lbxBannerTpls_SelectedIndexChanged(object sender, EventArgs e) - { - if (lbxBannerTpls.SelectedIndex != -1) - { - try - { - cbBannerMakeTransparent.Enabled = true; - cbBannerMakeTransparent.Checked = lbxBannerTpls.SelectedItem.ToString().EndsWith("(Transparent)"); - - string TplFile = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - int TplFormat = Wii.TPL.GetTextureFormat(TplFile); - - switch (TplFormat) - { - case 0: - cmbFormatBanner.SelectedIndex = 6; - break; - case 1: - cmbFormatBanner.SelectedIndex = 5; - break; - case 2: - cmbFormatBanner.SelectedIndex = 4; - break; - case 3: - cmbFormatBanner.SelectedIndex = 3; - break; - case 4: - cmbFormatBanner.SelectedIndex = 1; - break; - case 5: - cmbFormatBanner.SelectedIndex = 2; - break; - case 6: - cmbFormatBanner.SelectedIndex = 0; - break; - case 14: - cmbFormatBanner.SelectedIndex = 7; - break; - default: - cmbFormatBanner.SelectedIndex = -1; - break; - } - } - catch (Exception ex) - { - ErrorBox(ex.Message); - } - } - else - cbBannerMakeTransparent.Enabled = false; - } - - private void lbxIconTpls_SelectedIndexChanged(object sender, EventArgs e) - { - if (lbxIconTpls.SelectedIndex != -1) - { - try - { - cbIconMakeTransparent.Enabled = true; - cbIconMakeTransparent.Checked = lbxIconTpls.SelectedItem.ToString().EndsWith("(Transparent)"); - - string TplFile = IconTplPath + lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - int TplFormat = Wii.TPL.GetTextureFormat(TplFile); - - switch (TplFormat) - { - case 0: - cmbFormatIcon.SelectedIndex = 6; - break; - case 1: - cmbFormatIcon.SelectedIndex = 5; - break; - case 2: - cmbFormatIcon.SelectedIndex = 4; - break; - case 3: - cmbFormatIcon.SelectedIndex = 3; - break; - case 4: - cmbFormatIcon.SelectedIndex = 1; - break; - case 5: - cmbFormatIcon.SelectedIndex = 2; - break; - case 6: - cmbFormatIcon.SelectedIndex = 0; - break; - case 14: - cmbFormatIcon.SelectedIndex = 7; - break; - default: - cmbFormatIcon.SelectedIndex = -1; - break; - } - } - catch (Exception ex) - { - ErrorBox(ex.Message); - } - } - else - cbIconMakeTransparent.Enabled = false; - } - - private void btnReplaceBanner_Click(object sender, EventArgs e) - { - if (lbxBannerTpls.SelectedIndex != -1) - { - int Format = cmbFormatBanner.SelectedIndex; - - if (Format == 0 || Format == 1 || Format == 2) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "Png|*.png|JPG|*.jpg|GIF|*.gif|BMP|*.bmp|TPL|*.tpl|All|*.png;*.jpg;*.gif;*.bmp;*.tpl"; - ofd.FilterIndex = 6; - - if (ofd.ShowDialog() == DialogResult.OK) - { - try - { - string Tpl = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); - Image Img; - - if (!ofd.FileName.EndsWith(".tpl")) Img = Image.FromFile(ofd.FileName); - else Img = Wii.TPL.ConvertFromTPL(ofd.FileName); - - int TplFormat; - int X = Wii.TPL.GetTextureWidth(TplArray); - int Y = Wii.TPL.GetTextureHeight(TplArray); - - if (X != Img.Width || - Y != Img.Height) - { - Img = ResizeImage(Img, X, Y); - } - - switch (Format) - { - case 1: - TplFormat = 4; - break; - case 2: - TplFormat = 5; - break; - default: - TplFormat = 6; - break; - } - - Wii.TPL.ConvertToTPL(Img, Tpl, TplFormat); - } - catch (Exception ex) - { - ErrorBox(ex.Message); - } - } - } - else - { - ErrorBox("This format is not supported, you must choose either RGBA8, RGB565 or RGB5A3!"); - } - } - } - - private void btnExtractBanner_Click(object sender, EventArgs e) - { - if (lbxBannerTpls.SelectedIndex != -1) - { - SaveFileDialog sfd = new SaveFileDialog(); - sfd.Filter = "Png|*.png|JPG|*.jpg|GIF|*.gif|BMP|*.bmp|TPL|*.tpl|All|*.png;*.jpg;*.gif;*.bmp;*.tpl"; - sfd.FilterIndex = 6; - - if (sfd.ShowDialog() == DialogResult.OK) - { - try - { - if (!sfd.FileName.EndsWith(".tpl")) - { - string Tpl = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - Image Img = Wii.TPL.ConvertFromTPL(Tpl); - - switch (sfd.FileName.Remove(0, sfd.FileName.LastIndexOf('.'))) - { - case ".jpg": - Img.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); - break; - case ".gif": - Img.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Gif); - break; - case ".bmp": - Img.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Bmp); - break; - default: - Img.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Png); - break; - } - } - else - { - string Tpl = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - File.Copy(Tpl, sfd.FileName, true); - } - } - catch (Exception ex) - { - ErrorBox(ex.Message); - } - } - } - } - - private void btnPreviewBanner_Click(object sender, EventArgs e) - { - if (lbxBannerTpls.SelectedIndex != -1) - { - try - { - string Tpl = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - Image Img = Wii.TPL.ConvertFromTPL(Tpl); - - CustomizeMii_Preview pvw = new CustomizeMii_Preview(); - - if (Img.Width > 200) pvw.Width = Img.Width + 50; - else pvw.Width = 250; - if (Img.Height > 200) pvw.Height = Img.Height + 50; - else pvw.Height = 250; - - pvw.pbImage.Image = Img; - pvw.Text = "CustomizeMii - Preview (" + Img.Width.ToString() + " x " + Img.Height.ToString() + ")"; - - pvw.ShowDialog(); - } - catch (Exception ex) - { - ErrorBox(ex.Message); - } - } - } - - private void btnReplaceIcon_Click(object sender, EventArgs e) - { - if (lbxIconTpls.SelectedIndex != -1) - { - int Format = cmbFormatIcon.SelectedIndex; - - if (Format == 0 || Format == 1 || Format == 2) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "Png|*.png|JPG|*.jpg|GIF|*.gif|BMP|*.bmp|TPL|*.tpl|All|*.png;*.jpg;*.gif;*.bmp;*.tpl"; - ofd.FilterIndex = 6; - - if (ofd.ShowDialog() == DialogResult.OK) - { - try - { - string Tpl = IconTplPath + lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); - Image Img; - - if (!ofd.FileName.EndsWith(".tpl")) Img = Image.FromFile(ofd.FileName); - else Img = Wii.TPL.ConvertFromTPL(ofd.FileName); - - int TplFormat; - int X = Wii.TPL.GetTextureWidth(TplArray); - int Y = Wii.TPL.GetTextureHeight(TplArray); - - if (X != Img.Width || - Y != Img.Height) - { - Img = ResizeImage(Img, X, Y); - } - - switch (Format) - { - case 1: - TplFormat = 4; - break; - case 2: - TplFormat = 5; - break; - default: - TplFormat = 6; - break; - } - - Wii.TPL.ConvertToTPL(Img, Tpl, TplFormat); - } - catch (Exception ex) - { - ErrorBox(ex.Message); - } - } - } - else - { - ErrorBox("This format is not supported, you must choose either RGBA8, RGB565 or RGB5A3!"); - } - } - } - - private void btnExtractIcon_Click(object sender, EventArgs e) - { - if (lbxIconTpls.SelectedIndex != -1) - { - SaveFileDialog sfd = new SaveFileDialog(); - sfd.Filter = "Png|*.png|JPG|*.jpg|GIF|*.gif|BMP|*.bmp|TPL|*.tpl|All|*.png;*.jpg;*.gif;*.bmp;*.tpl"; - sfd.FilterIndex = 6; - - if (sfd.ShowDialog() == DialogResult.OK) - { - try - { - if (!sfd.FileName.EndsWith(".tpl")) - { - string Tpl = IconTplPath + lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - Image Img = Wii.TPL.ConvertFromTPL(Tpl); - - switch (sfd.FileName.Remove(0, sfd.FileName.LastIndexOf('.'))) - { - case ".jpg": - Img.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); - break; - case ".gif": - Img.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Gif); - break; - case ".bmp": - Img.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Bmp); - break; - default: - Img.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Png); - break; - } - } - else - { - string Tpl = IconTplPath + lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - File.Copy(Tpl, sfd.FileName, true); - } - } - catch (Exception ex) - { - ErrorBox(ex.Message); - } - } - } - } - - private void btnPreviewIcon_Click(object sender, EventArgs e) - { - if (lbxIconTpls.SelectedIndex != -1) - { - try - { - string Tpl = IconTplPath + lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - Image Img = Wii.TPL.ConvertFromTPL(Tpl); - - CustomizeMii_Preview pvw = new CustomizeMii_Preview(); - - if (Img.Width > 200) pvw.Width = Img.Width + 50; - else pvw.Width = 250; - if (Img.Height > 200) pvw.Height = Img.Height + 50; - else pvw.Height = 250; - - pvw.pbImage.Image = Img; - pvw.Text = "CustomizeMii - Preview (" + Img.Width.ToString() + " x " + Img.Height.ToString() + ")"; - - pvw.ShowDialog(); - } - catch (Exception ex) - { - ErrorBox(ex.Message); - } - } - } - - private bool FailureCheck() - { - try - { - //Check Unpack Folder - if (CheckUnpackFolder() == false) - { - if (UnpackFolderErrorCount > 0) - { - ErrorBox("Something's wrong with the temporary files.\nYou may have to start again." + - "\n\nIf this message keeps bothering you, please report as much information " + - "as possible at the issue tracker: http://code.google.com/p/customizemii/issues/list"); - } - else - { - ErrorBox("Something's wrong with the temporary files.\nYou may have to start again."); - } - - UnpackFolderErrorCount++; - return false; - } - - //Check Channel Title Boxes - if (!(!string.IsNullOrEmpty(tbAllLanguages.Text) || - (!string.IsNullOrEmpty(tbEnglish.Text) && - !string.IsNullOrEmpty(tbJapanese.Text) && - !string.IsNullOrEmpty(tbGerman.Text) && - !string.IsNullOrEmpty(tbFrench.Text) && - !string.IsNullOrEmpty(tbSpanish.Text) && - !string.IsNullOrEmpty(tbItalian.Text) && - !string.IsNullOrEmpty(tbDutch.Text)))) - { - ErrorBox("You must either enter a general Channel Title or one for each language!"); - return false; - } - - //Check Title ID Length + Chars - if (tbTitleID.Text.Length != 4) - { - ErrorBox("The Title ID must be 4 characters long!"); return false; - } - - Regex allowedchars = new Regex("[A-Z0-9]{4}$"); - if (!allowedchars.IsMatch(tbTitleID.Text.ToUpper())) - { - ErrorBox("Please enter a valid Title ID!"); return false; - } - - //Check brlan files - string[] ValidBrlans = new string[] { "banner.brlan", "icon.brlan", "banner_Loop.brlan", "icon_Loop.brlan", "banner_Start.brlan", "icon_Start.brlan" }; - foreach (string thisBrlan in lbxBrlanBanner.Items) - { - if (!Wii.Tools.StringExistsInStringArray(thisBrlan, ValidBrlans)) - { - ErrorBox(thisBrlan + " is not a valid brlan filename!"); - return false; - } - } - foreach (string thisBrlan in lbxBrlanIcon.Items) - { - if (!Wii.Tools.StringExistsInStringArray(thisBrlan, ValidBrlans)) - { - ErrorBox(thisBrlan + " is not a valid brlan filename!"); - return false; - } - } - - //Check TPLs - List BannerTpls = new List(); - List IconTpls = new List(); - foreach (string thisTpl in lbxBannerTpls.Items) BannerTpls.Add(thisTpl.Replace(" (Transparent)", string.Empty)); - foreach (string thisTpl in lbxIconTpls.Items) IconTpls.Add(thisTpl.Replace(" (Transparent)", string.Empty)); - - string[] BannerBrlytPath; - string[] IconBrlytPath; - - if (string.IsNullOrEmpty(BannerReplace)) - BannerBrlytPath = Directory.GetFiles(TempUnpackBannerBrlytPath); - else - BannerBrlytPath = Directory.GetFiles(TempBannerPath + "arc\\blyt"); - if (string.IsNullOrEmpty(IconReplace)) - IconBrlytPath = Directory.GetFiles(TempUnpackIconBrlytPath); - else - IconBrlytPath = Directory.GetFiles(TempIconPath + "arc\\blyt"); - - string[] BannerMissing; - string[] BannerUnused; - string[] IconMissing; - string[] IconUnused; - - //Check for missing TPLs - if (Wii.Brlyt.CheckForMissingTpls(BannerBrlytPath[0], BannerTpls.ToArray(), out BannerMissing) == true) - { - ErrorBox("The following Banner TPLs are required by the banner.brlyt, but missing:\n\n" + string.Join("\n", BannerMissing)); - return false; - } - if (Wii.Brlyt.CheckForMissingTpls(IconBrlytPath[0], IconTpls.ToArray(), out IconMissing) == true) - { - ErrorBox("The following Icon TPLs are required by the icon.brlyt, but missing:\n\n" + string.Join("\n", IconMissing)); - return false; - } - - //Check Sound length - int soundlength = -1; - if (!string.IsNullOrEmpty(tbSound.Text) && string.IsNullOrEmpty(SoundReplace)) - { - soundlength = Wii.Sound.GetWaveLength(tbSound.Text); - if (soundlength > SoundMaxLength) - { - ErrorBox(string.Format("Your Sound is longer than {0} seconds and thus not supported.\nIt is recommended to use a Sound shorter than {1} seconds, the maximum length is {0} seconds!", SoundMaxLength, SoundWarningLength)); - return false; - } - } - - /*Errors till here.. - From here only Warnings!*/ - - if (soundlength != -1) - { - if (soundlength > SoundWarningLength) - { - if (MessageBox.Show(string.Format("Your Sound is longer than {0} seconds.\nIt is recommended to use Sounds that are shorter than {0} seconds!\nDo you still want to continue?", SoundWarningLength), "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) - return false; - } - } - - //Check if brlyt or brlan were changed - if (BrlytChanged == true && BrlanChanged == false) - { - if (MessageBox.Show("You have changed the brlyt, but didn't change the brlan.\nAre you sure this is correct?", "brlyt Changed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) - return false; - } - else if (BrlanChanged == true && BrlytChanged == false) - { - if (MessageBox.Show("You have changed the brlan, but didn't change the brlyt.\nAre you sure this is correct?", "brlan Changed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) - return false; - } - - //Check for unused TPLs (Do this at the end of the failure checks, because we don't want a - // MessageBox asking if unused TPLs should be deleted and after that any error) - if (Wii.Brlyt.CheckForUnusedTpls(BannerBrlytPath[0], BannerTpls.ToArray(), out BannerUnused) == true) - { - DialogResult dlgresult = MessageBox.Show( - "The following Banner TPLs are unused by the banner.brlyt:\n\n" + - string.Join("\n", BannerUnused) + - "\n\nDo you want them to be deleted before the WAD is being created? (Saves space!)", - "Delete unused TPLs?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); - if (dlgresult == DialogResult.Yes) - { - foreach (string thisTpl in BannerUnused) - { - if (string.IsNullOrEmpty(BannerReplace)) - File.Delete(TempUnpackBannerTplPath + thisTpl); - else - File.Delete(TempBannerPath + "arc\\timg\\" + thisTpl); - } - } - else if (dlgresult == DialogResult.Cancel) return false; - } - if (Wii.Brlyt.CheckForUnusedTpls(IconBrlytPath[0], IconTpls.ToArray(), out IconUnused) == true) - { - DialogResult dlgresult = MessageBox.Show( - "The following Icon TPLs are unused by the icon.brlyt:\n\n" + - string.Join("\n", IconUnused) + - "\n\nDo you want them to be deleted before the WAD is being created? (Saves memory!)", - "Delete unused TPLs?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); - if (dlgresult == DialogResult.Yes) - { - foreach (string thisTpl in IconUnused) - { - if (string.IsNullOrEmpty(IconReplace)) - File.Delete(TempUnpackIconTplPath + thisTpl); - else - File.Delete(TempIconPath + "arc\\timg\\" + thisTpl); - } - } - else if (dlgresult == DialogResult.Cancel) return false; - } - - return true; - } - catch (Exception ex) - { - ErrorBox(ex.Message); - return false; - } - } - - private bool CheckUnpackFolder() - { - try - { - //Check Unpack Root - string[] RootFiles = Directory.GetFiles(TempUnpackPath); - string[] RootDirs = Directory.GetDirectories(TempUnpackPath); - - foreach (string thisFile in RootFiles) - { - if (!thisFile.EndsWith(".app") && - !thisFile.EndsWith(".cert") && - !thisFile.EndsWith(".tik") && - !thisFile.EndsWith(".tmd")) - File.Delete(thisFile); - } - - if (RootDirs.Length > 1) - { - foreach (string thisDir in RootDirs) - { - if (!thisDir.EndsWith("00000000.app_OUT")) - Directory.Delete(thisDir, true); - } - } - - //Check 00000000.app_OUT - string[] MetaFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT"); - string[] MetaDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT"); - - foreach (string thisFile in MetaFiles) - File.Delete(thisFile); - foreach (string thisDir in MetaDirs) - if (!thisDir.EndsWith("meta")) - Directory.Delete(thisDir, true); - - string[] AppFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta"); - string[] AppDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta"); - - foreach (string thisFile in AppFiles) - { - if (!thisFile.EndsWith("banner.bin") && - !thisFile.EndsWith("icon.bin") && - !thisFile.EndsWith("sound.bin")) - File.Delete(thisFile); - } - - if (AppDirs.Length > 2) - { - foreach (string thisDir in AppDirs) - { - if (!thisDir.EndsWith("banner.bin_OUT") && - !thisDir.EndsWith("icon.bin_OUT")) - Directory.Delete(thisDir, true); - } - } - - //Check banner.bin_OUT / Banner Replace Path - if (string.IsNullOrEmpty(BannerReplace)) - { - string[] ArcFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT"); - string[] ArcDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT"); - - foreach (string thisFile in ArcFiles) - File.Delete(thisFile); - foreach (string thisDir in ArcDirs) - if (!thisDir.EndsWith("arc")) - Directory.Delete(thisDir, true); - - string[] BannerFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT\\arc"); - string[] BannerDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT\\arc"); - - foreach (string thisFile in BannerFiles) - File.Delete(thisFile); - - if (BannerDirs.Length > 3) - { - foreach (string thisDir in BannerDirs) - { - if (!thisDir.EndsWith("anim") && - !thisDir.EndsWith("blyt") && - !thisDir.EndsWith("timg")) - Directory.Delete(thisDir, true); - } - } - - string[] AnimFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\anim"); - string[] AnimDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\anim"); - - foreach (string thisFile in AnimFiles) - { - if (!thisFile.EndsWith(".brlan")) - File.Delete(thisFile); - } - - foreach (string thisDir in AnimDirs) - Directory.Delete(thisDir, true); - - string[] BlytFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\blyt"); - string[] BlytDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\blyt"); - - foreach (string thisFile in BlytFiles) - { - if (!thisFile.EndsWith(".brlyt")) - File.Delete(thisFile); - } - - foreach (string thisDir in BlytDirs) - Directory.Delete(thisDir, true); - - string[] TimgFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\timg"); - string[] TimgDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\timg"); - - foreach (string thisFile in TimgFiles) - { - if (!thisFile.EndsWith(".tpl")) - File.Delete(thisFile); - } - - foreach (string thisDir in TimgDirs) - Directory.Delete(thisDir, true); - } - else - { - string[] ArcFiles = Directory.GetFiles(TempBannerPath); - string[] ArcDirs = Directory.GetDirectories(TempBannerPath); - - foreach (string thisFile in ArcFiles) - File.Delete(thisFile); - foreach (string thisDir in ArcDirs) - if (!thisDir.EndsWith("arc")) - Directory.Delete(thisDir, true); - - string[] BannerFiles = Directory.GetFiles(TempBannerPath + "arc"); - string[] BannerDirs = Directory.GetDirectories(TempBannerPath + "arc"); - - foreach (string thisFile in BannerFiles) - File.Delete(thisFile); - - if (BannerDirs.Length > 3) - { - foreach (string thisDir in BannerDirs) - { - if (!thisDir.EndsWith("anim") && - !thisDir.EndsWith("blyt") && - !thisDir.EndsWith("timg")) - Directory.Delete(thisDir, true); - } - } - - string[] AnimFiles = Directory.GetFiles(TempBannerPath + "arc\\anim"); - string[] AnimDirs = Directory.GetDirectories(TempBannerPath + "arc\\anim"); - - foreach (string thisFile in AnimFiles) - { - if (!thisFile.EndsWith(".brlan")) - File.Delete(thisFile); - } - - foreach (string thisDir in AnimDirs) - Directory.Delete(thisDir, true); - - string[] BlytFiles = Directory.GetFiles(TempBannerPath + "arc\\blyt"); - string[] BlytDirs = Directory.GetDirectories(TempBannerPath + "arc\\blyt"); - - foreach (string thisFile in BlytFiles) - { - if (!thisFile.EndsWith(".brlyt")) - File.Delete(thisFile); - } - - foreach (string thisDir in BlytDirs) - Directory.Delete(thisDir, true); - - string[] TimgFiles = Directory.GetFiles(TempBannerPath + "arc\\timg"); - string[] TimgDirs = Directory.GetDirectories(TempBannerPath + "arc\\timg"); - - foreach (string thisFile in TimgFiles) - { - if (!thisFile.EndsWith(".tpl")) - File.Delete(thisFile); - } - - foreach (string thisDir in TimgDirs) - Directory.Delete(thisDir, true); - } - - //Check icon.bin_OUT / Icon Replace Path - if (string.IsNullOrEmpty(IconReplace)) - { - string[] ArcFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT"); - string[] ArcDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT"); - - foreach (string thisFile in ArcFiles) - File.Delete(thisFile); - foreach (string thisDir in ArcDirs) - if (!thisDir.EndsWith("arc")) - Directory.Delete(thisDir, true); - - string[] IconFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT\\arc"); - string[] IconDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT\\arc"); - - foreach (string thisFile in IconFiles) - File.Delete(thisFile); - - if (IconDirs.Length > 3) - { - foreach (string thisDir in IconDirs) - { - if (!thisDir.EndsWith("anim") && - !thisDir.EndsWith("blyt") && - !thisDir.EndsWith("timg")) - Directory.Delete(thisDir, true); - } - } - - string[] AnimFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\anim"); - string[] AnimDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\anim"); - - foreach (string thisFile in AnimFiles) - { - if (!thisFile.EndsWith(".brlan")) - File.Delete(thisFile); - } - - foreach (string thisDir in AnimDirs) - Directory.Delete(thisDir, true); - - string[] BlytFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\blyt"); - string[] BlytDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\blyt"); - - foreach (string thisFile in BlytFiles) - { - if (!thisFile.EndsWith(".brlyt")) - File.Delete(thisFile); - } - - foreach (string thisDir in BlytDirs) - Directory.Delete(thisDir, true); - - string[] TimgFiles = Directory.GetFiles(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\timg"); - string[] TimgDirs = Directory.GetDirectories(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\timg"); - - foreach (string thisFile in TimgFiles) - { - if (!thisFile.EndsWith(".tpl")) - File.Delete(thisFile); - } - - foreach (string thisDir in TimgDirs) - Directory.Delete(thisDir, true); - } - else - { - string[] ArcFiles = Directory.GetFiles(TempIconPath); - string[] ArcDirs = Directory.GetDirectories(TempIconPath); - - foreach (string thisFile in ArcFiles) - File.Delete(thisFile); - foreach (string thisDir in ArcDirs) - if (!thisDir.EndsWith("arc")) - Directory.Delete(thisDir, true); - - string[] IconFiles = Directory.GetFiles(TempIconPath + "arc"); - string[] IconDirs = Directory.GetDirectories(TempIconPath + "arc"); - - foreach (string thisFile in IconFiles) - File.Delete(thisFile); - - if (IconDirs.Length > 3) - { - foreach (string thisDir in IconDirs) - { - if (!thisDir.EndsWith("anim") && - !thisDir.EndsWith("blyt") && - !thisDir.EndsWith("timg")) - Directory.Delete(thisDir, true); - } - } - - string[] AnimFiles = Directory.GetFiles(TempIconPath + "arc\\anim"); - string[] AnimDirs = Directory.GetDirectories(TempIconPath + "arc\\anim"); - - foreach (string thisFile in AnimFiles) - { - if (!thisFile.EndsWith(".brlan")) - File.Delete(thisFile); - } - - foreach (string thisDir in AnimDirs) - Directory.Delete(thisDir, true); - - string[] BlytFiles = Directory.GetFiles(TempIconPath + "arc\\blyt"); - string[] BlytDirs = Directory.GetDirectories(TempIconPath + "arc\\blyt"); - - foreach (string thisFile in BlytFiles) - { - if (!thisFile.EndsWith(".brlyt")) - File.Delete(thisFile); - } - - foreach (string thisDir in BlytDirs) - Directory.Delete(thisDir, true); - - string[] TimgFiles = Directory.GetFiles(TempIconPath + "arc\\timg"); - string[] TimgDirs = Directory.GetDirectories(TempIconPath + "arc\\timg"); - - foreach (string thisFile in TimgFiles) - { - if (!thisFile.EndsWith(".tpl")) - File.Delete(thisFile); - } - - foreach (string thisDir in TimgDirs) - Directory.Delete(thisDir, true); - } - - return true; - } - catch (Exception ex) { ErrorBox(ex.Message); return false; } - } - - private void btnCreateWad_Click(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(tbSourceWad.Text)) - { - if (FailureCheck() == true) - { - SaveFileDialog sfd = new SaveFileDialog(); - sfd.Filter = "Wii Channels|*.wad"; - - if (!string.IsNullOrEmpty(tbAllLanguages.Text)) - sfd.FileName = tbAllLanguages.Text + " - " + tbTitleID.Text.ToUpper() + ".wad"; - else - sfd.FileName = tbEnglish.Text + " - " + tbTitleID.Text.ToUpper() + ".wad"; - - if (sfd.ShowDialog() == DialogResult.OK) - { - try - { - CreationTimer.Reset(); - CreationTimer.Start(); - NandLoader = cmbNandLoader.SelectedIndex; - BackgroundWorker bwCreateWad = new BackgroundWorker(); - bwCreateWad.DoWork += new DoWorkEventHandler(bwCreateWad_DoWork); - bwCreateWad.ProgressChanged += new ProgressChangedEventHandler(bwCreateWad_ProgressChanged); - bwCreateWad.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwCreateWad_RunWorkerCompleted); - bwCreateWad.WorkerReportsProgress = true; - bwCreateWad.RunWorkerAsync(sfd.FileName); - } - catch (Exception ex) - { - CreationTimer.Stop(); - ErrorBox(ex.Message); - } - } - } - } - } - - void bwCreateWad_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - EventHandler EnableControls = new EventHandler(this.EnableControls); - EventHandler Initialize = new EventHandler(this.Initialize); - pbProgress.Value = 100; - lbStatusText.Text = string.Empty; - this.Invoke(EnableControls); - this.Invoke(Initialize); - } - - void bwCreateWad_ProgressChanged(object sender, ProgressChangedEventArgs e) - { - ProgressValue = e.ProgressPercentage; - ProgressState = (string)e.UserState; - - this.Invoke(ProgressUpdate); - } - - void bwCreateWad_DoWork(object sender, DoWorkEventArgs e) - { - try - { - BackgroundWorker bwCreateWad = sender as BackgroundWorker; - EventHandler DisableControls = new EventHandler(this.DisableControls); - this.Invoke(DisableControls); - - bwCreateWad.ReportProgress(0, "Making TPLs transparent"); - MakeBannerTplsTransparent(); - MakeIconTplsTransparent(); - - bwCreateWad.ReportProgress(5, "Packing icon.bin..."); - byte[] iconbin; - - if (!string.IsNullOrEmpty(IconReplace)) - iconbin = Wii.U8.PackU8(TempIconPath); - else - iconbin = Wii.U8.PackU8(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT"); - - if (cbLz77.Checked == true) iconbin = Wii.Lz77.Compress(iconbin); - iconbin = Wii.U8.AddHeaderIMD5(iconbin); - Wii.Tools.SaveFileFromByteArray(iconbin, TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin"); - Directory.Delete(TempUnpackPath + "00000000.app_OUT\\meta\\icon.bin_OUT", true); - - bwCreateWad.ReportProgress(25, "Packing banner.bin..."); - byte[] bannerbin; - - if (!string.IsNullOrEmpty(BannerReplace)) - bannerbin = Wii.U8.PackU8(TempBannerPath); - else - bannerbin = Wii.U8.PackU8(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT"); - - if (cbLz77.Checked == true) bannerbin = Wii.Lz77.Compress(bannerbin); - bannerbin = Wii.U8.AddHeaderIMD5(bannerbin); - Wii.Tools.SaveFileFromByteArray(bannerbin, TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin"); - Directory.Delete(TempUnpackPath + "00000000.app_OUT\\meta\\banner.bin_OUT", true); - - if (!string.IsNullOrEmpty(SoundReplace) || !string.IsNullOrEmpty(tbSound.Text)) - { - bwCreateWad.ReportProgress(50, "Packing sound.bin..."); - - if (!string.IsNullOrEmpty(SoundReplace)) - { - File.Delete(TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin"); - File.Copy(TempSoundPath, TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin"); - } - else if (!string.IsNullOrEmpty(tbSound.Text)) - { - Wii.Sound.WaveToSoundBin(tbSound.Text, TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", cbLz77.Checked); - } - } - - bwCreateWad.ReportProgress(60, "Packing 00000000.app..."); - int[] Sizes = new int[3]; - string[] Titles = new string[] { tbJapanese.Text, tbEnglish.Text, tbGerman.Text, tbFrench.Text, tbSpanish.Text, tbItalian.Text, tbDutch.Text }; - - for (int i = 0; i < Titles.Length; i++) - if (string.IsNullOrEmpty(Titles[i])) Titles[i] = tbAllLanguages.Text; - - byte[] nullapp = Wii.U8.PackU8(TempUnpackPath + "00000000.app_OUT", out Sizes[0], out Sizes[1], out Sizes[2]); - nullapp = Wii.U8.AddHeaderIMET(nullapp, Titles, Sizes); - Wii.Tools.SaveFileFromByteArray(nullapp, TempUnpackPath + "00000000.app"); - Directory.Delete(TempUnpackPath + "00000000.app_OUT", true); - - string[] tikfile = Directory.GetFiles(TempUnpackPath, "*.tik"); - string[] tmdfile = Directory.GetFiles(TempUnpackPath, "*.tmd"); - byte[] tmd = Wii.Tools.LoadFileToByteArray(tmdfile[0]); - - if (!string.IsNullOrEmpty(tbDol.Text)) - { - bwCreateWad.ReportProgress(80, "Inserting new DOL..."); - string[] AppFiles = Directory.GetFiles(TempUnpackPath, "*.app"); - - foreach (string thisApp in AppFiles) - if (!thisApp.EndsWith("00000000.app")) File.Delete(thisApp); - - if (NandLoader == 0) - { - using (BinaryReader nandloader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("CustomizeMii.Resources.comex.app"))) - { - using (FileStream fs = new FileStream(TempUnpackPath + "\\00000001.app", FileMode.Create)) - { - byte[] temp = nandloader.ReadBytes((int)nandloader.BaseStream.Length); - fs.Write(temp, 0, temp.Length); - } - } - - File.Copy(tbDol.Text, TempUnpackPath + "\\00000002.app"); - tmd = Wii.WadEdit.ChangeTmdBootIndex(tmd, 1); - } - else - { - using (BinaryReader nandloader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("CustomizeMii.Resources.Waninkoko.app"))) - { - using (FileStream fs = new FileStream(TempUnpackPath + "\\00000002.app", FileMode.Create)) - { - byte[] temp = nandloader.ReadBytes((int)nandloader.BaseStream.Length); - fs.Write(temp, 0, temp.Length); - } - } - - File.Copy(tbDol.Text, TempUnpackPath + "\\00000001.app"); - tmd = Wii.WadEdit.ChangeTmdBootIndex(tmd, 2); - } - - tmd = Wii.WadEdit.ChangeTmdContentCount(tmd, 3); - - bwCreateWad.ReportProgress(80, "Updating TMD..."); - File.Delete(tmdfile[0]); - using (FileStream fs = new FileStream(tmdfile[0], FileMode.Create)) - { - byte[] tmdconts = new byte[108]; - tmdconts[7] = 0x01; - tmdconts[39] = 0x01; - tmdconts[41] = 0x01; - tmdconts[43] = 0x01; - tmdconts[75] = 0x02; - tmdconts[77] = 0x02; - tmdconts[79] = 0x01; - - fs.Write(tmd, 0, 484); - fs.Write(tmdconts, 0, tmdconts.Length); - } - } - - bwCreateWad.ReportProgress(85, "Updating TMD..."); - Wii.WadEdit.UpdateTmdContents(tmdfile[0]); - - Wii.WadEdit.ChangeTitleID(tikfile[0], 0, tbTitleID.Text.ToUpper()); - Wii.WadEdit.ChangeTitleID(tmdfile[0], 1, tbTitleID.Text.ToUpper()); - - bwCreateWad.ReportProgress(90, "Trucha Signing..."); - Wii.WadEdit.TruchaSign(tmdfile[0], 1); - Wii.WadEdit.TruchaSign(tikfile[0], 0); - - bwCreateWad.ReportProgress(95, "Packing WAD..."); - if (File.Exists((string)e.Argument)) File.Delete((string)e.Argument); - Wii.WadPack.PackWad(TempUnpackPath, (string)e.Argument, false); - - bwCreateWad.ReportProgress(100, " "); - CreationTimer.Stop(); - InfoBox(string.Format("Successfully created custom channel!\nTime elapsed: {0} ms", CreationTimer.ElapsedMilliseconds)); - } - catch (Exception ex) - { - CreationTimer.Stop(); - EventHandler EnableControls = new EventHandler(this.EnableControls); - this.Invoke(EnableControls); - ErrorBox(ex.Message); - } - } - - private void lbxBrlytBanner_SelectedIndexChanged(object sender, EventArgs e) - { - if (lbxBrlytBanner.SelectedIndex != -1) - lbxBrlytIcon.SelectedIndex = -1; - - if (lbxBrlytIcon.SelectedIndex == -1) - lbBrlytActions.Text = "Banner"; - else - lbBrlytActions.Text = "Icon"; - } - - private void lbxBrlytIcon_SelectedIndexChanged(object sender, EventArgs e) - { - if (lbxBrlytIcon.SelectedIndex != -1) - lbxBrlytBanner.SelectedIndex = -1; - - if (lbxBrlytIcon.SelectedIndex == -1) - lbBrlytActions.Text = "Banner"; - else - lbBrlytActions.Text = "Icon"; - } - - private void lbxBrlanBanner_SelectedIndexChanged(object sender, EventArgs e) - { - if (lbxBrlanBanner.SelectedIndex != -1) - lbxBrlanIcon.SelectedIndex = -1; - - if (lbxBrlanIcon.SelectedIndex == -1) - lbBrlanActions.Text = "Banner"; - else - lbBrlanActions.Text = "Icon"; - } - - private void lbxBrlanIcon_SelectedIndexChanged(object sender, EventArgs e) - { - if (lbxBrlanIcon.SelectedIndex != -1) - lbxBrlanBanner.SelectedIndex = -1; - - if (lbxBrlanIcon.SelectedIndex == -1) - lbBrlanActions.Text = "Banner"; - else - lbBrlanActions.Text = "Icon"; - } - - //private void btnBrlytAdd_Click(object sender, EventArgs e) - //{ - // if (!string.IsNullOrEmpty(lbBrlytActions.Text)) - // { - // OpenFileDialog ofd = new OpenFileDialog(); - // ofd.Filter = "brlyt Files|*.brlyt"; - - // if (ofd.ShowDialog() == DialogResult.OK) - // { - // try - // { - // bool Exists = false; - - // if (lbBrlytActions.Text == "Banner") - // { - // for (int i = 0; i < lbxBrlytBanner.Items.Count; i++) - // if (lbxBrlytBanner.Items[i].ToString() == ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)) - // Exists = true; - - // if (Exists == true) - // ErrorBox("This file already exists, use the Replace button!"); - // else - // { - // if (string.IsNullOrEmpty(BannerReplace)) - // File.Copy(ofd.FileName, TempUnpackBannerBrlytPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - // else - // File.Copy(ofd.FileName, BannerBrlytPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - // lbxBrlytBanner.Items.Add(ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - // BrlytChanged = true; - // } - // } - // else - // { - // for (int i = 0; i < lbxBrlytIcon.Items.Count; i++) - // if (lbxBrlytIcon.Items[i].ToString() == ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)) - // Exists = true; - - // if (Exists == true) - // ErrorBox("This file already exists, use the Replace button!"); - // else - // { - // if (string.IsNullOrEmpty(IconReplace)) - // File.Copy(ofd.FileName, TempUnpackIconBrlytPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - // else - // File.Copy(ofd.FileName, IconBrlytPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - // lbxBrlytIcon.Items.Add(ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - // BrlytChanged = true; - // } - // } - // } - // catch (Exception ex) { ErrorBox(ex.Message); } - // } - // } - //} - - private void btnBrlanAdd_Click(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(lbBrlanActions.Text)) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "brlan Files|*.brlan"; - - if (ofd.ShowDialog() == DialogResult.OK) - { - try - { - bool Exists = false; - - if (lbBrlanActions.Text == "Banner") - { - for (int i = 0; i < lbxBrlanBanner.Items.Count; i++) - if (lbxBrlanBanner.Items[i].ToString() == ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)) - Exists = true; - - if (Exists == true) - ErrorBox("This file already exists, use the Replace button!"); - else - { - if (string.IsNullOrEmpty(BannerReplace)) - File.Copy(ofd.FileName, TempUnpackBannerBrlanPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - else - File.Copy(ofd.FileName, BannerBrlanPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - lbxBrlanBanner.Items.Add(ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - BrlanChanged = true; - } - } - else - { - for (int i = 0; i < lbxBrlanIcon.Items.Count; i++) - if (lbxBrlanIcon.Items[i].ToString() == ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)) - Exists = true; - - if (Exists == true) - ErrorBox("This file already exists, use the Replace button!"); - else - { - if (string.IsNullOrEmpty(IconReplace)) - File.Copy(ofd.FileName, TempUnpackIconBrlanPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - else - File.Copy(ofd.FileName, IconBrlanPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - lbxBrlanIcon.Items.Add(ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1)); - BrlanChanged = true; - } - } - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - } - } - - private void btnBrlytExtract_Click(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(lbBrlytActions.Text)) - { - SaveFileDialog sfd = new SaveFileDialog(); - sfd.Filter = "brlyt Files|*.brlyt"; - - if (lbBrlytActions.Text == "Banner") - sfd.FileName = lbxBrlytBanner.SelectedItem.ToString(); - else - sfd.FileName = lbxBrlytIcon.SelectedItem.ToString(); - - if (sfd.ShowDialog() == DialogResult.OK) - { - try - { - string brlytFile; - - if (lbBrlytActions.Text == "Banner") - { - if (string.IsNullOrEmpty(BannerReplace)) - brlytFile = TempUnpackBannerBrlytPath + lbxBrlytBanner.SelectedItem.ToString(); - else - brlytFile = BannerBrlytPath + lbxBrlytBanner.Items.ToString(); - } - else - { - if (string.IsNullOrEmpty(IconReplace)) - brlytFile = TempUnpackIconBrlytPath + lbxBrlytIcon.SelectedItem.ToString(); - else - brlytFile = IconBrlytPath + lbxBrlytIcon.Items.ToString(); - } - - File.Copy(brlytFile, sfd.FileName); - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - } - } - - private void btnBrlanExtract_Click(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(lbBrlanActions.Text)) - { - SaveFileDialog sfd = new SaveFileDialog(); - sfd.Filter = "brlan Files|*.brlan"; - - if (lbBrlanActions.Text == "Banner") - sfd.FileName = lbxBrlanBanner.SelectedItem.ToString(); - else - sfd.FileName = lbxBrlanIcon.SelectedItem.ToString(); - - if (sfd.ShowDialog() == DialogResult.OK) - { - try - { - string brlanFile; - - if (lbBrlanActions.Text == "Banner") - { - if (string.IsNullOrEmpty(BannerReplace)) - brlanFile = TempUnpackBannerBrlanPath + lbxBrlanBanner.SelectedItem.ToString(); - else - brlanFile = BannerBrlanPath + lbxBrlanBanner.Items.ToString(); - } - else - { - if (string.IsNullOrEmpty(IconReplace)) - brlanFile = TempUnpackIconBrlanPath + lbxBrlanIcon.SelectedItem.ToString(); - else - brlanFile = IconBrlanPath + lbxBrlanIcon.Items.ToString(); - } - - File.Copy(brlanFile, sfd.FileName); - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - } - } - - //private void btnBrlytDelete_Click(object sender, EventArgs e) - //{ - // if (!string.IsNullOrEmpty(lbBrlytActions.Text)) - // { - // try - // { - // string brlytFile; - - // if (lbBrlytActions.Text == "Banner") - // { - // if (lbxBrlytBanner.Items.Count > 1) - // { - // if (string.IsNullOrEmpty(BannerReplace)) - // brlytFile = TempUnpackBannerBrlytPath + lbxBrlytBanner.SelectedItem.ToString(); - // else - // brlytFile = BannerBrlytPath + lbxBrlytBanner.SelectedItem.ToString(); - - // lbxBrlytBanner.Items.Remove(lbxBrlytBanner.SelectedItem); - // File.Delete(brlytFile); - // BrlytChanged = true; - // } - // else - // { - // ErrorBox("You can't delete the last file.\nAdd a new one first in order to delete this one."); - // } - // } - // else - // { - // if (lbxBrlytIcon.Items.Count > 1) - // { - // if (string.IsNullOrEmpty(IconReplace)) - // brlytFile = TempUnpackIconBrlytPath + lbxBrlytIcon.SelectedItem.ToString(); - // else - // brlytFile = IconBrlytPath + lbxBrlytIcon.SelectedItem.ToString(); - - // lbxBrlytIcon.Items.Remove(lbxBrlytIcon.SelectedItem); - // File.Delete(brlytFile); - // BrlytChanged = true; - // } - // else - // { - // ErrorBox("You can't delete the last file.\nAdd a new one first in order to delete this one."); - // } - // } - // } - // catch { } - // } - //} - - private void btnBrlanDelete_Click(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(lbBrlanActions.Text)) - { - try - { - string brlanFile; - - if (lbBrlanActions.Text == "Banner") - { - if (lbxBrlanBanner.Items.Count > 1) - { - if (string.IsNullOrEmpty(BannerReplace)) - brlanFile = TempUnpackBannerBrlanPath + lbxBrlanBanner.SelectedItem.ToString(); - else - brlanFile = BannerBrlanPath + lbxBrlanBanner.SelectedItem.ToString(); - - lbxBrlanBanner.Items.Remove(lbxBrlanBanner.SelectedItem); - File.Delete(brlanFile); - BrlanChanged = true; - } - else - { - ErrorBox("You can't delete the last file.\nAdd a new one first in order to delete this one."); - } - } - else - { - if (lbxBrlanIcon.Items.Count > 1) - { - if (string.IsNullOrEmpty(IconReplace)) - brlanFile = TempUnpackIconBrlanPath + lbxBrlanIcon.SelectedItem.ToString(); - else - brlanFile = IconBrlanPath + lbxBrlanIcon.SelectedItem.ToString(); - - lbxBrlanIcon.Items.Remove(lbxBrlanIcon.SelectedItem); - File.Delete(brlanFile); - BrlanChanged = true; - } - else - { - ErrorBox("You can't delete the last file.\nAdd a new one first in order to delete this one."); - } - } - } - catch { } - } - } - - private void btnBrlytReplace_Click(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(lbBrlytActions.Text)) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "brlyt Files|*.brlyt"; - - if (ofd.ShowDialog() == DialogResult.OK) - { - try - { - if (lbBrlytActions.Text == "Banner") - { - if (string.IsNullOrEmpty(BannerReplace)) - { - File.Delete(TempUnpackBannerBrlytPath + lbxBrlytBanner.SelectedItem.ToString()); - File.Copy(ofd.FileName, TempUnpackBannerBrlytPath + lbxBrlytBanner.SelectedItem.ToString()); - BrlytChanged = true; - } - else - { - File.Delete(BannerBrlytPath + lbxBrlytBanner.SelectedItem.ToString()); - File.Copy(ofd.FileName, BannerBrlytPath + lbxBrlytBanner.SelectedItem.ToString()); - BrlytChanged = true; - } - } - else - { - if (string.IsNullOrEmpty(IconReplace)) - { - File.Delete(TempUnpackIconBrlytPath + lbxBrlytIcon.SelectedItem.ToString()); - File.Copy(ofd.FileName, TempUnpackIconBrlytPath + lbxBrlytIcon.SelectedItem.ToString()); - BrlytChanged = true; - } - else - { - File.Delete(IconBrlytPath + lbxBrlytIcon.SelectedItem.ToString()); - File.Copy(ofd.FileName, IconBrlytPath + lbxBrlytIcon.SelectedItem.ToString()); - BrlytChanged = true; - } - } - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - } - } - - private void btnBrlanReplace_Click(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(lbBrlanActions.Text)) - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "brlan Files|*.brlan"; - - if (ofd.ShowDialog() == DialogResult.OK) - { - try - { - if (lbBrlanActions.Text == "Banner") - { - if (string.IsNullOrEmpty(BannerReplace)) - { - File.Delete(TempUnpackBannerBrlanPath + lbxBrlanBanner.SelectedItem.ToString()); - File.Copy(ofd.FileName, TempUnpackBannerBrlanPath + lbxBrlanBanner.SelectedItem.ToString()); - BrlanChanged = true; - } - else - { - File.Delete(BannerBrlanPath + lbxBrlanBanner.SelectedItem.ToString()); - File.Copy(ofd.FileName, BannerBrlanPath + lbxBrlanBanner.SelectedItem.ToString()); - BrlanChanged = true; - } - } - else - { - if (string.IsNullOrEmpty(IconReplace)) - { - File.Delete(TempUnpackIconBrlanPath + lbxBrlanIcon.SelectedItem.ToString()); - File.Copy(ofd.FileName, TempUnpackIconBrlanPath + lbxBrlanIcon.SelectedItem.ToString()); - BrlanChanged = true; - } - else - { - File.Delete(IconBrlanPath + lbxBrlanIcon.SelectedItem.ToString()); - File.Copy(ofd.FileName, IconBrlanPath + lbxBrlanIcon.SelectedItem.ToString()); - BrlanChanged = true; - } - } - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - } - } - - private void llbUpdateAvailabe_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - try - { - llbUpdateAvailabe.LinkVisited = true; - Process.Start("http://code.google.com/p/customizemii/downloads/list"); - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - - private void btnDeleteBanner_Click(object sender, EventArgs e) - { - try - { - string TplName = lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - string CurBannerPath = GetCurBannerPath(); - string[] brlytTpls = Wii.Brlyt.GetBrlytTpls(CurBannerPath + "blyt\\banner.brlyt"); - - if (!Wii.Tools.StringExistsInStringArray(TplName, brlytTpls)) - { - File.Delete(CurBannerPath + "timg\\" + TplName); - lbxBannerTpls.Items.Remove(lbxBannerTpls.SelectedItem); - } - else - { - ErrorBox("This TPL is required by your banner.brlyt and thus can't be deleted!\nYou can still replace the image using the Replace button!"); - } - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - - private void btnDeleteIcon_Click(object sender, EventArgs e) - { - try - { - string TplName = lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - string CurIconPath = GetCurIconPath(); - - string[] brlytTpls = Wii.Brlyt.GetBrlytTpls(CurIconPath + "blyt\\icon.brlyt"); - - if (!Wii.Tools.StringExistsInStringArray(TplName, brlytTpls)) - { - File.Delete(CurIconPath + "timg\\" + TplName); - lbxIconTpls.Items.Remove(lbxIconTpls.SelectedItem); - } - else - { - ErrorBox("This TPL is required by your icon.brlyt and thus can't be deleted!\nYou can still replace the image using the Replace button!"); - } - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - - private void btnAddBanner_Click(object sender, EventArgs e) - { - try - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "TPL|*.tpl|PNG|*.png|JPG|*.jpg|GIF|*.gif|BMP|*.bmp|All|*.tpl;*.png;*.jpg;*.gif;*.bmp"; - ofd.FilterIndex = 6; - - if (ofd.ShowDialog() == DialogResult.OK) - { - for (int i = 0; i < lbxBannerTpls.Items.Count; i++) - { - if (lbxBannerTpls.Items[i].ToString().ToLower() == Path.GetFileNameWithoutExtension(ofd.FileName).ToLower() + ".tpl") - { - ErrorBox("This TPL already exists, use the Replace button"); - return; - } - } - - string CurBannerPath = GetCurBannerPath(); - string[] brlytTpls = Wii.Brlyt.GetBrlytTpls(CurBannerPath + "blyt\\banner.brlyt"); - string TplName = Path.GetFileNameWithoutExtension(ofd.FileName) + ".tpl"; - int TplFormat = 6; - - switch (cmbFormatBanner.SelectedIndex) - { - case 0: - TplFormat = 6; - break; - case 1: - TplFormat = 4; - break; - case 2: - TplFormat = 5; - break; - default: - if (!ofd.FileName.EndsWith(".tpl")) - { - ErrorBox("This format is not supported, you must choose either RGBA8, RGB565 or RGB5A3!"); - return; - } - break; - } - - if (!Wii.Tools.StringExistsInStringArray(TplName, brlytTpls)) - { - if (MessageBox.Show("This TPL is not required by your banner.brlyt and thus only wastes memory!\nDo you still want to add it?", "TPL not required", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No) - return; - } - - if (ofd.FileName.EndsWith(".tpl")) - { - File.Copy(ofd.FileName, CurBannerPath + "timg\\" + TplName); - lbxBannerTpls.Items.Add(TplName); - } - else - { - Image img = Image.FromFile(ofd.FileName); - Wii.TPL.ConvertToTPL(img, CurBannerPath + "timg\\" + TplName, TplFormat); - lbxBannerTpls.Items.Add(TplName); - } - } - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - - private void btnAddIcon_Click(object sender, EventArgs e) - { - try - { - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Filter = "TPL|*.tpl|PNG|*.png|JPG|*.jpg|GIF|*.gif|BMP|*.bmp|All|*.tpl;*.png;*.jpg;*.gif;*.bmp"; - ofd.FilterIndex = 6; - - if (ofd.ShowDialog() == DialogResult.OK) - { - for (int i = 0; i < lbxIconTpls.Items.Count; i++) - { - if (lbxIconTpls.Items[i].ToString().ToLower() == Path.GetFileNameWithoutExtension(ofd.FileName).ToLower() + ".tpl") - { - ErrorBox("This TPL already exists, use the Replace button"); - return; - } - } - - string CuriconPath = GetCurIconPath(); - string[] brlytTpls = Wii.Brlyt.GetBrlytTpls(CuriconPath + "blyt\\icon.brlyt"); - string TplName = Path.GetFileNameWithoutExtension(ofd.FileName) + ".tpl"; - int TplFormat = 6; - - switch (cmbFormatIcon.SelectedIndex) - { - case 0: - TplFormat = 6; - break; - case 1: - TplFormat = 4; - break; - case 2: - TplFormat = 5; - break; - default: - if (!ofd.FileName.EndsWith(".tpl")) - { - ErrorBox("This format is not supported, you must choose either RGBA8, RGB565 or RGB5A3!"); - return; - } - break; - } - - if (!Wii.Tools.StringExistsInStringArray(TplName, brlytTpls)) - { - if (MessageBox.Show("This TPL is not required by your icon.brlyt and thus only wastes memory!\nDo you still want to add it?", "TPL not required", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No) - return; - } - - if (ofd.FileName.EndsWith(".tpl")) - { - File.Copy(ofd.FileName, CuriconPath + "timg\\" + TplName); - lbxIconTpls.Items.Add(TplName); - } - else - { - Image img = Image.FromFile(ofd.FileName); - Wii.TPL.ConvertToTPL(img, CuriconPath + "timg\\" + TplName, TplFormat); - lbxIconTpls.Items.Add(TplName); - } - } - } - catch (Exception ex) { ErrorBox(ex.Message); } - } - - private void btnBrlytListTpls_Click(object sender, EventArgs e) - { - if (lbBrlytActions.Text == "Banner") - { - string CurBannerPath = GetCurBannerPath(); - string[] brlytTpls = Wii.Brlyt.GetBrlytTpls(CurBannerPath + "blyt\\banner.brlyt"); - - MessageBox.Show("These are the TPLs required by your banner.brlyt:\n\n" + - string.Join("\n", brlytTpls), "TPLs specified in banner.brlyt", MessageBoxButtons.OK, - MessageBoxIcon.Information); - } - else - { - string CurIconPath = GetCurIconPath(); - string[] brlytTpls = Wii.Brlyt.GetBrlytTpls(CurIconPath + "blyt\\icon.brlyt"); - - MessageBox.Show("These are the TPLs required by your icon.brlyt:\n\n" + - string.Join("\n", brlytTpls), "TPLs specified in icon.brlyt", MessageBoxButtons.OK, - MessageBoxIcon.Information); - } - } - - private void cbBannerMakeTransparent_CheckedChanged(object sender, EventArgs e) - { - if (lbxBannerTpls.SelectedIndex != -1) - { - if (cbBannerMakeTransparent.Checked == true) - { - try - { - if (!lbxBannerTpls.SelectedItem.ToString().EndsWith("(Transparent)")) - { - string thisItem = lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - lbxBannerTpls.Items.Remove(lbxBannerTpls.SelectedItem); - lbxBannerTpls.Items.Add(thisItem + " (Transparent)"); - lbxBannerTpls.SelectedItem = thisItem + " (Transparent)"; - Transparents.Add(thisItem); - } - } - catch { } - } - else - { - try - { - string thisItem = lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - lbxBannerTpls.Items.Remove(lbxBannerTpls.SelectedItem); - lbxBannerTpls.Items.Add(thisItem.Replace(" (Transparent)", string.Empty)); - lbxBannerTpls.SelectedItem = thisItem.Replace(" (Transparent)", string.Empty); - Transparents.Remove(thisItem.Replace(" (Transparent)", string.Empty)); - } - catch { } - } - } - } - - private void cbIconMakeTransparent_CheckedChanged(object sender, EventArgs e) - { - if (lbxIconTpls.SelectedIndex != -1) - { - if (cbIconMakeTransparent.Checked == true) - { - try - { - if (!lbxIconTpls.SelectedItem.ToString().EndsWith("(Transparent)")) - { - string thisItem = lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - lbxIconTpls.Items.Remove(lbxIconTpls.SelectedItem); - lbxIconTpls.Items.Add(thisItem + " (Transparent)"); - lbxIconTpls.SelectedItem = thisItem + " (Transparent)"; - Transparents.Add(thisItem); - } - } - catch { } - } - else - { - try - { - string thisItem = lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); - lbxIconTpls.Items.Remove(lbxIconTpls.SelectedItem); - lbxIconTpls.Items.Add(thisItem.Replace(" (Transparent)", string.Empty)); - lbxIconTpls.SelectedItem = thisItem.Replace(" (Transparent)", string.Empty); - Transparents.Remove(thisItem.Replace(" (Transparent)", string.Empty)); - } - catch { } - } - } - } - } -} diff --git a/CustomizeMii/CustomizeMii_Main.resx b/CustomizeMii/CustomizeMii_Main.resx deleted file mode 100644 index edd5a76..0000000 --- a/CustomizeMii/CustomizeMii_Main.resx +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Thanks: -Xuzz for his idea and hard work -Xuzz, SquidMan, megazig, Matt_P, Omega and The Lemon Man for Wii.py -SquidMan for Zetsubou -Andre Perrot for gbalzss -comex and Waninkoko for both their NAND Loader - - - 16, 7 - - - 42 - - \ No newline at end of file diff --git a/CustomizeMii/CustomizeMii_Preview.Designer.cs b/CustomizeMii/CustomizeMii_Preview.Designer.cs deleted file mode 100644 index 3a53663..0000000 --- a/CustomizeMii/CustomizeMii_Preview.Designer.cs +++ /dev/null @@ -1,83 +0,0 @@ -/* This file is part of CustomizeMii - * Copyright (C) 2009 Leathl - * - * CustomizeMii is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * CustomizeMii is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace CustomizeMii -{ - partial class CustomizeMii_Preview - { - /// - /// Erforderliche Designervariable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Verwendete Ressourcen bereinigen. - /// - /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Vom Windows Form-Designer generierter Code - - /// - /// Erforderliche Methode für die Designerunterstützung. - /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. - /// - private void InitializeComponent() - { - this.pbImage = new System.Windows.Forms.PictureBox(); - ((System.ComponentModel.ISupportInitialize)(this.pbImage)).BeginInit(); - this.SuspendLayout(); - // - // pbImage - // - this.pbImage.Dock = System.Windows.Forms.DockStyle.Fill; - this.pbImage.Location = new System.Drawing.Point(0, 0); - this.pbImage.Name = "pbImage"; - this.pbImage.Size = new System.Drawing.Size(194, 176); - this.pbImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; - this.pbImage.TabIndex = 0; - this.pbImage.TabStop = false; - // - // CustomizeMii_Preview - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(194, 176); - this.Controls.Add(this.pbImage); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.MinimumSize = new System.Drawing.Size(200, 200); - this.Name = "CustomizeMii_Preview"; - this.Text = "CustomizeMii - Preview"; - this.Load += new System.EventHandler(this.CustomizeMii_Preview_Load); - ((System.ComponentModel.ISupportInitialize)(this.pbImage)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - public System.Windows.Forms.PictureBox pbImage; - - } -} \ No newline at end of file diff --git a/CustomizeMii/CustomizeMii_Preview.cs b/CustomizeMii/CustomizeMii_Preview.cs deleted file mode 100644 index bd0a822..0000000 --- a/CustomizeMii/CustomizeMii_Preview.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* This file is part of CustomizeMii - * Copyright (C) 2009 Leathl - * - * CustomizeMii is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * CustomizeMii is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace CustomizeMii -{ - public partial class CustomizeMii_Preview : Form - { - public CustomizeMii_Preview() - { - InitializeComponent(); - } - - private void CustomizeMii_Preview_Load(object sender, EventArgs e) - { - this.CenterToParent(); - } - } -} diff --git a/CustomizeMii/Instructions.txt b/CustomizeMii/Instructions.txt deleted file mode 100644 index d1e5283..0000000 --- a/CustomizeMii/Instructions.txt +++ /dev/null @@ -1,125 +0,0 @@ -These are some basic instructions for CustomizeMii. - -At the very beginning, let me say this again: Don't install any WADs without a proper brick protection! - -Ok, so you want to create your own custom channels? -First it is important to understand how the creation of a custom channel with CustomizeMii works. -Skip this if you already know. - -Basically, you can't create a channel from scratch. Well, you could, but not with this application. -You need a base WAD which you can modify. You can either download one within this application or use -any WAD (must be a channel of course) from anywhere. -You can then edit the WAD file. -The editing of animations is for advanced users, so if you're not familiar with brlyt's and brlan's -(I guess you're not unless you created your own animations), get a static base WAD or one with the -animation you want. - -So, let's start to create a channel. Download a base WAD through the application or load one from your HDD. -You can preview the downloadable WADs through the preview button. -All options below are optional! - - - -MIXING BANNER, ICON AND SOUND - -The options below the downloadable base WADs are the "replace" options. -Let's say you have loaded WAD A as a base, but you want the icon of WAD B and you have a 00000000.app that -contains a sound that you want to use. -No problem! Just use the dropdownbox which yet says "Banner" and choose "Icon". Click on the browse button -next to it and choose WAD B. The icon of WAD B will replace the icon of WAD A. -After that, choose "Sound" from the dropdownbox and browse for the 00000000.app, the sound.bin will be -extracted and used instead of the one within WAD A. - -Note: These features are non-destructive, i.e. you can always use the clear button to get back to the -banner/icon/sound of WAD A! - - - -CHANNEL INFORMATION - -You may want to change the channel information, i.e. the title and ID. -Let's change the channel title first. It's the text that will be displayed when you hold your cursor -over the channel. Goto the "Title" tab and fill a title for all languages. If you want to change the -title for a specific language, just use the language's textbox. If you want a different title for every -language, you don't need to fill in a title for all languages. -Now, the title ID. Open the "Options" tab and you'll see a textbox for the ID. The ID is 4 characters long -and only contains letters and numerics. Lower case letters will automatically converted to upper case. -Change it to a unique(!) ID, because channels will overwrite existing channles with the same ID! - -I recommend not to use any title ID beginning with the following characters, because official channels -use these and thus your channel may overwrite them: -C, E, F, H, J, L, M, N, P, Q, W - - - -INSERTING A NEW DOL - -Let's bring some life into the channel. In the "Options" tab, use the browse button for a new DOL. -Either load a forwarder or the DOL of any application. Note that some channles require more than just a DOL -and thus may not work in a channel (e.g. MPlayer CE). -Choose a NAND loader or just stick with the one selected (both will do fine). - - - -INSERTING A NEW SOUND - -For the sound, you can either use a wave file or the sound replace function to use the sound of an -existing sound.bin/00000000.app/WAD. -If you want looped sound, open your wave file with wavosaur and add loop points before. - - - -EDITING THE BANNER/ICON (If you're an advanced user and want to edit the brlyt/brlan, do that first!) - -So, let's begin with the real customization. I will only talk about the banner here, the instructions -are the same for the icon. -Goto the "Banner" tab. You shouldn't touch the add and remove buttons, they're for advanced users that -change the animation. (However, they can't really harm your channel, as CustomizeMii will check for missing -and unneeded TPLs while creating a WAD). -You will see a list with all TPLs inside the banner.bin. When you select a TPL, -it's current format will be shown in the "Format" dropdownbox. Note that CustomizeMii can read 8 different -TPL formats, but only write 3 (RGBA8, RGB565 and RGB5A3), that should be enough for your needs. -You can use the preview button to preview a TPL (obvious, right?), but you get one more important info, -the image size. It will be shown in the title of the preview window. If your images aren't the same size, -they will be resized! So be sure to have at least the correct aspect ratio, so your images wont be -squeezed or whatever. -Before replacing the image, choose a format from the dropdownbox. -(RGBA8 = High Quality, Big Size --- RGB565 = Moderate Quality, Small Size --- RGB5A3 = Bad Quality, Small Size) -Now you can use the replace button to insert your image. Preview the TPL after replacing to check the -image. Maybe you want to use another format though? No problem, just replace the TPL again. - -Note: You can use the "Make Transparent" checkbox to make a TPL transparent, e.g. if you don't like -one piece of an animation (It's non-destructive, i.e. you can always uncheck the box). - - - -EDITING THE ANIMATION (Advanced users only!) - -Skip this part, if you don't really know what brlyt and brlan files are and how they're structured. -Goto the "brlyt" tab. You will see the banner.brlyt and icon.brlyt there. -Above the buttons is a text that will indicate whether you're doing actions on the "Banner" or -the "Icon" (When you select the banner.brlyt, you're editing the "Banner" and vice versa). -Now, just replace the banner.brlyt and icon.brlyt files as you want. You can use the list TPLs button -afterwards to see all TPLs that are required by the banner.brlyt/icon.brlyt (Don't worry, CustomizeMii -won't let you create a WAD, if you forgot a required TPL). -Now, goto the "brlan" tab. It's similar to the "brlyt" tab. You shouldn't touch the add or delete button -unless your base WAD only has a banner.brlan and you want to use a banner_Start.brlan and banner_Loop.brlan. -In this case, first add the two files and then delete the old banner.brlan. -Else just replace the files with yours. Be absolutely sure the your brlan files only refer to panes that are -indicated in your brlyt files! -That's it, here's nothing left to do. - - - -CREATING THE WAD - -Well, your channel should be ready to be created. -Goto the "Options" tab and check the Lz77 checkbox, if you want to compress your channel to safe some Wii memory. -If your channel doesn't work, first try it again without compression. -Now just click on the create WAD button (The big one with the different text each startup). -CustomizeMii will do some failure checks and if all went fine, a save dialog will pop up. -If you get an error or warning, read the message carefully. It should give you enough information to fix -the problem yourself. - -So, if you got down to here, you're done by now. Please, if you find any bugs or have suggestions, take some -seconds to report them at the issue tracker: http://code.google.com/p/customizemii/issues/list \ No newline at end of file diff --git a/CustomizeMii/Properties/Resources.resx b/CustomizeMii/Properties/Resources.resx deleted file mode 100644 index 10c0e07..0000000 --- a/CustomizeMii/Properties/Resources.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - ..\Resources\CustomizeMii.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\resources\instructions.rtf;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - \ No newline at end of file diff --git a/CustomizeMii/Properties/Settings.Designer.cs b/CustomizeMii/Properties/Settings.Designer.cs deleted file mode 100644 index c26659c..0000000 --- a/CustomizeMii/Properties/Settings.Designer.cs +++ /dev/null @@ -1,47 +0,0 @@ -/* This file is part of CustomizeMii - * Copyright (C) 2009 Leathl - * - * CustomizeMii is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * CustomizeMii is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.4927 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace CustomizeMii.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.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/CustomizeMii/Properties/Settings.settings b/CustomizeMii/Properties/Settings.settings deleted file mode 100644 index abf36c5..0000000 --- a/CustomizeMii/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/CustomizeMii/Resources/CustomizeMii.ico b/CustomizeMii/Resources/CustomizeMii.ico deleted file mode 100644 index 43fef8966007ac750b0f382a9e9bbc52eab16a53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88878 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 diff --git a/CustomizeMii/Resources/Instructions.rtf b/CustomizeMii/Resources/Instructions.rtf deleted file mode 100644 index 951eaea15bf0b831086bdc0e591751a99057d9a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7947 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�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 OdM99*9K93Z!v6x_H9N!r diff --git a/CustomizeMii/Resources/comex.app b/CustomizeMii/Resources/comex.app deleted file mode 100644 index a8d94c8bcd233cf71fb3ea9e3d6c4e6cb6faa19a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138752 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 z 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 bt$TZyu>Y+WojZj+#rqLUvzQ=$|L5{I;Y!{s diff --git a/CustomizeMii/Wii.cs b/CustomizeMii/Wii.cs deleted file mode 100644 index ed43d0e..0000000 --- a/CustomizeMii/Wii.cs +++ /dev/null @@ -1,5493 +0,0 @@ -/* This file is part of ShowMiiWads - * Copyright (C) 2009 Leathl - * - * ShowMiiWads is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * ShowMiiWads is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -//Wii.py by Xuzz, SquidMan, megazig, Matt_P, Omega and The Lemon Man was the base for TPL conversion -//Zetsubou by SquidMan was a reference for TPL conversion -//gbalzss by Andre Perrot was the base for LZ77 (de-)compression -//Thanks to the authors! - -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using System.Security.Cryptography; -using System.Drawing; -using System.Net; - -namespace Wii -{ - public class Tools - { - public static event EventHandler ProgressChanged; - - public static void ChangeProgress(int ProgressPercent) - { - EventHandler progressChanged = ProgressChanged; - if (progressChanged != null) - { - progressChanged(new object(), new ProgressChangedEventArgs(ProgressPercent)); - } - } - - ///

- /// Writes the small Byte Array into the big one at the given offset - /// - /// - /// - /// - /// - public static byte[] InsertByteArray(byte[] big, byte[] small, int offset) - { - for (int i = 0; i < small.Length; i++) - big[offset + i] = small[i]; - return big; - } - - /// - /// Creates a new Byte Array out of the given one - /// from the given offset with the specified length - /// - /// - /// - /// - /// - public static byte[] GetPartOfByteArray(byte[] array, int offset, int length) - { - byte[] ret = new byte[length]; - for (int i = 0; i < length; i++) - ret[i] = array[offset + i]; - return ret; - } - - /// - /// Converts UInt32 Array into Byte Array - /// - /// - /// - public static byte[] UInt32ArrayToByteArray(UInt32[] array) - { - List results = new List(); - foreach (UInt32 value in array) - { - byte[] converted = BitConverter.GetBytes(value); - results.AddRange(converted); - } - return results.ToArray(); - } - - /// - /// Converts UInt16 Array into Byte Array - /// - /// - /// - public static byte[] UInt16ArrayToByteArray(UInt16[] array) - { - List results = new List(); - foreach (UInt16 value in array) - { - byte[] converted = BitConverter.GetBytes(value); - results.AddRange(converted); - } - return results.ToArray(); - } - - /// - /// Converts UInt16 Array into Byte Array - /// - /// - /// - public static byte[] UIntArrayToByteArray(uint[] array) - { - List results = new List(); - foreach (uint value in array) - { - byte[] converted = BitConverter.GetBytes(value); - results.AddRange(converted); - } - return results.ToArray(); - } - - /// - /// Converts Byte Array into UInt16 Array - /// - /// - /// - public static UInt32[] ByteArrayToUInt32Array(byte[] array) - { - UInt32[] converted = new UInt32[array.Length / 2]; - int j = 0; - for (int i = 0; i < array.Length; i += 4) - { - converted[j] = BitConverter.ToUInt32(array, i); - j++; - } - return converted; - } - - /// - /// Converts Byte Array into UInt16 Array - /// - /// - /// - public static UInt16[] ByteArrayToUInt16Array(byte[] array) - { - UInt16[] converted = new UInt16[array.Length / 2]; - int j = 0; - for (int i = 0; i < array.Length; i += 2) - { - converted[j] = BitConverter.ToUInt16(array, i); - j++; - } - return converted; - } - - /// - /// Returns the file length as a Byte Array - /// - /// - /// - public static byte[] FileLengthToByteArray(int filelength) - { - byte[] length = BitConverter.GetBytes(filelength); - Array.Reverse(length); - return length; - } - - /// - /// Adds a padding to the next 64 bytes, if necessary - /// - /// - /// - public static int AddPadding(int value) - { - return AddPadding(value, 64); - } - - /// - /// Adds a padding to the given value, if necessary - /// - /// - /// - /// - public static int AddPadding(int value, int padding) - { - if (value % padding != 0) - { - value = value + (padding - (value % padding)); - } - - return value; - } - - /// - /// Converts a Hex-String to Int - /// - /// - /// - public static int HexStringToInt(string hexstring) - { - try { return int.Parse(hexstring, System.Globalization.NumberStyles.HexNumber); } - catch { throw new Exception("An Error occured, maybe the Wad file is corrupt!"); } - } - - /// - /// Converts a Hex-String to Long - /// - /// - /// - public static long HexStringToLong(string hexstring) - { - try { return long.Parse(hexstring, System.Globalization.NumberStyles.HexNumber); } - catch { throw new Exception("An Error occured, maybe the Wad file is corrupt!"); } - } - - /// - /// Writes a Byte Array to a file - /// - /// - public static void SaveFileFromByteArray(byte[] file, string destination) - { - using (FileStream fs = new FileStream(destination, FileMode.Create)) - fs.Write(file, 0, file.Length); - } - - /// - /// Loads a file into a Byte Array - /// - /// - /// - public static byte[] LoadFileToByteArray(string sourcefile) - { - if (File.Exists(sourcefile)) - { - using (FileStream fs = new FileStream(sourcefile, FileMode.Open)) - { - byte[] filearray = new byte[fs.Length]; - fs.Read(filearray, 0, filearray.Length); - return filearray; - } - } - else throw new FileNotFoundException("File couldn't be found:\r\n" + sourcefile); - } - - /// - /// Loads a file into a Byte Array - /// - /// - /// - public static byte[] LoadFileToByteArray(string sourcefile, int offset, int length) - { - if (File.Exists(sourcefile)) - { - using (FileStream fs = new FileStream(sourcefile, FileMode.Open)) - { - if (fs.Length < length) length = (int)fs.Length; - byte[] filearray = new byte[length]; - fs.Read(filearray, offset, length); - return filearray; - } - } - else throw new FileNotFoundException("File couldn't be found:\r\n" + sourcefile); - } - - /// - /// Checks the SHA1 of the Common-Key - /// - /// - /// - public static bool CheckCommonKey(string pathtocommonkey) - { - byte[] sum = new byte[] { 0xEB, 0xEA, 0xE6, 0xD2, 0x76, 0x2D, 0x4D, 0x3E, 0xA1, 0x60, 0xA6, 0xD8, 0x32, 0x7F, 0xAC, 0x9A, 0x25, 0xF8, 0x06, 0x2B }; - - FileInfo fi = new FileInfo(pathtocommonkey); - if (fi.Length != 16) return false; - else - { - byte[] ckey = LoadFileToByteArray(pathtocommonkey); - - SHA1Managed sha1 = new SHA1Managed(); - byte[] newsum = sha1.ComputeHash(ckey); - - if (CompareByteArrays(sum, newsum) == true) return true; - else return false; - } - } - - /// - /// Creates the Common Key - /// - /// Must be "45e" - /// Destination Path - public static void CreateCommonKey(string fat, string destinationpath) - { - //What an effort, lol - byte[] encryptedwater = new byte[] { 0x4d, 0x89, 0x21, 0x34, 0x62, 0x81, 0xe4, 0x02, 0x37, 0x36, 0xc4, 0xb4, 0xde, 0x40, 0x32, 0xab }; - byte[] key = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, byte.Parse(fat.Remove(2), System.Globalization.NumberStyles.HexNumber), byte.Parse(fat.Remove(0, 2) + "0", System.Globalization.NumberStyles.HexNumber) }; - byte[] decryptedwater = new byte[10]; - - RijndaelManaged decryptkey = new RijndaelManaged(); - decryptkey.Mode = CipherMode.CBC; - decryptkey.Padding = PaddingMode.None; - decryptkey.KeySize = 128; - decryptkey.BlockSize = 128; - decryptkey.Key = key; - Array.Reverse(key); - decryptkey.IV = key; - - ICryptoTransform cryptor = decryptkey.CreateDecryptor(); - - using (MemoryStream memory = new MemoryStream(encryptedwater)) - { - using (CryptoStream crypto = new CryptoStream(memory, cryptor, CryptoStreamMode.Read)) - crypto.Read(decryptedwater, 0, 10); - } - - string water = BitConverter.ToString(decryptedwater).Replace("-", "").ToLower() + " "; - - water = water.Insert(0, fat[2].ToString()); - water = water.Insert(2, fat[2].ToString()); - water = water.Insert(7, fat[2].ToString()); - water = water.Insert(11, fat[2].ToString()); - - water = water.Insert(7, fat[1].ToString()); - water = water.Insert(10, fat[1].ToString()); - water = water.Insert(18, fat[1].ToString()); - water = water.Insert(19, fat[1].ToString()); - - water = water.Insert(3, fat[0].ToString()); - water = water.Insert(15, fat[0].ToString()); - water = water.Insert(16, fat[0].ToString()); - water = water.Insert(22, fat[0].ToString()); - - byte[] cheese = new byte[16]; - int count = -1; - - for (int i = 0; i < 32; i += 2) - cheese[++count] = byte.Parse(water.Remove(0, i).Remove(2), System.Globalization.NumberStyles.HexNumber); - - if (destinationpath[destinationpath.Length - 1] != '\\') destinationpath = destinationpath + "\\"; - using (FileStream keystream = new FileStream(destinationpath + "\\common-key.bin", FileMode.Create)) - { - keystream.Write(cheese, 0, cheese.Length); - } - } - - /// - /// Counts the appearance of a specific character in a string - /// - /// - /// - /// - public static int CountCharsInString(string theString, char theChar) - { - int count = 0; - foreach (char thisChar in theString) - { - if (thisChar == theChar) - count++; - } - return count; - } - - /// - /// Compares two Byte Arrays and returns true, if they match - /// - /// - /// - /// - public static bool CompareByteArrays(byte[] first, byte[] second) - { - if (first.Length != second.Length) return false; - else - { - for (int i = 0; i < first.Length; i++) - if (first[i] != second[i]) return false; - - return true; - } - } - - /// - /// Converts a Hex String to a Byte Array - /// - /// - /// - public static byte[] HexStringToByteArray(string hexstring) - { - byte[] ba = new byte[hexstring.Length / 2]; - - for (int i = 0; i < hexstring.Length / 2; i++) - { - ba[i] = byte.Parse(hexstring.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); - } - - return ba; - } - - /// - /// Checks, if the given string does exist in the string Array - /// - /// - /// - /// - public static bool StringExistsInStringArray(string theString, string[] theStringArray) - { - return Array.Exists(theStringArray, thisString => thisString == theString); - } - - /// - /// Copies an entire Directoy - /// - /// - /// - public static void CopyDirectory(string source, string destination) - { - string[] subdirs = Directory.GetDirectories(source); - string[] files = Directory.GetFiles(source); - - foreach (string thisFile in files) - { - if (!Directory.Exists(destination)) Directory.CreateDirectory(destination); - if (File.Exists(destination + "\\" + Path.GetFileName(thisFile))) File.Delete(destination + "\\" + Path.GetFileName(thisFile)); - File.Copy(thisFile, destination + "\\" + Path.GetFileName(thisFile)); - } - - foreach (string thisDir in subdirs) - { - CopyDirectory(thisDir, destination + "\\" + thisDir.Remove(0, thisDir.LastIndexOf('\\') + 1)); - } - } - } - - public class WadInfo - { - public const int Headersize = 64; - public static string[] RegionCode = new string[4] { "Japan", "USA", "Europe", "Region Free" }; - - /// - /// Returns the Header of a Wadfile - /// - /// - /// - public static byte[] GetHeader(byte[] wadfile) - { - byte[] Header = new byte[0x20]; - - for (int i = 0; i < Header.Length; i++) - { - Header[i] = wadfile[i]; - } - - return Header; - } - - /// - /// Returns the size of the Certificate - /// - /// - /// - public static int GetCertSize(byte[] wadfile) - { - int size = int.Parse(wadfile[0x08].ToString("x2") + wadfile[0x09].ToString("x2") + wadfile[0x0a].ToString("x2") + wadfile[0x0b].ToString("x2"), System.Globalization.NumberStyles.HexNumber); - return size; - } - - /// - /// Returns the size of the Ticket - /// - /// - /// - public static int GetTikSize(byte[] wadfile) - { - int size = int.Parse(wadfile[0x10].ToString("x2") + wadfile[0x11].ToString("x2") + wadfile[0x12].ToString("x2") + wadfile[0x13].ToString("x2"), System.Globalization.NumberStyles.HexNumber); - return size; - } - - /// - /// Returns the size of the TMD - /// - /// - /// - public static int GetTmdSize(byte[] wadfile) - { - int size = int.Parse(wadfile[0x14].ToString("x2") + wadfile[0x15].ToString("x2") + wadfile[0x16].ToString("x2") + wadfile[0x17].ToString("x2"), System.Globalization.NumberStyles.HexNumber); - return size; - } - - /// - /// Returns the size of all Contents - /// - /// - /// - public static int GetContentSize(byte[] wadfile) - { - int size = int.Parse(wadfile[0x18].ToString("x2") + wadfile[0x19].ToString("x2") + wadfile[0x1a].ToString("x2") + wadfile[0x1b].ToString("x2"), System.Globalization.NumberStyles.HexNumber); - return size; - } - - /// - /// Returns the size of the Footer - /// - /// - /// - public static int GetFooterSize(byte[] wadfile) - { - int size = int.Parse(wadfile[0x1c].ToString("x2") + wadfile[0x1d].ToString("x2") + wadfile[0x1e].ToString("x2") + wadfile[0x1f].ToString("x2"), System.Globalization.NumberStyles.HexNumber); - return size; - } - - /// - /// Returns the position of the tmd in the wad file - /// - /// - /// - public static int GetTmdPos(byte[] wadfile) - { - return Headersize + Tools.AddPadding(GetCertSize(wadfile)) + Tools.AddPadding(GetTikSize(wadfile)); - } - - /// - /// Returns the position of the ticket in the wad file, ticket or tmd - /// - /// - /// - public static int GetTikPos(byte[] wadfile) - { - return Headersize + Tools.AddPadding(GetCertSize(wadfile)); - } - - /// - /// Returns the title ID of the wad file. - /// - /// - /// 0 = Tik, 1 = Tmd - /// - public static string GetTitleID(byte[] wadtiktmd, int type) - { - string channeltype = GetChannelType(wadtiktmd, type); - int tikpos = 0; - int tmdpos = 0; - - if (IsThisWad(wadtiktmd) == true) - { - //It's a wad - tikpos = GetTikPos(wadtiktmd); - tmdpos = GetTmdPos(wadtiktmd); - } - - if (type == 1) - { - if (!channeltype.Contains("System:")) - { - string tmdid = Convert.ToChar(wadtiktmd[tmdpos + 0x190]).ToString() + Convert.ToChar(wadtiktmd[tmdpos + 0x191]).ToString() + Convert.ToChar(wadtiktmd[tmdpos + 0x192]).ToString() + Convert.ToChar(wadtiktmd[tmdpos + 0x193]).ToString(); - return tmdid; - } - else if (channeltype.Contains("IOS")) - { - int tmdid = Tools.HexStringToInt(wadtiktmd[tmdpos + 0x190].ToString("x2") + wadtiktmd[tmdpos + 0x191].ToString("x2") + wadtiktmd[tmdpos + 0x192].ToString("x2") + wadtiktmd[tmdpos + 0x193].ToString("x2")); - return "IOS" + tmdid; - } - else if (channeltype.Contains("System")) return "SYSTEM"; - else return ""; - } - else - { - if (!channeltype.Contains("System:")) - { - string tikid = Convert.ToChar(wadtiktmd[tikpos + 0x1e0]).ToString() + Convert.ToChar(wadtiktmd[tikpos + 0x1e1]).ToString() + Convert.ToChar(wadtiktmd[tikpos + 0x1e2]).ToString() + Convert.ToChar(wadtiktmd[tikpos + 0x1e3]).ToString(); - return tikid; - } - else if (channeltype.Contains("IOS")) - { - int tikid = Tools.HexStringToInt(wadtiktmd[tikpos + 0x1e0].ToString("x2") + wadtiktmd[tikpos + 0x1e1].ToString("x2") + wadtiktmd[tikpos + 0x1e2].ToString("x2") + wadtiktmd[tikpos + 0x1e3].ToString("x2")); - return "IOS" + tikid; - } - else if (channeltype.Contains("System")) return "SYSTEM"; - else return ""; - } - } - - /// - /// Returns the full title ID of the wad file as a hex string. - /// - /// - /// 0 = Tik, 1 = Tmd - /// - public static string GetFullTitleID(byte[] wadtiktmd, int type) - { - int tikpos = 0; - int tmdpos = 0; - - if (IsThisWad(wadtiktmd) == true) - { - //It's a wad - tikpos = GetTikPos(wadtiktmd); - tmdpos = GetTmdPos(wadtiktmd); - } - - if (type == 1) - { - string tmdid = wadtiktmd[tmdpos + 0x18c].ToString("x2") + - wadtiktmd[tmdpos + 0x18d].ToString("x2") + - wadtiktmd[tmdpos + 0x18e].ToString("x2") + - wadtiktmd[tmdpos + 0x18f].ToString("x2") + - wadtiktmd[tmdpos + 0x190].ToString("x2") + - wadtiktmd[tmdpos + 0x191].ToString("x2") + - wadtiktmd[tmdpos + 0x192].ToString("x2") + - wadtiktmd[tmdpos + 0x193].ToString("x2"); - return tmdid; - } - else - { - string tikid = wadtiktmd[tikpos + 0x1dc].ToString() + - wadtiktmd[tikpos + 0x1dd].ToString() + - wadtiktmd[tikpos + 0x1de].ToString() + - wadtiktmd[tikpos + 0x1df].ToString() + - wadtiktmd[tikpos + 0x1e0].ToString() + - wadtiktmd[tikpos + 0x1e1].ToString() + - wadtiktmd[tikpos + 0x1e2].ToString() + - wadtiktmd[tikpos + 0x1e3].ToString(); - return tikid; - } - } - - /// - /// Returns the title for each language of a wad file. - /// Order: Jap, Eng, Ger, Fra, Spa, Ita, Dut - /// - /// - /// - public static string[] GetChannelTitles(string wadfile) - { - byte[] wadarray = Tools.LoadFileToByteArray(wadfile); - return GetChannelTitles(wadarray); - } - - /// - /// Returns the title for each language of a wad file. - /// Order: Jap, Eng, Ger, Fra, Spa, Ita, Dut - /// - /// - /// - public static string[] GetChannelTitles(byte[] wadfile) - { - if (File.Exists(System.Windows.Forms.Application.StartupPath + "\\common-key.bin") || File.Exists(System.Windows.Forms.Application.StartupPath + "\\key.bin")) - { - string channeltype = GetChannelType(wadfile, 0); - - if (!channeltype.Contains("System:")) - { - if (!channeltype.Contains("Hidden")) - { - string[] titles = new string[7]; - - //Detection from footer is turned off, cause the footer - //can be easily edited and thus the titles in it could be simply wrong - - //int footer = GetFooterSize(wadfile); - //if (footer > 0) - //{ - // int footerpos = wadfile.Length - footer; - // int count = 0; - // int imetpos = 0; - - // if ((wadfile.Length - (wadfile.Length - footer)) < 250) return new string[7]; - - // for (int z = 0; z < 250; z++) - // { - // if (Convert.ToChar(wadfile[footerpos + z]) == 'I') - // if (Convert.ToChar(wadfile[footerpos + z + 1]) == 'M') - // if (Convert.ToChar(wadfile[footerpos + z + 2]) == 'E') - // if (Convert.ToChar(wadfile[footerpos + z + 3]) == 'T') - // { - // imetpos = footerpos + z; - // break; - // } - // } - - // int jappos = imetpos + 29; - - // for (int i = jappos; i < jappos + 588; i += 84) - // { - // for (int j = 0; j < 40; j += 2) - // { - // if (wadfile[i + j] != 0x00) - // { - // char temp = Convert.ToChar(wadfile[i + j]); - // titles[count] += temp; - // } - // } - - // count++; - // } - - // return titles; - //} - - string[,] conts = GetContentInfo(wadfile); - byte[] titlekey = GetTitleKey(wadfile); - int nullapp = 0; - - for (int i = 0; i < conts.GetLength(0); i++) - { - if (conts[i, 1] == "00000000") - nullapp = i; - } - - byte[] contenthandle = WadEdit.DecryptContent(wadfile, nullapp, titlekey); - int imetpos = 0; - - if (contenthandle.Length < 400) return new string[7]; - - for (int z = 0; z < 400; z++) - { - if (Convert.ToChar(contenthandle[z]) == 'I') - if (Convert.ToChar(contenthandle[z + 1]) == 'M') - if (Convert.ToChar(contenthandle[z + 2]) == 'E') - if (Convert.ToChar(contenthandle[z + 3]) == 'T') - { - imetpos = z; - break; - } - } - - int jappos = imetpos + 29; - int count = 0; - - for (int i = jappos; i < jappos + 588; i += 84) - { - for (int j = 0; j < 40; j += 2) - { - if (contenthandle[i + j] != 0x00) - { - char temp = Convert.ToChar(contenthandle[i + j]); - titles[count] += temp; - } - } - - count++; - } - - return titles; - } - else return new string[7]; - } - else return new string[7]; - } - else return new string[7]; - } - - /// - /// Returns the title for each language of a 00.app file - /// Order: Jap, Eng, Ger, Fra, Spa, Ita, Dut - /// - /// - /// - public static string[] GetChannelTitlesFromApp(string app) - { - byte[] tmp = Tools.LoadFileToByteArray(app); - return GetChannelTitlesFromApp(tmp); - } - - /// - /// Returns the title for each language of a 00.app file - /// Order: Jap, Eng, Ger, Fra, Spa, Ita, Dut - /// - /// - /// - public static string[] GetChannelTitlesFromApp(byte[] app) - { - string[] titles = new string[7]; - - int imetpos = 0; - int length = 400; - - if (app.Length < 400) length = app.Length - 4; - - for (int z = 0; z < length; z++) - { - if (Convert.ToChar(app[z]) == 'I') - if (Convert.ToChar(app[z + 1]) == 'M') - if (Convert.ToChar(app[z + 2]) == 'E') - if (Convert.ToChar(app[z + 3]) == 'T') - { - imetpos = z; - break; - } - } - - if (imetpos != 0) - { - int jappos = imetpos + 29; - int count = 0; - - for (int i = jappos; i < jappos + 588; i += 84) - { - for (int j = 0; j < 40; j += 2) - { - if (app[i + j] != 0x00) - { - char temp = Convert.ToChar(app[i + j]); - titles[count] += temp; - } - } - - count++; - } - } - - return titles; - } - - /// - /// Returns the Type of the Channel as a string - /// Wad or Tik needed for WiiWare / VC detection! - /// - /// - /// - public static string GetChannelType(byte[] wadtiktmd, int type) - { - int tikpos = 0; - int tmdpos = 0; - - if (IsThisWad(wadtiktmd) == true) - { - //It's a wad - tikpos = GetTikPos(wadtiktmd); - tmdpos = GetTmdPos(wadtiktmd); - } - - string thistype = ""; - - if (type == 0) - { thistype = wadtiktmd[tikpos + 0x1dc].ToString("x2") + wadtiktmd[tikpos + 0x1dd].ToString("x2") + wadtiktmd[tikpos + 0x1de].ToString("x2") + wadtiktmd[tikpos + 0x1df].ToString("x2"); } - else { thistype = wadtiktmd[tmdpos + 0x18c].ToString("x2") + wadtiktmd[tmdpos + 0x18d].ToString("x2") + wadtiktmd[tmdpos + 0x18e].ToString("x2") + wadtiktmd[tmdpos + 0x18f].ToString("x2"); } - string channeltype = "Unknown"; - - if (thistype == "00010001") - { - channeltype = CheckWiiWareVC(wadtiktmd, type); - } - else if (thistype == "00010002") channeltype = "System Channel"; - else if (thistype == "00010004" || thistype == "00010000") channeltype = "Game Channel"; - else if (thistype == "00010005") channeltype = "Downloaded Content"; - else if (thistype == "00010008") channeltype = "Hidden Channel"; - else if (thistype == "00000001") - { - channeltype = "System: IOS"; - - string thisid = ""; - if (type == 0) { thisid = wadtiktmd[tikpos + 0x1e0].ToString("x2") + wadtiktmd[tikpos + 0x1e1].ToString("x2") + wadtiktmd[tikpos + 0x1e2].ToString("x2") + wadtiktmd[tikpos + 0x1e3].ToString("x2"); } - else { thisid = wadtiktmd[tmdpos + 0x190].ToString("x2") + wadtiktmd[tmdpos + 0x191].ToString("x2") + wadtiktmd[tmdpos + 0x192].ToString("x2") + wadtiktmd[tmdpos + 0x193].ToString("x2"); } - - if (thisid == "00000001") channeltype = "System: Boot2"; - else if (thisid == "00000002") channeltype = "System: Menu"; - else if (thisid == "00000100") channeltype = "System: BC"; - else if (thisid == "00000101") channeltype = "System: MIOS"; - } - - return channeltype; - } - - /// - /// Returns the amount of included Contents (app-files) - /// - /// - /// - public static int GetContentNum(byte[] wadtmd) - { - int tmdpos = 0; - - if (IsThisWad(wadtmd) == true) - { - //It's a wad file, so get the tmd position - tmdpos = GetTmdPos(wadtmd); - } - - int contents = Tools.HexStringToInt(wadtmd[tmdpos + 0x1de].ToString("x2") + wadtmd[tmdpos + 0x1df].ToString("x2")); - - return contents; - } - - /// - /// Returns the approx. destination size on the Wii - /// - /// - /// - public static string GetNandSize(byte[] wadtmd, bool ConvertToMB) - { - int tmdpos = 0; - int minsize = 0; - int maxsize = 0; - int numcont = GetContentNum(wadtmd); - - if (IsThisWad(wadtmd) == true) - { - //It's a wad - tmdpos = GetTmdPos(wadtmd); - } - - for (int i = 0; i < numcont; i++) - { - int cont = 36 * i; - int contentsize = Tools.HexStringToInt(wadtmd[tmdpos + 0x1e4 + 8 + cont].ToString("x2") + - wadtmd[tmdpos + 0x1e5 + 8 + cont].ToString("x2") + - wadtmd[tmdpos + 0x1e6 + 8 + cont].ToString("x2") + - wadtmd[tmdpos + 0x1e7 + 8 + cont].ToString("x2") + - wadtmd[tmdpos + 0x1e8 + 8 + cont].ToString("x2") + - wadtmd[tmdpos + 0x1e9 + 8 + cont].ToString("x2") + - wadtmd[tmdpos + 0x1ea + 8 + cont].ToString("x2") + - wadtmd[tmdpos + 0x1eb + 8 + cont].ToString("x2")); - - string type = wadtmd[tmdpos + 0x1e4 + 6 + cont].ToString("x2") + wadtmd[tmdpos + 0x1e5 + 6 + cont].ToString("x2"); - - if (type == "0001") - { - minsize += contentsize; - maxsize += contentsize; - } - else if (type == "8001") - maxsize += contentsize; - } - - string size = ""; - - if (maxsize == minsize) size = maxsize.ToString(); - else size = minsize.ToString() + " - " + maxsize.ToString(); - - if (ConvertToMB == true) - { - if (size.Contains("-")) - { - string min = size.Remove(size.IndexOf(' ')); - string max = size.Remove(0, size.IndexOf('-') + 2); - - min = Convert.ToString(Math.Round(Convert.ToDouble(min) * 0.0009765625 * 0.0009765625, 2)); - max = Convert.ToString(Math.Round(Convert.ToDouble(max) * 0.0009765625 * 0.0009765625, 2)); - if (min.Length > 4) { min = min.Remove(4); } - if (max.Length > 4) { max = max.Remove(4); } - size = min + " - " + max + " MB"; - } - else - { - size = Convert.ToString(Math.Round(Convert.ToDouble(size) * 0.0009765625 * 0.0009765625, 2)); - if (size.Length > 4) { size = size.Remove(4); } - size = size + " MB"; - } - } - - return size.Replace(",", "."); - } - - /// - /// Returns the approx. destination block on the Wii - /// - /// - /// - public static string GetNandBlocks(byte[] wadtmd) - { - string size = GetNandSize(wadtmd, false); - - if (size.Contains("-")) - { - string size1 = size.Remove(size.IndexOf(' ')); - string size2 = size.Remove(0, size.LastIndexOf(' ') + 1); - - double blocks1 = (double)((Convert.ToDouble(size1) / 1024) / 128); - double blocks2 = (double)((Convert.ToDouble(size2) / 1024) / 128); - - return Math.Ceiling(blocks1) + " - " + Math.Ceiling(blocks2); - } - else - { - double blocks = (double)((Convert.ToDouble(size) / 1024) / 128); - - return Math.Ceiling(blocks).ToString(); - } - } - - /// - /// Returns the title version of the wad file - /// - /// - /// - public static int GetTitleVersion(string wadtmd) - { - byte[] temp = Tools.LoadFileToByteArray(wadtmd, 0, 10000); - return GetTitleVersion(temp); - } - - /// - /// Returns the title version of the wad file - /// - /// - /// - public static int GetTitleVersion(byte[] wadtmd) - { - int tmdpos = 0; - - if (IsThisWad(wadtmd) == true) { tmdpos = GetTmdPos(wadtmd); } - return Tools.HexStringToInt(wadtmd[tmdpos + 0x1dc].ToString("x2") + wadtmd[tmdpos + 0x1dd].ToString("x2")); - } - - /// - /// Returns the IOS that is needed by the wad file - /// - /// - /// - public static string GetIosFlag(byte[] wadtmd) - { - string type = GetChannelType(wadtmd, 1); - - if (!type.Contains("IOS") && !type.Contains("BC")) - { - int tmdpos = 0; - if (IsThisWad(wadtmd) == true) { tmdpos = GetTmdPos(wadtmd); } - return "IOS" + Tools.HexStringToInt(wadtmd[tmdpos + 0x188].ToString("x2") + wadtmd[tmdpos + 0x189].ToString("x2") + wadtmd[tmdpos + 0x18a].ToString("x2") + wadtmd[tmdpos + 0x18b].ToString("x2")); - } - else return ""; - } - - /// - /// Returns the region of the wad file - /// - /// - /// - public static string GetRegionFlag(byte[] wadtmd) - { - int tmdpos = 0; - string channeltype = GetChannelType(wadtmd, 1); - - if (IsThisWad(wadtmd) == true) { tmdpos = GetTmdPos(wadtmd); } - - if (!channeltype.Contains("System:")) - { - int region = Tools.HexStringToInt(wadtmd[tmdpos + 0x19d].ToString("x2")); - return RegionCode[region]; - } - else return ""; - } - - /// - /// Returns the Path where the wad will be installed on the Wii - /// - /// - /// - public static string GetNandPath(string wadfile) - { - byte[] wad = Tools.LoadFileToByteArray(wadfile); - return GetNandPath(wad, 0); - } - - /// - /// Returns the Path where the wad will be installed on the Wii - /// - /// - /// 0 = Tik, 1 = Tmd - /// - public static string GetNandPath(byte[] wadtiktmd, int type) - { - int tikpos = 0; - int tmdpos = 0; - - if (IsThisWad(wadtiktmd) == true) - { - tikpos = GetTikPos(wadtiktmd); - tmdpos = GetTmdPos(wadtiktmd); - } - - string thispath = ""; - - if (type == 0) - { - thispath = wadtiktmd[tikpos + 0x1dc].ToString("x2") + - wadtiktmd[tikpos + 0x1dd].ToString("x2") + - wadtiktmd[tikpos + 0x1de].ToString("x2") + - wadtiktmd[tikpos + 0x1df].ToString("x2") + - wadtiktmd[tikpos + 0x1e0].ToString("x2") + - wadtiktmd[tikpos + 0x1e1].ToString("x2") + - wadtiktmd[tikpos + 0x1e2].ToString("x2") + - wadtiktmd[tikpos + 0x1e3].ToString("x2"); - } - else - { - thispath = wadtiktmd[tmdpos + 0x18c].ToString("x2") + - wadtiktmd[tmdpos + 0x18d].ToString("x2") + - wadtiktmd[tmdpos + 0x18e].ToString("x2") + - wadtiktmd[tmdpos + 0x18f].ToString("x2") + - wadtiktmd[tmdpos + 0x190].ToString("x2") + - wadtiktmd[tmdpos + 0x191].ToString("x2") + - wadtiktmd[tmdpos + 0x192].ToString("x2") + - wadtiktmd[tmdpos + 0x193].ToString("x2"); - } - - thispath = thispath.Insert(8, "\\"); - return thispath; - } - - /// - /// Returns true, if the wad file is a WiiWare / VC title. - /// - /// - /// 0 = Tik, 1 = Tmd - /// - public static string CheckWiiWareVC(byte[] wadtiktmd, int type) - { - int tiktmdpos = 0; - int offset = 0x221; - int idoffset = 0x1e0; - - if (type == 1) { offset = 0x197; idoffset = 0x190; } - if (IsThisWad(wadtiktmd) == true) - { - if (type == 1) tiktmdpos = GetTmdPos(wadtiktmd); - else tiktmdpos = GetTikPos(wadtiktmd); - } - - if (wadtiktmd[tiktmdpos + offset] == 0x01) - { - char idchar = Convert.ToChar(wadtiktmd[tiktmdpos + idoffset]); - char idchar2 = Convert.ToChar(wadtiktmd[tiktmdpos + idoffset + 1]); - - if (idchar == 'H') return "System Channel"; - else if (idchar == 'W') return "WiiWare"; - else - { - if (idchar == 'C') return "C64"; - else if (idchar == 'E' && idchar2 == 'A') return "NeoGeo"; - else if (idchar == 'E') return "VC - Arcade"; - else if (idchar == 'F') return "NES"; - else if (idchar == 'J') return "SNES"; - else if (idchar == 'L') return "Sega Master System"; - else if (idchar == 'M') return "Sega Genesis"; - else if (idchar == 'N') return "Nintendo 64"; - else if (idchar == 'P') return "Turbografx"; - else if (idchar == 'Q') return "Turbografx CD"; - else return "Channel Title"; - } - } - else return "Channel Title"; - } - - /// - /// Returns all information stored in the tmd for all contents in the wad file. - /// [x, 0] = Content ID, [x, 1] = Index, [x, 2] = Type, [x, 3] = Size, [x, 4] = Sha1 - /// - /// - /// - public static string[,] GetContentInfo(byte[] wadtmd) - { - int tmdpos = 0; - - if (IsThisWad(wadtmd) == true) { tmdpos = GetTmdPos(wadtmd); } - int contentcount = GetContentNum(wadtmd); - string[,] contentinfo = new string[contentcount, 5]; - - for (int i = 0; i < contentcount; i++) - { - contentinfo[i, 0] = wadtmd[tmdpos + 0x1e4 + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1e5 + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1e6 + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1e7 + (36 * i)].ToString("x2"); - contentinfo[i, 1] = "0000" + - wadtmd[tmdpos + 0x1e8 + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1e9 + (36 * i)].ToString("x2"); - contentinfo[i, 2] = wadtmd[tmdpos + 0x1ea + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1eb + (36 * i)].ToString("x2"); - contentinfo[i, 3] = Tools.HexStringToInt( - wadtmd[tmdpos + 0x1ec + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1ed + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1ee + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1ef + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1f0 + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1f1 + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1f2 + (36 * i)].ToString("x2") + - wadtmd[tmdpos + 0x1f3 + (36 * i)].ToString("x2")).ToString(); - - for (int j = 0; j < 20; j++) - { - contentinfo[i, 4] += wadtmd[tmdpos + 0x1f4 + (36 * i) + j].ToString("x2"); - } - } - - return contentinfo; - } - - /// - /// Returns the Tik of the wad file as a Byte-Array - /// - /// - /// - public static byte[] ReturnTik(byte[] wadfile) - { - int tikpos = GetTikPos(wadfile); - int tiksize = GetTikSize(wadfile); - - byte[] tik = new byte[tiksize]; - - for (int i = 0; i < tiksize; i++) - { - tik[i] = wadfile[tikpos + i]; - } - - return tik; - } - - /// - /// Returns the Tmd of the wad file as a Byte-Array - /// - /// - /// - public static byte[] ReturnTmd(byte[] wadfile) - { - int tmdpos = GetTmdPos(wadfile); - int tmdsize = GetTmdSize(wadfile); - - byte[] tmd = new byte[tmdsize]; - - for (int i = 0; i < tmdsize; i++) - { - tmd[i] = wadfile[tmdpos + i]; - } - - return tmd; - } - - /// - /// Checks, if the given file is a wad - /// - /// - /// - public static bool IsThisWad(byte[] wadtiktmd) - { - if (wadtiktmd[0] == 0x00 && - wadtiktmd[1] == 0x00 && - wadtiktmd[2] == 0x00 && - wadtiktmd[3] == 0x20 && - wadtiktmd[4] == 0x49 && - wadtiktmd[5] == 0x73) - { return true; } - - return false; - } - - /// - /// Returns the decrypted TitleKey - /// - /// - /// - public static byte[] GetTitleKey(byte[] wadtik) - { - byte[] commonkey = new byte[16]; - - if (File.Exists(System.Windows.Forms.Application.StartupPath + "\\common-key.bin")) - { commonkey = Tools.LoadFileToByteArray(System.Windows.Forms.Application.StartupPath + "\\common-key.bin"); } - else if (File.Exists(System.Windows.Forms.Application.StartupPath + "\\key.bin")) - { commonkey = Tools.LoadFileToByteArray(System.Windows.Forms.Application.StartupPath + "\\key.bin"); } - else { throw new FileNotFoundException("The (common-)key.bin must be in the application directory!"); } - - byte[] encryptedkey = new byte[16]; - byte[] iv = new byte[16]; - int tikpos = 0; - - if (IsThisWad(wadtik) == true) - { - //It's a wad file, so get the tik position - tikpos = GetTikPos(wadtik); - } - - for (int i = 0; i < 16; i++) - { - encryptedkey[i] = wadtik[tikpos + 0x1bf + i]; - } - - for (int j = 0; j < 8; j++) - { - iv[j] = wadtik[tikpos + 0x1dc + j]; - iv[j + 8] = 0x00; - } - - RijndaelManaged decrypt = new RijndaelManaged(); - decrypt.Mode = CipherMode.CBC; - decrypt.Padding = PaddingMode.None; - decrypt.KeySize = 128; - decrypt.BlockSize = 128; - decrypt.Key = commonkey; - decrypt.IV = iv; - - ICryptoTransform cryptor = decrypt.CreateDecryptor(); - - MemoryStream memory = new MemoryStream(encryptedkey); - CryptoStream crypto = new CryptoStream(memory, cryptor, CryptoStreamMode.Read); - - byte[] decryptedkey = new byte[16]; - crypto.Read(decryptedkey, 0, decryptedkey.Length); - - crypto.Close(); - memory.Close(); - - return decryptedkey; - } - } - - public class WadEdit - { - /// - /// Changes the region of the wad file - /// - /// - /// 0 = JAP, 1 = USA, 2 = EUR, 3 = FREE - /// - public static byte[] ChangeRegion(byte[] wadfile, int region) - { - - int tmdpos = WadInfo.GetTmdPos(wadfile); - - if (region == 0) wadfile[tmdpos + 0x19d] = 0x00; - else if (region == 1) wadfile[tmdpos + 0x19d] = 0x01; - else if (region == 2) wadfile[tmdpos + 0x19d] = 0x02; - else wadfile[tmdpos + 0x19d] = 0x03; - - wadfile = TruchaSign(wadfile, 1); - - return wadfile; - } - - /// - /// Changes the region of the wad file - /// - /// - /// - public static void ChangeRegion(string wadfile, int region) - { - byte[] wadarray = Tools.LoadFileToByteArray(wadfile); - wadarray = ChangeRegion(wadarray, region); - - using (FileStream fs = new FileStream(wadfile, FileMode.Open, FileAccess.Write)) - { - fs.Seek(0, SeekOrigin.Begin); - fs.Write(wadarray, 0, wadarray.Length); - } - } - - /// - /// Changes the Channel Title of the wad file - /// All languages have the same title - /// - /// - /// - /// - public static byte[] ChangeChannelTitle(byte[] wadfile, string title) - { - return ChangeChannelTitle(wadfile, title, title, title, title, title, title, title); - } - - /// - /// Changes the Channel Title of the wad file - /// Each language has a specific title - /// - /// - /// - /// - /// - /// - /// - /// - /// - public static void ChangeChannelTitle(string wadfile, string jap, string eng, string ger, string fra, string spa, string ita, string dut) - { - byte[] wadarray = Tools.LoadFileToByteArray(wadfile); - wadarray = ChangeChannelTitle(wadarray, jap, eng, ger, fra, spa, ita, dut); - - using (FileStream fs = new FileStream(wadfile, FileMode.Open, FileAccess.Write)) - { - fs.Seek(0, SeekOrigin.Begin); - fs.Write(wadarray, 0, wadarray.Length); - } - } - - /// - /// Changes the Channel Title of the wad file - /// Each language has a specific title - /// - /// - /// Japanese Title - /// English Title - /// German Title - /// French Title - /// Spanish Title - /// Italian Title - /// Dutch Title - /// - public static byte[] ChangeChannelTitle(byte[] wadfile, string jap, string eng, string ger, string fra, string spa, string ita, string dut) - { - Tools.ChangeProgress(0); - - char[] japchars = jap.ToCharArray(); - char[] engchars = eng.ToCharArray(); - char[] gerchars = ger.ToCharArray(); - char[] frachars = fra.ToCharArray(); - char[] spachars = spa.ToCharArray(); - char[] itachars = ita.ToCharArray(); - char[] dutchars = dut.ToCharArray(); - - byte[] titlekey = WadInfo.GetTitleKey(wadfile); - string[,] conts = WadInfo.GetContentInfo(wadfile); - int tmdpos = WadInfo.GetTmdPos(wadfile); - int tmdsize = WadInfo.GetTmdSize(wadfile); - int nullapp = 0; - int contentpos = 64 + Tools.AddPadding(WadInfo.GetCertSize(wadfile)) + Tools.AddPadding(WadInfo.GetTikSize(wadfile)) + Tools.AddPadding(WadInfo.GetTmdSize(wadfile)); - SHA1Managed sha1 = new SHA1Managed(); - - Tools.ChangeProgress(10); - - for (int i = 0; i < conts.GetLength(0); i++) - { - if (conts[i, 1] == "00000000") - { - nullapp = i; - break; - } - else - contentpos += Tools.AddPadding(Convert.ToInt32(conts[i, 3])); - } - - byte[] contenthandle = DecryptContent(wadfile, nullapp, titlekey); - - Tools.ChangeProgress(25); - - int imetpos = 0; - - for (int z = 0; z < 400; z++) - { - if (Convert.ToChar(contenthandle[z]) == 'I') - if (Convert.ToChar(contenthandle[z + 1]) == 'M') - if (Convert.ToChar(contenthandle[z + 2]) == 'E') - if (Convert.ToChar(contenthandle[z + 3]) == 'T') - { - imetpos = z; - break; - } - } - - Tools.ChangeProgress(40); - - int count = 0; - - for (int x = imetpos; x < imetpos + 40; x += 2) - { - if (japchars.Length > count) { contenthandle[x + 29] = Convert.ToByte(japchars[count]); } - else { contenthandle[x + 29] = 0x00; } - if (engchars.Length > count) { contenthandle[x + 29 + 84] = Convert.ToByte(engchars[count]); } - else { contenthandle[x + 29 + 84] = 0x00; } - if (gerchars.Length > count) { contenthandle[x + 29 + 84 * 2] = Convert.ToByte(gerchars[count]); } - else { contenthandle[x + 29 + 84 * 2] = 0x00; } - if (frachars.Length > count) { contenthandle[x + 29 + 84 * 3] = Convert.ToByte(frachars[count]); } - else { contenthandle[x + 29 + 84 * 3] = 0x00; } - if (spachars.Length > count) { contenthandle[x + 29 + 84 * 4] = Convert.ToByte(spachars[count]); } - else { contenthandle[x + 29 + 84 * 4] = 0x00; } - if (itachars.Length > count) { contenthandle[x + 29 + 84 * 5] = Convert.ToByte(itachars[count]); } - else { contenthandle[x + 29 + 84 * 5] = 0x00; } - if (dutchars.Length > count) { contenthandle[x + 29 + 84 * 6] = Convert.ToByte(dutchars[count]); } - else { contenthandle[x + 29 + 84 * 6] = 0x00; } - - count++; - } - - Tools.ChangeProgress(50); - - byte[] newmd5 = new byte[16]; - contenthandle = FixMD5InImet(contenthandle, out newmd5); - byte[] newsha = sha1.ComputeHash(contenthandle); - - contenthandle = EncryptContent(contenthandle, WadInfo.ReturnTmd(wadfile), nullapp, titlekey, false); - - Tools.ChangeProgress(70); - - for (int y = 0; y < contenthandle.Length; y++) - { - wadfile[contentpos + y] = contenthandle[y]; - } - - //SHA1 in TMD - byte[] tmd = Tools.GetPartOfByteArray(wadfile, tmdpos, tmdsize); - for (int i = 0; i < 20; i++) - tmd[0x1f4 + (36 * nullapp) + i] = newsha[i]; - TruchaSign(tmd, 1); - wadfile = Tools.InsertByteArray(wadfile, tmd, tmdpos); - - int footer = WadInfo.GetFooterSize(wadfile); - - Tools.ChangeProgress(80); - - if (footer > 0) - { - int footerpos = wadfile.Length - footer; - int imetposfoot = 0; - - for (int z = 0; z < 200; z++) - { - if (Convert.ToChar(wadfile[footerpos + z]) == 'I') - if (Convert.ToChar(wadfile[footerpos + z + 1]) == 'M') - if (Convert.ToChar(wadfile[footerpos + z + 2]) == 'E') - if (Convert.ToChar(wadfile[footerpos + z + 3]) == 'T') - { - imetposfoot = footerpos + z; - break; - } - } - - Tools.ChangeProgress(90); - - int count2 = 0; - - for (int x = imetposfoot; x < imetposfoot + 40; x += 2) - { - if (japchars.Length > count2) { wadfile[x + 29] = Convert.ToByte(japchars[count2]); } - else { wadfile[x + 29] = 0x00; } - if (engchars.Length > count2) { wadfile[x + 29 + 84] = Convert.ToByte(engchars[count2]); } - else { wadfile[x + 29 + 84] = 0x00; } - if (gerchars.Length > count2) { wadfile[x + 29 + 84 * 2] = Convert.ToByte(gerchars[count2]); } - else { wadfile[x + 29 + 84 * 2] = 0x00; } - if (frachars.Length > count2) { wadfile[x + 29 + 84 * 3] = Convert.ToByte(frachars[count2]); } - else { wadfile[x + 29 + 84 * 3] = 0x00; } - if (spachars.Length > count2) { wadfile[x + 29 + 84 * 4] = Convert.ToByte(spachars[count2]); } - else { wadfile[x + 29 + 84 * 4] = 0x00; } - if (itachars.Length > count2) { wadfile[x + 29 + 84 * 5] = Convert.ToByte(itachars[count2]); } - else { wadfile[x + 29 + 84 * 5] = 0x00; } - if (dutchars.Length > count2) { wadfile[x + 29 + 84 * 6] = Convert.ToByte(dutchars[count2]); } - else { wadfile[x + 29 + 84 * 6] = 0x00; } - - count2++; - } - - for (int i = 0; i < 16; i++) - wadfile[imetposfoot + 1456 + i] = newmd5[i]; - } - - Tools.ChangeProgress(100); - return wadfile; - } - - /// - /// Changes the Title ID in the Tik or Tmd file - /// - /// - /// 0 = Tik, 1 = Tmd - /// - public static void ChangeTitleID(string tiktmdfile, int type, string titleid) - { - byte[] temp = Tools.LoadFileToByteArray(tiktmdfile); - temp = ChangeTitleID(temp, type, titleid); - Tools.SaveFileFromByteArray(temp, tiktmdfile); - } - - /// - /// Changes the Title ID in the Tik or Tmd file - /// - /// - /// 0 = Tik, 1 = Tmd - /// - public static byte[] ChangeTitleID(byte[] tiktmd, int type, string titleid) - { - int offset = 0x1e0; - if (type == 1) offset = 0x190; - char[] id = titleid.ToCharArray(); - - tiktmd[offset] = (byte)id[0]; - tiktmd[offset + 1] = (byte)id[1]; - tiktmd[offset + 2] = (byte)id[2]; - tiktmd[offset + 3] = (byte)id[3]; - - tiktmd = TruchaSign(tiktmd, type); - - return tiktmd; - } - - /// - /// Changes the title ID of the wad file - /// - /// - /// - /// - public static byte[] ChangeTitleID(byte[] wadfile, string titleid) - { - Tools.ChangeProgress(0); - - int tikpos = WadInfo.GetTikPos(wadfile); - int tmdpos = WadInfo.GetTmdPos(wadfile); - char[] id = titleid.ToCharArray(); - - byte[] oldtitlekey = WadInfo.GetTitleKey(wadfile); - - Tools.ChangeProgress(20); - - //Change the ID in the ticket - wadfile[tikpos + 0x1e0] = (byte)id[0]; - wadfile[tikpos + 0x1e1] = (byte)id[1]; - wadfile[tikpos + 0x1e2] = (byte)id[2]; - wadfile[tikpos + 0x1e3] = (byte)id[3]; - - //Change the ID in the tmd - wadfile[tmdpos + 0x190] = (byte)id[0]; - wadfile[tmdpos + 0x191] = (byte)id[1]; - wadfile[tmdpos + 0x192] = (byte)id[2]; - wadfile[tmdpos + 0x193] = (byte)id[3]; - - Tools.ChangeProgress(40); - - //Trucha-Sign both - wadfile = TruchaSign(wadfile, 0); - - Tools.ChangeProgress(50); - - wadfile = TruchaSign(wadfile, 1); - - Tools.ChangeProgress(60); - - byte[] newtitlekey = WadInfo.GetTitleKey(wadfile); - byte[] tmd = WadInfo.ReturnTmd(wadfile); - - int contentcount = WadInfo.GetContentNum(wadfile); - - wadfile = ReEncryptAllContents(wadfile, oldtitlekey, newtitlekey); - - Tools.ChangeProgress(100); - return wadfile; - } - - /// - /// Changes the title ID of the wad file - /// - /// - /// - public static void ChangeTitleID(string wadfile, string titleid) - { - byte[] wadarray = Tools.LoadFileToByteArray(wadfile); - wadarray = ChangeTitleID(wadarray, titleid); - - using (FileStream fs = new FileStream(wadfile, FileMode.Open, FileAccess.Write)) - { - fs.Seek(0, SeekOrigin.Begin); - fs.Write(wadarray, 0, wadarray.Length); - } - } - - /// - /// Clears the Signature of the Tik / Tmd to 0x00 - /// - /// Wad, Tik or Tmd - /// 0 = Tik, 1 = Tmd - /// - public static byte[] ClearSignature(byte[] wadtiktmd, int type) - { - int tmdtikpos = 0; - int tmdtiksize = wadtiktmd.Length; ; - - if (WadInfo.IsThisWad(wadtiktmd) == true) - { - //It's a wad file, so get the tik or tmd position and length - switch (type) - { - case 1: - tmdtikpos = WadInfo.GetTmdPos(wadtiktmd); - tmdtiksize = WadInfo.GetTmdSize(wadtiktmd); - break; - default: - tmdtikpos = WadInfo.GetTikPos(wadtiktmd); - tmdtiksize = WadInfo.GetTikSize(wadtiktmd); - break; - } - } - - for (int i = 4; i < 260; i++) - { - wadtiktmd[tmdtikpos + i] = 0x00; - } - - return wadtiktmd; - } - - /// - /// Trucha-Signs the Tik or Tmd - /// - /// Wad or Tik or Tmd - /// 0 = Tik, 1 = Tmd - /// - public static void TruchaSign(string file, int type) - { - byte[] temp = Tools.LoadFileToByteArray(file); - temp = TruchaSign(temp, type); - Tools.SaveFileFromByteArray(temp, file); - } - - /// - /// Trucha-Signs the Tik or Tmd - /// - /// Wad or Tik or Tmd - /// 0 = Tik, 1 = Tmd - /// - public static byte[] TruchaSign(byte[] wadtiktmd, int type) - { - SHA1Managed sha = new SHA1Managed(); - int[] position = new int[2] { 0x1f1, 0x1d4 }; //0x104 0x1c1 - int[] tosign = new int[2] { 0x140, 0x140 }; //0x104 0x140 - int tiktmdpos = 0; - int tiktmdsize = wadtiktmd.Length; - - if (sha.ComputeHash(wadtiktmd, tiktmdpos + tosign[type], tiktmdsize - tosign[type])[0] != 0x00) - { - ClearSignature(wadtiktmd, type); - - if (WadInfo.IsThisWad(wadtiktmd) == true) - { - //It's a wad file - if (type == 0) //Get Tik position and size - { - tiktmdpos = WadInfo.GetTikPos(wadtiktmd); - tiktmdsize = WadInfo.GetTikSize(wadtiktmd); - } - else //Get Tmd position and size - { - tiktmdpos = WadInfo.GetTmdPos(wadtiktmd); - tiktmdsize = WadInfo.GetTmdSize(wadtiktmd); - } - } - - byte[] sha1 = new byte[20]; - - for (UInt16 i = 0; i < 65535; i++) - { - byte[] hex = BitConverter.GetBytes(i); - wadtiktmd[tiktmdpos + position[type]] = hex[0]; - wadtiktmd[tiktmdpos + position[type] + 1] = hex[1]; - - sha1 = sha.ComputeHash(wadtiktmd, tiktmdpos + tosign[type], tiktmdsize - tosign[type]); - if (sha1[0] == 0x00) break; - } - - return wadtiktmd; - } - else return wadtiktmd; - } - - /// - /// Decrypts the given content - /// - /// - /// - public static byte[] DecryptContent(byte[] wadfile, int contentcount, byte[] titlekey) - { - int tmdpos = WadInfo.GetTmdPos(wadfile); - byte[] iv = new byte[16]; - string[,] continfo = WadInfo.GetContentInfo(wadfile); - int contentsize = Convert.ToInt32(continfo[contentcount, 3]); - int paddedsize = Tools.AddPadding(contentsize, 16); - - int contentpos = 64 + Tools.AddPadding(WadInfo.GetCertSize(wadfile)) + Tools.AddPadding(WadInfo.GetTikSize(wadfile)) + Tools.AddPadding(WadInfo.GetTmdSize(wadfile)); - - for (int x = 0; x < contentcount; x++) - { - contentpos += Tools.AddPadding(Convert.ToInt32(continfo[x, 3])); - } - - iv[0] = wadfile[tmdpos + 0x1e8 + (0x24 * contentcount)]; - iv[1] = wadfile[tmdpos + 0x1e9 + (0x24 * contentcount)]; - - RijndaelManaged decrypt = new RijndaelManaged(); - decrypt.Mode = CipherMode.CBC; - decrypt.Padding = PaddingMode.None; - decrypt.KeySize = 128; - decrypt.BlockSize = 128; - decrypt.Key = titlekey; - decrypt.IV = iv; - - ICryptoTransform cryptor = decrypt.CreateDecryptor(); - - MemoryStream memory = new MemoryStream(wadfile, contentpos, paddedsize); - CryptoStream crypto = new CryptoStream(memory, cryptor, CryptoStreamMode.Read); - - bool fullread = false; - byte[] buffer = new byte[16384]; - byte[] cont = new byte[1]; - - using (MemoryStream ms = new MemoryStream()) - { - while (fullread == false) - { - int len = 0; - if ((len = crypto.Read(buffer, 0, buffer.Length)) <= 0) - { - fullread = true; - cont = ms.ToArray(); - } - ms.Write(buffer, 0, len); - } - } - - memory.Close(); - crypto.Close(); - - Array.Resize(ref cont, contentsize); - - return cont; - } - - /// - /// Decrypts the given content - /// - /// - /// - /// - /// - /// - public static byte[] DecryptContent(byte[] content, byte[] tmd, int contentcount, byte[] titlekey) - { - byte[] iv = new byte[16]; - string[,] continfo = WadInfo.GetContentInfo(tmd); - int contentsize = content.Length; - int paddedsize = Tools.AddPadding(contentsize, 16); - Array.Resize(ref content, paddedsize); - - iv[0] = tmd[0x1e8 + (0x24 * contentcount)]; - iv[1] = tmd[0x1e9 + (0x24 * contentcount)]; - - RijndaelManaged decrypt = new RijndaelManaged(); - decrypt.Mode = CipherMode.CBC; - decrypt.Padding = PaddingMode.None; - decrypt.KeySize = 128; - decrypt.BlockSize = 128; - decrypt.Key = titlekey; - decrypt.IV = iv; - - ICryptoTransform cryptor = decrypt.CreateDecryptor(); - - MemoryStream memory = new MemoryStream(content, 0, paddedsize); - CryptoStream crypto = new CryptoStream(memory, cryptor, CryptoStreamMode.Read); - - bool fullread = false; - byte[] buffer = new byte[memory.Length]; - byte[] cont = new byte[1]; - - using (MemoryStream ms = new MemoryStream()) - { - while (fullread == false) - { - int len = 0; - if ((len = crypto.Read(buffer, 0, buffer.Length)) <= 0) - { - fullread = true; - cont = ms.ToArray(); - } - ms.Write(buffer, 0, len); - } - } - - memory.Close(); - crypto.Close(); - - return cont; - } - - /// - /// Encrypts the given content and adds a padding to the next 64 bytes - /// - /// - /// - /// - /// - /// - public static byte[] EncryptContent(byte[] content, byte[] tmd, int contentcount, byte[] titlekey, bool addpadding) - { - byte[] iv = new byte[16]; - string[,] continfo = WadInfo.GetContentInfo(tmd); - int contentsize = content.Length; - int paddedsize = Tools.AddPadding(contentsize, 16); - Array.Resize(ref content, paddedsize); - - iv[0] = tmd[0x1e8 + (0x24 * contentcount)]; - iv[1] = tmd[0x1e9 + (0x24 * contentcount)]; - - RijndaelManaged encrypt = new RijndaelManaged(); - encrypt.Mode = CipherMode.CBC; - encrypt.Padding = PaddingMode.None; - encrypt.KeySize = 128; - encrypt.BlockSize = 128; - encrypt.Key = titlekey; - encrypt.IV = iv; - - ICryptoTransform cryptor = encrypt.CreateEncryptor(); - - MemoryStream memory = new MemoryStream(content, 0, paddedsize); - CryptoStream crypto = new CryptoStream(memory, cryptor, CryptoStreamMode.Read); - - bool fullread = false; - byte[] buffer = new byte[memory.Length]; - byte[] cont = new byte[1]; - - using (MemoryStream ms = new MemoryStream()) - { - while (fullread == false) - { - int len = 0; - if ((len = crypto.Read(buffer, 0, buffer.Length)) <= 0) - { - fullread = true; - cont = ms.ToArray(); - } - ms.Write(buffer, 0, len); - } - } - - memory.Close(); - crypto.Close(); - - if (addpadding == true) { Array.Resize(ref cont, Tools.AddPadding(cont.Length)); } - return cont; - } - - /// - /// Re-Encrypts the given content - /// - /// - /// - public static byte[] ReEncryptAllContents(byte[] wadfile, byte[] oldtitlekey, byte[] newtitlekey) - { - int contentnum = WadInfo.GetContentNum(wadfile); - int certsize = WadInfo.GetCertSize(wadfile); - int tiksize = WadInfo.GetTikSize(wadfile); - int tmdsize = WadInfo.GetTmdSize(wadfile); - int contentpos = 64 + Tools.AddPadding(certsize) + Tools.AddPadding(tiksize) + Tools.AddPadding(tmdsize); - - for (int i = 0; i < contentnum; i++) - { - byte[] tmd = WadInfo.ReturnTmd(wadfile); - byte[] decryptedcontent = DecryptContent(wadfile, i, oldtitlekey); - byte[] encryptedcontent = EncryptContent(decryptedcontent, tmd, i, newtitlekey, false); - - for (int j = 0; j < encryptedcontent.Length; j++) - { - wadfile[contentpos + j] = encryptedcontent[j]; - } - contentpos += Tools.AddPadding(encryptedcontent.Length); - } - - return wadfile; - } - - /// - /// Fixes the MD5 Sum in the IMET Header - /// - /// - /// - public static byte[] FixMD5InImet(byte[] file, out byte[] newmd5) - { - if (Convert.ToChar(file[128]) == 'I' && - Convert.ToChar(file[129]) == 'M' && - Convert.ToChar(file[130]) == 'E' && - Convert.ToChar(file[131]) == 'T') - { - byte[] buffer = new byte[1536]; - - using (MemoryStream ms = new MemoryStream()) - { - ms.Write(file, 0x40, 1536); - buffer = ms.ToArray(); - } - - for (int i = 0; i < 16; i++) - buffer[1520 + i] = 0x00; - - MD5 md5 = new MD5CryptoServiceProvider(); - byte[] hash = md5.ComputeHash(buffer); - - for (int i = 0; i < 16; i++) - file[1584 + i] = hash[i]; - - newmd5 = hash; - return file; - } - else - { - byte[] oldmd5 = new byte[16]; - - using (MemoryStream ms = new MemoryStream()) - { - ms.Write(file, 1584, 16); - oldmd5 = ms.ToArray(); - } - - newmd5 = oldmd5; - return file; - } - } - - /// - /// Fixes the MD5 Sum in the IMET Header. - /// - /// - /// - public static byte[] FixMD5InImet(byte[] file) - { - byte[] tmp = new byte[16]; - return FixMD5InImet(file, out tmp); - } - - /// - /// Updates the Content Info in the Tmd. - /// Tmd and Contents must be in the same Directory - /// - /// - public static void UpdateTmdContents(string tmdfile) - { - FileStream tmd = new FileStream(tmdfile, FileMode.Open, FileAccess.ReadWrite); - - tmd.Seek(0x1de, SeekOrigin.Begin); - int contentcount = Tools.HexStringToInt(tmd.ReadByte().ToString("x2") + tmd.ReadByte().ToString("x2")); - - for (int i = 0; i < contentcount; i++) - { - int oldsize = 0; - int contentpos = 0x1e4 + (36 * i); - - tmd.Seek(contentpos + 4, SeekOrigin.Begin); - string index = "0000" + tmd.ReadByte().ToString("x2") + tmd.ReadByte().ToString("x2"); - - tmd.Seek(contentpos + 8, SeekOrigin.Begin); - try - { - oldsize = Tools.HexStringToInt(tmd.ReadByte().ToString("x2") + - tmd.ReadByte().ToString("x2") + - tmd.ReadByte().ToString("x2") + - tmd.ReadByte().ToString("x2") + - tmd.ReadByte().ToString("x2") + - tmd.ReadByte().ToString("x2") + - tmd.ReadByte().ToString("x2") + - tmd.ReadByte().ToString("x2")); - } - catch { } - - byte[] oldsha1 = new byte[20]; - tmd.Read(oldsha1, 0, oldsha1.Length); - - if (File.Exists(tmdfile.Remove(tmdfile.LastIndexOf('\\') + 1) + index + ".app")) - { - byte[] content = Wii.Tools.LoadFileToByteArray(tmdfile.Remove(tmdfile.LastIndexOf('\\') + 1) + index + ".app"); - int newsize = content.Length; - - if (newsize != oldsize) - { - byte[] changedsize = Tools.FileLengthToByteArray(newsize); - - tmd.Seek(contentpos + 8, SeekOrigin.Begin); - for (int x = 8; x > changedsize.Length; x--) tmd.WriteByte(0x00); - tmd.Write(changedsize, 0, changedsize.Length); - } - - SHA1Managed sha1 = new SHA1Managed(); - byte[] newsha1 = sha1.ComputeHash(content); - sha1.Clear(); - - if (Tools.CompareByteArrays(newsha1, oldsha1) == false) - { - tmd.Seek(contentpos + 16, SeekOrigin.Begin); - tmd.Write(newsha1, 0, newsha1.Length); - } - } - else - { - throw new Exception("At least one content file wasn't found!"); - } - } - - tmd.Close(); - } - - /// - /// Changes the Boot Index in the Tmd to the given value - /// - /// - /// - public static byte[] ChangeTmdBootIndex(byte[] wadtmd, int newindex) - { - int tmdpos = 0; - - if (WadInfo.IsThisWad(wadtmd) == true) - tmdpos = WadInfo.GetTmdPos(wadtmd); - - byte[] index = BitConverter.GetBytes((UInt16)newindex); - wadtmd[tmdpos + 0x1e0] = index[1]; - wadtmd[tmdpos + 0x1e1] = index[0]; - - return wadtmd; - } - - /// - /// Changes the Content Count in the Tmd - /// - /// - /// - /// - public static byte[] ChangeTmdContentCount(byte[] wadtmd, int newcount) - { - int tmdpos = 0; - - if (WadInfo.IsThisWad(wadtmd) == true) - tmdpos = WadInfo.GetTmdPos(wadtmd); - - byte[] count = BitConverter.GetBytes((UInt16)newcount); - wadtmd[tmdpos + 0x1de] = count[1]; - wadtmd[tmdpos + 0x1df] = count[0]; - - return wadtmd; - } - - /// - /// Changes the Slot where the IOS Wad will be installed to - /// - /// - /// - /// - public static byte[] ChangeIosSlot(byte[] wadfile, int newslot) - { - Tools.ChangeProgress(0); - - int tikpos = WadInfo.GetTikPos(wadfile); - int tmdpos = WadInfo.GetTmdPos(wadfile); - byte[] slot = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(newslot)); - - byte[] oldtitlekey = WadInfo.GetTitleKey(wadfile); - - Tools.ChangeProgress(20); - - //Change the ID in the ticket - wadfile[tikpos + 0x1e0] = slot[0]; - wadfile[tikpos + 0x1e1] = slot[1]; - wadfile[tikpos + 0x1e2] = slot[2]; - wadfile[tikpos + 0x1e3] = slot[3]; - - //Change the ID in the tmd - wadfile[tmdpos + 0x190] = slot[0]; - wadfile[tmdpos + 0x191] = slot[1]; - wadfile[tmdpos + 0x192] = slot[2]; - wadfile[tmdpos + 0x193] = slot[3]; - - Tools.ChangeProgress(40); - - //Trucha-Sign both - wadfile = TruchaSign(wadfile, 0); - - Tools.ChangeProgress(50); - - wadfile = TruchaSign(wadfile, 1); - - Tools.ChangeProgress(60); - - byte[] newtitlekey = WadInfo.GetTitleKey(wadfile); - byte[] tmd = WadInfo.ReturnTmd(wadfile); - - int contentcount = WadInfo.GetContentNum(wadfile); - - wadfile = ReEncryptAllContents(wadfile, oldtitlekey, newtitlekey); - - Tools.ChangeProgress(100); - return wadfile; - } - - /// - /// Changes the Title Version of a Wad or Tmd - /// - /// - /// - /// - public static byte[] ChangeTitleVersion(byte[] wadtmd, int newversion) - { - if (newversion > 65535) throw new Exception("Version can be max. 65535"); - - int offset = 0x1dc; - int tmdpos = 0; - - if (WadInfo.IsThisWad(wadtmd)) - tmdpos = WadInfo.GetTmdPos(wadtmd); - - byte[] version = BitConverter.GetBytes((UInt16)newversion); - Array.Reverse(version); - - wadtmd[tmdpos + offset] = version[0]; - wadtmd[tmdpos + offset + 1] = version[1]; - - wadtmd = TruchaSign(wadtmd, 1); - - return wadtmd; - } - } - - public class WadUnpack - { - /// - /// Unpacks the the wad file - /// - public static void UnpackWad(string pathtowad, string destinationpath) - { - byte[] wadfile = Tools.LoadFileToByteArray(pathtowad); - UnpackWad(wadfile, destinationpath); - } - - /// - /// Unpacks the wad file to *wadpath*\wadunpack\ - /// - /// - public static void UnpackWad(string pathtowad) - { - string destinationpath = pathtowad.Remove(pathtowad.LastIndexOf('\\')); - byte[] wadfile = Tools.LoadFileToByteArray(pathtowad); - UnpackWad(wadfile, destinationpath); - } - - /// - /// Unpacks the 00000000.app of a wad - /// - /// - /// - public static void UnpackNullApp(string wadfile, string destination) - { - if (!destination.EndsWith(".app")) destination += "\\00000000.app"; - - byte[] wad = Tools.LoadFileToByteArray(wadfile); - byte[] nullapp = UnpackNullApp(wad); - Tools.SaveFileFromByteArray(nullapp, destination); - } - - /// - /// Unpacks the 00000000.app of a wad - /// - /// - /// - public static byte[] UnpackNullApp(byte[] wadfile) - { - int certsize = WadInfo.GetCertSize(wadfile); - int tiksize = WadInfo.GetTikSize(wadfile); - int tmdpos = WadInfo.GetTmdPos(wadfile); - int tmdsize = WadInfo.GetTmdSize(wadfile); - int contentpos = 64 + Tools.AddPadding(certsize) + Tools.AddPadding(tiksize) + Tools.AddPadding(tmdsize); - - byte[] titlekey = WadInfo.GetTitleKey(wadfile); - string[,] contents = WadInfo.GetContentInfo(wadfile); - - for (int i = 0; i < contents.GetLength(0); i++) - { - if (contents[i, 1] == "00000000") - { - return WadEdit.DecryptContent(wadfile, i, titlekey); - } - } - - throw new Exception("00000000.app couldn't be found in the Wad"); - } - - /// - /// Unpacks the wad file - /// - public static void UnpackWad(byte[] wadfile, string destinationpath) - { - if (destinationpath[destinationpath.Length - 1] != '\\') - { destinationpath = destinationpath + "\\"; } - - if (!Directory.Exists(destinationpath)) - { Directory.CreateDirectory(destinationpath); } - if (Directory.GetFiles(destinationpath, "*.app").Length > 0) - { - throw new Exception("At least one of the files to unpack already exists!"); - } - - int certpos = 0x40; - int certsize = WadInfo.GetCertSize(wadfile); - int tikpos = WadInfo.GetTikPos(wadfile); - int tiksize = WadInfo.GetTikSize(wadfile); - int tmdpos = WadInfo.GetTmdPos(wadfile); - int tmdsize = WadInfo.GetTmdSize(wadfile); - int contentlength = WadInfo.GetContentSize(wadfile); - int footersize = WadInfo.GetFooterSize(wadfile); - int footerpos = 64 + Tools.AddPadding(certsize) + Tools.AddPadding(tiksize) + Tools.AddPadding(tmdsize) + Tools.AddPadding(contentlength); - string wadpath = WadInfo.GetNandPath(wadfile, 0).Remove(8, 1); - string[,] contents = WadInfo.GetContentInfo(wadfile); - byte[] titlekey = WadInfo.GetTitleKey(wadfile); - int contentpos = 64 + Tools.AddPadding(certsize) + Tools.AddPadding(tiksize) + Tools.AddPadding(tmdsize); - - //unpack cert - using (FileStream cert = new FileStream(destinationpath + wadpath + ".cert", FileMode.Create)) - { - cert.Seek(0, SeekOrigin.Begin); - cert.Write(wadfile, certpos, certsize); - } - - //unpack ticket - using (FileStream tik = new FileStream(destinationpath + wadpath + ".tik", FileMode.Create)) - { - tik.Seek(0, SeekOrigin.Begin); - tik.Write(wadfile, tikpos, tiksize); - } - - //unpack tmd - using (FileStream tmd = new FileStream(destinationpath + wadpath + ".tmd", FileMode.Create)) - { - tmd.Seek(0, SeekOrigin.Begin); - tmd.Write(wadfile, tmdpos, tmdsize); - } - - //unpack trailer - try - { - if (footersize > 0) - { - using (FileStream trailer = new FileStream(destinationpath + wadpath + ".trailer", FileMode.Create)) - { - trailer.Seek(0, SeekOrigin.Begin); - trailer.Write(wadfile, footerpos, footersize); - } - } - } - catch { } //who cares if the trailer doesn't extract properly? - - Tools.ChangeProgress(0); - - //unpack contents - for (int i = 0; i < contents.GetLength(0); i++) - { - Tools.ChangeProgress((i + 1) * 100 / contents.GetLength(0)); - byte[] thiscontent = WadEdit.DecryptContent(wadfile, i, titlekey); - FileStream content = new FileStream(destinationpath + contents[i, 1] + ".app", FileMode.Create); - - content.Write(thiscontent, 0, thiscontent.Length); - content.Close(); - - contentpos += Tools.AddPadding(thiscontent.Length); - - //sha1 comparison - SHA1Managed sha1 = new SHA1Managed(); - byte[] thishash = sha1.ComputeHash(thiscontent); - byte[] tmdhash = Tools.HexStringToByteArray(contents[i, 4]); - - if (Tools.CompareByteArrays(thishash, tmdhash) == false) - throw new Exception("At least one content's hash doesn't match the hash in the Tmd!"); - } - } - - /// - /// Unpacks the wad file to the given directory. - /// Shared contents will be unpacked to /shared1 - /// - /// - /// - public static void UnpackToNand(string wadfile, string nandpath) - { - byte[] wadarray = Tools.LoadFileToByteArray(wadfile); - UnpackToNand(wadarray, nandpath); - } - - /// - /// Unpacks the wad file to the given directory. - /// Shared contents will be unpacked to /shared1 - /// - /// - /// - public static void UnpackToNand(byte[] wadfile, string nandpath) - { - string path = WadInfo.GetNandPath(wadfile, 0); - string path1 = path.Remove(path.IndexOf('\\')); - string path2 = path.Remove(0, path.IndexOf('\\') + 1); - - if (nandpath[nandpath.Length - 1] != '\\') { nandpath = nandpath + "\\"; } - - if (!Directory.Exists(nandpath + "ticket")) { Directory.CreateDirectory(nandpath + "ticket"); } - if (!Directory.Exists(nandpath + "title")) { Directory.CreateDirectory(nandpath + "title"); } - if (!Directory.Exists(nandpath + "ticket\\" + path1)) { Directory.CreateDirectory(nandpath + "ticket\\" + path1); } - if (!Directory.Exists(nandpath + "title\\" + path1)) { Directory.CreateDirectory(nandpath + "title\\" + path1); } - if (!Directory.Exists(nandpath + "title\\" + path1 + "\\" + path2)) { Directory.CreateDirectory(nandpath + "title\\" + path1 + "\\" + path2); } - if (!Directory.Exists(nandpath + "title\\" + path1 + "\\" + path2 + "\\content")) { Directory.CreateDirectory(nandpath + "title\\" + path1 + "\\" + path2 + "\\content"); } - if (!Directory.Exists(nandpath + "title\\" + path1 + "\\" + path2 + "\\data")) { Directory.CreateDirectory(nandpath + "title\\" + path1 + "\\" + path2 + "\\data"); } - if (!Directory.Exists(nandpath + "shared1")) Directory.CreateDirectory(nandpath + "shared1"); - - int certsize = WadInfo.GetCertSize(wadfile); - int tikpos = WadInfo.GetTikPos(wadfile); - int tiksize = WadInfo.GetTikSize(wadfile); - int tmdpos = WadInfo.GetTmdPos(wadfile); - int tmdsize = WadInfo.GetTmdSize(wadfile); - int contentlength = WadInfo.GetContentSize(wadfile); - string[,] contents = WadInfo.GetContentInfo(wadfile); - byte[] titlekey = WadInfo.GetTitleKey(wadfile); - int contentpos = 64 + Tools.AddPadding(certsize) + Tools.AddPadding(tiksize) + Tools.AddPadding(tmdsize); - - //unpack ticket - using (FileStream tik = new FileStream(nandpath + "ticket\\" + path1 + "\\" + path2 + ".tik", FileMode.Create)) - { - tik.Seek(0, SeekOrigin.Begin); - tik.Write(wadfile, tikpos, tiksize); - } - - //unpack tmd - using (FileStream tmd = new FileStream(nandpath + "title\\" + path1 + "\\" + path2 + "\\content\\title.tmd", FileMode.Create)) - { - tmd.Seek(0, SeekOrigin.Begin); - tmd.Write(wadfile, tmdpos, tmdsize); - } - - Tools.ChangeProgress(0); - - //unpack contents - for (int i = 0; i < contents.GetLength(0); i++) - { - Tools.ChangeProgress((i + 1) * 100 / contents.GetLength(0)); - byte[] thiscontent = WadEdit.DecryptContent(wadfile, i, titlekey); - - if (contents[i, 2] == "8001") - { - if (File.Exists(nandpath + "shared1\\content.map")) - { - byte[] contmap = Tools.LoadFileToByteArray(nandpath + "shared1\\content.map"); - - if (ContentMap.CheckSharedContent(contmap, contents[i, 4]) == false) - { - string newname = ContentMap.GetNewSharedContentName(contmap); - - FileStream content = new FileStream(nandpath + "shared1\\" + newname + ".app", FileMode.Create); - content.Write(thiscontent, 0, thiscontent.Length); - content.Close(); - ContentMap.AddSharedContent(nandpath + "shared1\\content.map", newname, contents[i, 4]); - } - } - else - { - FileStream content = new FileStream(nandpath + "shared1\\00000000.app", FileMode.Create); - content.Write(thiscontent, 0, thiscontent.Length); - content.Close(); - ContentMap.AddSharedContent(nandpath + "shared1\\content.map", "00000000", contents[i, 4]); - } - } - else - { - FileStream content = new FileStream(nandpath + "title\\" + path1 + "\\" + path2 + "\\content\\" + contents[i, 0] + ".app", FileMode.Create); - - content.Write(thiscontent, 0, thiscontent.Length); - content.Close(); - } - - contentpos += Tools.AddPadding(thiscontent.Length); - } - - //add titleid to uid.sys, if it doesn't exist - string titleid = WadInfo.GetFullTitleID(wadfile, 1); - - if (File.Exists(nandpath + "\\sys\\uid.sys")) - { - FileStream fs = new FileStream(nandpath + "\\sys\\uid.sys", FileMode.Open); - byte[] uidsys = new byte[fs.Length]; - fs.Read(uidsys, 0, uidsys.Length); - fs.Close(); - - if (UID.CheckUID(uidsys, titleid) == false) - { - uidsys = UID.AddUID(uidsys, titleid); - Tools.SaveFileFromByteArray(uidsys, nandpath + "\\sys\\uid.sys"); - } - } - else - { - if (!Directory.Exists(nandpath + "\\sys")) Directory.CreateDirectory(nandpath + "\\sys"); - byte[] uidsys = UID.AddUID(new byte[0], titleid); - Tools.SaveFileFromByteArray(uidsys, nandpath + "\\sys\\uid.sys"); - } - } - } - - public class WadPack - { - public static byte[] wadheader = new byte[8] { 0x00, 0x00, 0x00, 0x20, 0x49, 0x73, 0x00, 0x00 }; - - /// - /// Packs the contents in the given directory and creates the destination wad file - /// - /// - public static void PackWad(string contentdirectory, string destinationfile, bool includefooter) - { - if (contentdirectory[contentdirectory.Length - 1] != '\\') { contentdirectory = contentdirectory + "\\"; } - - if (!Directory.Exists(contentdirectory)) throw new DirectoryNotFoundException("The directory doesn't exists:\r\n" + contentdirectory); - if (Directory.GetFiles(contentdirectory, "*.app").Length < 1) throw new Exception("No *.app file was found"); - if (Directory.GetFiles(contentdirectory, "*.cert").Length < 1) throw new Exception("No *.cert file was found"); - if (Directory.GetFiles(contentdirectory, "*.tik").Length < 1) throw new Exception("No *.tik file was found"); - if (Directory.GetFiles(contentdirectory, "*.tmd").Length < 1) throw new Exception("No *.tmd file was found"); - if (File.Exists(destinationfile)) throw new Exception("The destination file already exists!"); - - string[] certfile = Directory.GetFiles(contentdirectory, "*.cert"); - string[] tikfile = Directory.GetFiles(contentdirectory, "*.tik"); - string[] tmdfile = Directory.GetFiles(contentdirectory, "*.tmd"); - string[] trailerfile = Directory.GetFiles(contentdirectory, "*.trailer"); - - byte[] cert = Tools.LoadFileToByteArray(certfile[0]); - byte[] tik = Tools.LoadFileToByteArray(tikfile[0]); - byte[] tmd = Tools.LoadFileToByteArray(tmdfile[0]); - - string[,] contents = WadInfo.GetContentInfo(tmd); - - FileStream wadstream = new FileStream(destinationfile, FileMode.Create); - - //Trucha-Sign Tik and Tmd, if they aren't already - WadEdit.TruchaSign(tik, 0); - WadEdit.TruchaSign(tmd, 1); - - //Write Cert - wadstream.Seek(64, SeekOrigin.Begin); - wadstream.Write(cert, 0, cert.Length); - - //Write Tik - wadstream.Seek(64 + Tools.AddPadding(cert.Length), SeekOrigin.Begin); - wadstream.Write(tik, 0, tik.Length); - - //Write Tmd - wadstream.Seek(64 + Tools.AddPadding(cert.Length) + Tools.AddPadding(tik.Length), SeekOrigin.Begin); - wadstream.Write(tmd, 0, tmd.Length); - - //Write Content - int allcont = 0; - int contpos = 64 + Tools.AddPadding(cert.Length) + Tools.AddPadding(tik.Length) + Tools.AddPadding(tmd.Length); - int contcount = WadInfo.GetContentNum(tmd); - - Tools.ChangeProgress(0); - byte[] titlekey = WadInfo.GetTitleKey(tik); - - for (int i = 0; i < contents.GetLength(0); i++) - { - Tools.ChangeProgress((i + 1) * 100 / contents.GetLength(0)); - byte[] thiscont = Tools.LoadFileToByteArray(contentdirectory + contents[i, 1] + ".app"); - - //if (i == contents.GetLength(0) - 1) { thiscont = WadEdit.EncryptContent(thiscont, tmd, i, titlekey, false); } - //else { thiscont = WadEdit.EncryptContent(thiscont, tmd, i, titlekey, true); } - thiscont = WadEdit.EncryptContent(thiscont, tmd, i, titlekey, true); - - wadstream.Seek(contpos, SeekOrigin.Begin); - wadstream.Write(thiscont, 0, thiscont.Length); - contpos += thiscont.Length; - allcont += thiscont.Length; - } - - //Write Trailer, if exists and includefooter = true - int trailerlength = 0; - if (trailerfile.Length > 0 && includefooter == true) - { - byte[] trailer = Tools.LoadFileToByteArray(trailerfile[0]); - trailerlength = trailer.Length; - Array.Resize(ref trailer, Tools.AddPadding(trailer.Length)); - wadstream.Seek(Tools.AddPadding(contpos), SeekOrigin.Begin); - wadstream.Write(trailer, 0, trailer.Length); - } - - //Write Header - byte[] certsize = Tools.FileLengthToByteArray(cert.Length); - byte[] tiksize = Tools.FileLengthToByteArray(tik.Length); - byte[] tmdsize = Tools.FileLengthToByteArray(tmd.Length); - byte[] allcontsize = Tools.FileLengthToByteArray(allcont); - byte[] trailersize = Tools.FileLengthToByteArray(trailerlength); - - wadstream.Seek(0x00, SeekOrigin.Begin); - wadstream.Write(wadheader, 0, wadheader.Length); - wadstream.Seek(0x08, SeekOrigin.Begin); - wadstream.Write(certsize, 0, certsize.Length); - wadstream.Seek(0x10, SeekOrigin.Begin); - wadstream.Write(tiksize, 0, tiksize.Length); - wadstream.Seek(0x14, SeekOrigin.Begin); - wadstream.Write(tmdsize, 0, tmdsize.Length); - wadstream.Seek(0x18, SeekOrigin.Begin); - wadstream.Write(allcontsize, 0, allcontsize.Length); - wadstream.Seek(0x1c, SeekOrigin.Begin); - wadstream.Write(trailersize, 0, trailersize.Length); - - wadstream.Close(); - } - - /// - /// Packs a Wad from a title installed on Nand - /// Returns: 0 = OK, 1 = Files missing, 2 = Shared contents missing, 3 = Cert missing - /// - /// - /// XXXXXXXX\XXXXXXXX - /// - /// - public static void PackWadFromNand(string nandpath, string path, string destinationfile) - { - if (nandpath[nandpath.Length - 1] != '\\') { nandpath = nandpath + "\\"; } - string path1 = path.Remove(8); - string path2 = path.Remove(0, 9); - string ticketdir = nandpath + "ticket\\" + path1 + "\\"; - string contentdir = nandpath + "title\\" + path1 + "\\" + path2 + "\\content\\"; - string sharedir = nandpath + "shared1\\"; - string certdir = nandpath + "sys\\"; - - if (!Directory.Exists(ticketdir) || - !Directory.Exists(contentdir)) throw new DirectoryNotFoundException("Directory doesn't exist:\r\n" + contentdir); - if (!Directory.Exists(sharedir)) throw new DirectoryNotFoundException("Directory doesn't exist:\r\n" + sharedir); - if (!File.Exists(certdir + "cert.sys")) throw new FileNotFoundException("File doesn't exist:\r\n" + certdir + "cert.sys"); - - byte[] cert = Tools.LoadFileToByteArray(certdir + "cert.sys"); - byte[] tik = Tools.LoadFileToByteArray(ticketdir + path2 + ".tik"); - byte[] tmd = Tools.LoadFileToByteArray(contentdir + "title.tmd"); - - string[,] contents = WadInfo.GetContentInfo(tmd); - - FileStream wadstream = new FileStream(destinationfile, FileMode.Create); - - //Trucha-Sign Tik and Tmd, if they aren't already - WadEdit.TruchaSign(tik, 0); - WadEdit.TruchaSign(tmd, 1); - - //Write Cert - wadstream.Seek(64, SeekOrigin.Begin); - wadstream.Write(cert, 0, cert.Length); - - //Write Tik - wadstream.Seek(64 + Tools.AddPadding(cert.Length), SeekOrigin.Begin); - wadstream.Write(tik, 0, tik.Length); - - //Write Tmd - wadstream.Seek(64 + Tools.AddPadding(cert.Length) + Tools.AddPadding(tik.Length), SeekOrigin.Begin); - wadstream.Write(tmd, 0, tmd.Length); - - //Write Content - int allcont = 0; - int contpos = 64 + Tools.AddPadding(cert.Length) + Tools.AddPadding(tik.Length) + Tools.AddPadding(tmd.Length); - int contcount = WadInfo.GetContentNum(tmd); - - Tools.ChangeProgress(0); - byte[] titlekey = WadInfo.GetTitleKey(tik); - byte[] contentmap = Tools.LoadFileToByteArray(sharedir + "content.map"); - - for (int i = 0; i < contents.GetLength(0); i++) - { - Tools.ChangeProgress((i + 1) * 100 / contents.GetLength(0)); - byte[] thiscont = new byte[1]; - - if (contents[i, 2] == "8001") - { - string contname = ContentMap.GetSharedContentName(contentmap, contents[i, 4]); - - if (contname == "fail") - { - wadstream.Close(); - File.Delete(destinationfile); - throw new FileNotFoundException("At least one shared content is missing!"); - } - - thiscont = Tools.LoadFileToByteArray(sharedir + contname + ".app"); - } - else thiscont = Tools.LoadFileToByteArray(contentdir + contents[i, 0] + ".app"); - - //if (i == contents.GetLength(0) - 1) { thiscont = WadEdit.EncryptContent(thiscont, tmd, i, titlekey, false); } - //else { thiscont = WadEdit.EncryptContent(thiscont, tmd, i, titlekey, true); } - thiscont = WadEdit.EncryptContent(thiscont, tmd, i, titlekey, true); - - wadstream.Seek(contpos, SeekOrigin.Begin); - wadstream.Write(thiscont, 0, thiscont.Length); - contpos += thiscont.Length; - allcont += thiscont.Length; - } - - //Write Header - byte[] certsize = Tools.FileLengthToByteArray(cert.Length); - byte[] tiksize = Tools.FileLengthToByteArray(tik.Length); - byte[] tmdsize = Tools.FileLengthToByteArray(tmd.Length); - byte[] allcontsize = Tools.FileLengthToByteArray(allcont); - byte[] trailersize = new byte[] { 0x00, 0x00, 0x00, 0x00 }; - - wadstream.Seek(0x00, SeekOrigin.Begin); - wadstream.Write(wadheader, 0, wadheader.Length); - wadstream.Seek(0x08, SeekOrigin.Begin); - wadstream.Write(certsize, 0, certsize.Length); - wadstream.Seek(0x10, SeekOrigin.Begin); - wadstream.Write(tiksize, 0, tiksize.Length); - wadstream.Seek(0x14, SeekOrigin.Begin); - wadstream.Write(tmdsize, 0, tmdsize.Length); - wadstream.Seek(0x18, SeekOrigin.Begin); - wadstream.Write(allcontsize, 0, allcontsize.Length); - wadstream.Seek(0x1c, SeekOrigin.Begin); - wadstream.Write(trailersize, 0, trailersize.Length); - - wadstream.Close(); - } - } - - public class UID - { - /// - /// Checks if the given Title ID exists in the uid.sys - /// - /// - /// - /// - public static bool CheckUID(byte[] uidsys, string fulltitleid) - { - for (int i = 0; i < uidsys.Length; i += 12) - { - string temp = ""; - - for (int y = i; y < i + 8; y++) - temp += uidsys[y].ToString("x2"); - - if (temp == fulltitleid) return true; - } - - return false; - } - - /// - /// Gets a new UID - /// - /// - /// - public static string GetNewUID(byte[] uidsys) - { - string lastuid = uidsys[uidsys.Length - 4].ToString("x2") + - uidsys[uidsys.Length - 3].ToString("x2") + - uidsys[uidsys.Length - 2].ToString("x2") + - uidsys[uidsys.Length - 1].ToString("x2"); - - string newuid = (int.Parse(lastuid, System.Globalization.NumberStyles.HexNumber) + 1).ToString("x8"); - return newuid; - } - - /// - /// Adds a Title ID to uid.sys - /// - /// - /// - /// - public static byte[] AddUID(byte[] uidsys, string fulltitleid) - { - if (uidsys.Length > 11) - { - MemoryStream uid = new MemoryStream(); - byte[] titleid = Tools.HexStringToByteArray(fulltitleid); - byte[] newuid = Tools.HexStringToByteArray(GetNewUID(uidsys)); - - uid.Write(uidsys, 0, uidsys.Length); - uid.Write(titleid, 0, titleid.Length); - uid.Write(newuid, 0, newuid.Length); - - return uid.ToArray(); - } - else - { - MemoryStream uid = new MemoryStream(); - byte[] titleid = Tools.HexStringToByteArray(fulltitleid); - byte[] newuid = new byte[] { 0x00, 0x00, 0x10, 0x00 }; - - uid.Write(titleid, 0, titleid.Length); - uid.Write(newuid, 0, newuid.Length); - - return uid.ToArray(); - } - } - } - - public class ContentMap - { - /// - /// Gets the name of the shared content in /shared1/. - /// Returns "fail", if the content doesn't exist - /// - /// - /// - /// - public static string GetSharedContentName(byte[] contentmap, string sha1ofcontent) - { - int contindex = 0; - string result = ""; - - for (int i = 0; i < contentmap.Length - 19; i++) - { - string tmp = ""; - for (int y = 0; y < 20; y++) - { - tmp += contentmap[i + y].ToString("x2"); - } - - if (tmp == sha1ofcontent) - { - contindex = i; - break; - } - } - - if (contindex == 0) return "fail"; - - result += Convert.ToChar(contentmap[contindex - 8]); - result += Convert.ToChar(contentmap[contindex - 7]); - result += Convert.ToChar(contentmap[contindex - 6]); - result += Convert.ToChar(contentmap[contindex - 5]); - result += Convert.ToChar(contentmap[contindex - 4]); - result += Convert.ToChar(contentmap[contindex - 3]); - result += Convert.ToChar(contentmap[contindex - 2]); - result += Convert.ToChar(contentmap[contindex - 1]); - - return result; - } - - /// - /// Checks, if the shared content exists - /// - /// - /// - /// - public static bool CheckSharedContent(byte[] contentmap, string sha1ofcontent) - { - for (int i = 0; i < contentmap.Length - 19; i++) - { - string tmp = ""; - for (int y = 0; y < 20; y++) - { - tmp += contentmap[i + y].ToString("x2"); - } - - if (tmp == sha1ofcontent) return true; - } - - return false; - } - - public static string GetNewSharedContentName(byte[] contentmap) - { - string name = ""; - - name += Convert.ToChar(contentmap[contentmap.Length - 28]); - name += Convert.ToChar(contentmap[contentmap.Length - 27]); - name += Convert.ToChar(contentmap[contentmap.Length - 26]); - name += Convert.ToChar(contentmap[contentmap.Length - 25]); - name += Convert.ToChar(contentmap[contentmap.Length - 24]); - name += Convert.ToChar(contentmap[contentmap.Length - 23]); - name += Convert.ToChar(contentmap[contentmap.Length - 22]); - name += Convert.ToChar(contentmap[contentmap.Length - 21]); - - string newname = (int.Parse(name, System.Globalization.NumberStyles.HexNumber) + 1).ToString("x8"); - - return newname; - } - - public static void AddSharedContent(string contentmap, string contentname, string sha1ofcontent) - { - byte[] name = new byte[8]; - byte[] sha1 = new byte[20]; - - for (int i = 0; i < 8; i++) - { - name[i] = (byte)contentname[i]; - } - - for (int i = 0; i < sha1ofcontent.Length; i += 2) - { - sha1[i / 2] = Convert.ToByte(sha1ofcontent.Substring(i, 2), 16); - } - - using (FileStream map = new FileStream(contentmap, FileMode.OpenOrCreate, FileAccess.ReadWrite)) - { - map.Seek(0, SeekOrigin.End); - map.Write(name, 0, name.Length); - map.Write(sha1, 0, sha1.Length); - } - } - } - - public class U8 - { - /// - /// Checks if the given file is a U8 Archive - /// - /// - /// - public static bool CheckU8(byte[] file) - { - int length = 2500; - if (file.Length < length) length = file.Length - 4; - - for (int i = 0; i < length; i++) - { - if (file[i] == 0x55 && file[i + 1] == 0xAA && file[i + 2] == 0x38 && file[i + 3] == 0x2D) - return true; - } - - return false; - } - - /// - /// Checks if the given file is a U8 Archive - /// - /// - /// - public static bool CheckU8(string file) - { - byte[] buff = Tools.LoadFileToByteArray(file, 0, 2500); - return CheckU8(buff); - } - - /// - /// Gets all contents of a folder (including (sub-)files and (sub-)folders) - /// - /// - /// - /// - public static string[] GetDirContent(string dir, bool root) - { - string[] files = Directory.GetFiles(dir); - string[] dirs = Directory.GetDirectories(dir); - string all = ""; - - if (root == false) - all += dir + "\n"; - - for (int i = 0; i < files.Length; i++) - all += files[i] + "\n"; - - foreach (string thisDir in dirs) - { - string[] temp = GetDirContent(thisDir, false); - - foreach (string thisTemp in temp) - all += thisTemp + "\n"; - } - - return all.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); - } - - /// - /// Detecs if the U8 file has an IMD5 or IMET Header. - /// Return: 0 = No Header, 1 = IMD5, 2 = IMET - /// - /// - public static int DetectHeader(string file) - { - byte[] temp = Tools.LoadFileToByteArray(file, 0, 400); - return DetectHeader(temp); - } - - /// - /// Detecs if the U8 file has an IMD5 or IMET Header. - /// Return: 0 = No Header, 1 = IMD5, 2 = IMET - /// - /// - public static int DetectHeader(byte[] file) - { - for (int i = 0; i < 16; i++) //Just to be safe - { - if (Convert.ToChar(file[i]) == 'I') - if (Convert.ToChar(file[i + 1]) == 'M') - if (Convert.ToChar(file[i + 2]) == 'D') - if (Convert.ToChar(file[i + 3]) == '5') - return 1; - } - - int length = 400; - if (file.Length < 400) length = file.Length - 4; - - for (int z = 0; z < length; z++) - { - if (Convert.ToChar(file[z]) == 'I') - if (Convert.ToChar(file[z + 1]) == 'M') - if (Convert.ToChar(file[z + 2]) == 'E') - if (Convert.ToChar(file[z + 3]) == 'T') - return 2; - } - - return 0; - } - - /// - /// Adds an IMD5 Header to the given U8 Archive - /// - /// - /// - public static byte[] AddHeaderIMD5(byte[] u8archive) - { - MemoryStream ms = new MemoryStream(); - MD5 md5 = MD5.Create(); - - byte[] imd5 = new byte[4]; - imd5[0] = (byte)'I'; - imd5[1] = (byte)'M'; - imd5[2] = (byte)'D'; - imd5[3] = (byte)'5'; - - byte[] size = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(u8archive.Length)); - byte[] hash = md5.ComputeHash(u8archive, 0, u8archive.Length); - - ms.Seek(0, SeekOrigin.Begin); - ms.Write(imd5, 0, imd5.Length); - ms.Write(size, 0, size.Length); - - ms.Seek(0x10, SeekOrigin.Begin); - ms.Write(hash, 0, hash.Length); - - ms.Write(u8archive, 0, u8archive.Length); - - md5.Clear(); - return ms.ToArray(); - } - - /// - /// Adds an IMET Header to the given 00.app - /// - /// - /// Order: Jap, Eng, Ger, Fra, Spa, Ita, Dut - /// Order: Banner.bin, Icon.bin, Sound.bin - /// - public static byte[] AddHeaderIMET(byte[] nullapp, string[] channeltitles, int[] sizes) - { - if (channeltitles.Length < 7) return nullapp; - for (int i = 0; i < channeltitles.Length; i++) - if (channeltitles[i].Length > 20) return nullapp; - - MemoryStream ms = new MemoryStream(); - MD5 md5 = MD5.Create(); - - byte[] imet = new byte[4]; - imet[0] = (byte)'I'; - imet[1] = (byte)'M'; - imet[2] = (byte)'E'; - imet[3] = (byte)'T'; - - byte[] unknown = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(0x0000060000000003)); - - byte[] iconsize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(sizes[1])); - byte[] bannersize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(sizes[0])); - byte[] soundsize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(sizes[2])); - - byte[] japtitle = new byte[84]; - byte[] engtitle = new byte[84]; - byte[] gertitle = new byte[84]; - byte[] fratitle = new byte[84]; - byte[] spatitle = new byte[84]; - byte[] itatitle = new byte[84]; - byte[] duttitle = new byte[84]; - - for (int i = 0; i < 20; i++) - { - if (channeltitles[0].Length > i) - { - japtitle[i * 2 + 1] = (byte)channeltitles[0][i]; - } - if (channeltitles[1].Length > i) - { - engtitle[i * 2 + 1] = (byte)channeltitles[1][i]; - } - if (channeltitles[2].Length > i) - { - gertitle[i * 2 + 1] = (byte)channeltitles[2][i]; - } - if (channeltitles[3].Length > i) - { - fratitle[i * 2 + 1] = (byte)channeltitles[3][i]; - } - if (channeltitles[4].Length > i) - { - spatitle[i * 2 + 1] = (byte)channeltitles[4][i]; - } - if (channeltitles[5].Length > i) - { - itatitle[i * 2 + 1] = (byte)channeltitles[5][i]; - } - if (channeltitles[6].Length > i) - { - duttitle[i * 2 + 1] = (byte)channeltitles[6][i]; - } - } - - byte[] crypto = new byte[16]; - - ms.Seek(128, SeekOrigin.Begin); - ms.Write(imet, 0, imet.Length); - ms.Write(unknown, 0, unknown.Length); - ms.Write(iconsize, 0, iconsize.Length); - ms.Write(bannersize, 0, bannersize.Length); - ms.Write(soundsize, 0, soundsize.Length); - - ms.Seek(4, SeekOrigin.Current); - ms.Write(japtitle, 0, japtitle.Length); - ms.Write(engtitle, 0, engtitle.Length); - ms.Write(gertitle, 0, gertitle.Length); - ms.Write(fratitle, 0, fratitle.Length); - ms.Write(spatitle, 0, spatitle.Length); - ms.Write(itatitle, 0, itatitle.Length); - ms.Write(duttitle, 0, duttitle.Length); - - ms.Seek(0x348, SeekOrigin.Current); - ms.Write(crypto, 0, crypto.Length); - - byte[] tohash = ms.ToArray(); - crypto = md5.ComputeHash(tohash, 0x40, 0x600); - - ms.Seek(-16, SeekOrigin.Current); - ms.Write(crypto, 0, crypto.Length); - ms.Write(nullapp, 0, nullapp.Length); - - md5.Clear(); - return ms.ToArray(); - } - - /// - /// Packs a U8 Archive - /// - /// - /// - public static void PackU8(string folder, string outfile) - { - byte[] u8 = PackU8(folder); - - using (FileStream fs = new FileStream(outfile, FileMode.Create)) - fs.Write(u8, 0, u8.Length); - } - - /// - /// Packs a U8 Archive - /// - /// - /// - public static void PackU8(string folder, string outfile, bool addimd5header) - { - byte[] u8 = PackU8(folder); - - if (addimd5header == true) - u8 = AddHeaderIMD5(u8); - - using (FileStream fs = new FileStream(outfile, FileMode.Create)) - fs.Write(u8, 0, u8.Length); - } - - /// - /// Packs a U8 Archive - /// - /// - /// - public static byte[] PackU8(string folder) - { - int a = 0, b = 0, c = 0; - return PackU8(folder, out a, out b, out c); - } - - /// - /// Packs a U8 Archive - /// - /// - /// - public static byte[] PackU8(string folder, bool addimd5header) - { - byte[] u8 = PackU8(folder); - - if (addimd5header == true) - u8 = AddHeaderIMD5(u8); - - return u8; - } - - /// - /// Packs a U8 Archive - /// - /// - /// - public static byte[] PackU8(string folder, out int bannersize, out int iconsize, out int soundsize) - { - int datapad = 32, stringtablepad = 32; //Biggie seems to use these paddings, so let's do it, too ;) - string rootpath = folder; - if (rootpath[rootpath.Length - 1] != '\\') rootpath = rootpath + "\\"; - - bannersize = 0; iconsize = 0; soundsize = 0; - - string[] files = GetDirContent(folder, true); - int nodecount = files.Length + 1; //All files and dirs + rootnode - int recursion = 0; - int currentnodes = 0; - string name = string.Empty; - string stringtable = "\0"; - byte[] tempnode = new byte[12]; - - MemoryStream nodes = new MemoryStream(); - MemoryStream data = new MemoryStream(); - BinaryWriter writedata = new BinaryWriter(data); - - tempnode[0] = 0x01; - tempnode[1] = 0x00; - tempnode[2] = 0x00; - tempnode[3] = 0x00; - tempnode[4] = 0x00; - tempnode[5] = 0x00; - tempnode[6] = 0x00; - tempnode[7] = 0x00; - - byte[] temp = BitConverter.GetBytes((UInt32)files.Length + 1); Array.Reverse(temp); - tempnode[8] = temp[0]; - tempnode[9] = temp[1]; - tempnode[10] = temp[2]; - tempnode[11] = temp[3]; - - nodes.Write(tempnode, 0, tempnode.Length); - - for (int i = 0; i < files.Length; i++) - { - files[i] = files[i].Remove(0, rootpath.Length - 1); - - recursion = Tools.CountCharsInString(files[i], '\\') - 1; - name = files[i].Remove(0, files[i].LastIndexOf('\\') + 1); - - byte[] temp1 = BitConverter.GetBytes((UInt16)stringtable.Length); Array.Reverse(temp1); - tempnode[2] = temp1[0]; - tempnode[3] = temp1[1]; - - stringtable += name + "\0"; - - if (Directory.Exists(rootpath + files[i])) //It's a dir - { - tempnode[0] = 0x01; - tempnode[1] = 0x00; - - byte[] temp2 = BitConverter.GetBytes((UInt32)recursion); Array.Reverse(temp2); - tempnode[4] = temp2[0]; - tempnode[5] = temp2[1]; - tempnode[6] = temp2[2]; - tempnode[7] = temp2[3]; - - int size = currentnodes + 1; - - for (int j = i; j < files.Length; j++) - if (files[j].Contains(files[i])) size++; - - byte[] temp3 = BitConverter.GetBytes((UInt32)size); Array.Reverse(temp3); - tempnode[8] = temp3[0]; - tempnode[9] = temp3[1]; - tempnode[10] = temp3[2]; - tempnode[11] = temp3[3]; - } - else //It's a file - { - byte[] tempfile = new byte[0x40]; - int lzoffset = -1; - - if (files[i].EndsWith("banner.bin")) - { - tempfile = Wii.Tools.LoadFileToByteArray(rootpath + files[i], 0, tempfile.Length); - - for (int x = 0; x < tempfile.Length; x++) - { - if (tempfile[x] == 'L') - if (tempfile[x + 1] == 'Z') - if (tempfile[x + 2] == '7') - if (tempfile[x + 3] == '7') - { - lzoffset = x; - break; - } - } - - if (lzoffset != -1) - { - bannersize = BitConverter.ToInt32(new byte[] { tempfile[lzoffset + 5], tempfile[lzoffset + 6], tempfile[lzoffset + 7], tempfile[lzoffset + 8] }, 0); - } - else - { - FileInfo fibanner = new FileInfo(rootpath + files[i]); - bannersize = (int)fibanner.Length - 32; - } - } - else if (files[i].EndsWith("icon.bin")) - {tempfile = Wii.Tools.LoadFileToByteArray(rootpath + files[i], 0, tempfile.Length); - - for (int x = 0; x < tempfile.Length; x++) - { - if (tempfile[x] == 'L') - if (tempfile[x + 1] == 'Z') - if (tempfile[x + 2] == '7') - if (tempfile[x + 3] == '7') - { - lzoffset = x; - } - } - - if (lzoffset != -1) - { - iconsize = BitConverter.ToInt32(new byte[] { tempfile[lzoffset + 5], tempfile[lzoffset + 6], tempfile[lzoffset + 7], tempfile[lzoffset + 8] }, 0); - } - else - { - FileInfo fiicon = new FileInfo(rootpath + files[i]); - iconsize = (int)fiicon.Length - 32; - } - } - else if (files[i].EndsWith("sound.bin")) - {tempfile = Wii.Tools.LoadFileToByteArray(rootpath + files[i], 0, tempfile.Length); - - for (int x = 0; x < tempfile.Length; x++) - { - if (tempfile[x] == 'L') - if (tempfile[x + 1] == 'Z') - if (tempfile[x + 2] == '7') - if (tempfile[x + 3] == '7') - { - lzoffset = x; - break; - } - } - - if (lzoffset != -1) - { - soundsize = BitConverter.ToInt32(new byte[] { tempfile[lzoffset + 5], tempfile[lzoffset + 6], tempfile[lzoffset + 7], tempfile[lzoffset + 8] }, 0); - } - else - { - FileInfo fisound = new FileInfo(rootpath + files[i]); - soundsize = (int)fisound.Length - 32; - } - } - - tempnode[0] = 0x00; - tempnode[1] = 0x00; - - byte[] temp2 = BitConverter.GetBytes((UInt32)data.Position); Array.Reverse(temp2); - tempnode[4] = temp2[0]; - tempnode[5] = temp2[1]; - tempnode[6] = temp2[2]; - tempnode[7] = temp2[3]; - - FileInfo fi = new FileInfo(rootpath + files[i]); - byte[] temp3 = BitConverter.GetBytes((UInt32)fi.Length); Array.Reverse(temp3); - tempnode[8] = temp3[0]; - tempnode[9] = temp3[1]; - tempnode[10] = temp3[2]; - tempnode[11] = temp3[3]; - - using (FileStream fs = new FileStream(rootpath + files[i], FileMode.Open)) - using (BinaryReader br = new BinaryReader(fs)) - writedata.Write(br.ReadBytes((int)br.BaseStream.Length)); - - writedata.Seek(Tools.AddPadding((int)data.Position, datapad), SeekOrigin.Begin); - } - - nodes.Write(tempnode, 0, tempnode.Length); - currentnodes++; - } - - byte[] type = new byte[2]; - byte[] curpos = new byte[4]; - - for (int x = 0; x < nodecount * 12; x += 12) - { - nodes.Seek(x, SeekOrigin.Begin); - nodes.Read(type, 0, 2); - - if (type[0] == 0x00 && type[1] == 0x00) - { - nodes.Seek(x + 4, SeekOrigin.Begin); - nodes.Read(curpos, 0, 4); - Array.Reverse(curpos); - - UInt32 newpos = BitConverter.ToUInt32(curpos, 0) + (UInt32)(Tools.AddPadding(0x20 + ((12 * nodecount) + stringtable.Length), stringtablepad)); - - nodes.Seek(x + 4, SeekOrigin.Begin); - byte[] temp2 = BitConverter.GetBytes(newpos); Array.Reverse(temp2); - nodes.Write(temp2, 0, 4); - } - } - - writedata.Close(); - MemoryStream output = new MemoryStream(); - BinaryWriter writeout = new BinaryWriter(output); - - writeout.Write((UInt32)0x2d38aa55); - writeout.Write(IPAddress.HostToNetworkOrder((ushort)0x20)); - writeout.Write(IPAddress.HostToNetworkOrder((ushort)((12 * nodecount) + stringtable.Length))); - writeout.Write(IPAddress.HostToNetworkOrder((ushort)(Tools.AddPadding(0x20 + ((12 * nodecount) + stringtable.Length), stringtablepad)))); - - writeout.Seek(0x10, SeekOrigin.Current); - - writeout.Write(nodes.ToArray()); - writeout.Write(ASCIIEncoding.ASCII.GetBytes(stringtable)); - - writeout.Seek(Tools.AddPadding(0x20 + ((12 * nodecount) + stringtable.Length), stringtablepad), SeekOrigin.Begin); - - writeout.Write(data.ToArray()); - - output.Seek(0, SeekOrigin.End); - for (int i = (int)output.Position; i < Tools.AddPadding((int)output.Position, datapad); i++) - output.WriteByte(0); - - writeout.Close(); - output.Close(); - - return output.ToArray(); - } - - /// - /// Unpacks the given U8 archive - /// If the archive is Lz77 compressed, it will be decompressed first! - /// - /// - /// - public static void UnpackU8(string u8archive, string unpackpath) - { - byte[] u8 = Wii.Tools.LoadFileToByteArray(u8archive); - UnpackU8(u8, unpackpath); - } - - /// - /// Unpacks the given U8 archive - /// If the archive is Lz77 compressed, it will be decompressed first! - /// - /// - /// - public static void UnpackU8(byte[] u8archive, string unpackpath) - { - int lz77offset = Lz77.GetLz77Offset(u8archive); - if (lz77offset != -1) { u8archive = Lz77.Decompress(u8archive, lz77offset); } - - if (unpackpath[unpackpath.Length - 1] != '\\') { unpackpath = unpackpath + "\\"; } - if (!Directory.Exists(unpackpath)) Directory.CreateDirectory(unpackpath); - - int u8offset = -1; - int length = 2500; - if (u8archive.Length < length) length = u8archive.Length - 4; - - for (int i = 0; i < length; i++) - { - if (u8archive[i] == 0x55 && u8archive[i + 1] == 0xAA && u8archive[i + 2] == 0x38 && u8archive[i + 3] == 0x2D) - { - u8offset = i; - break; - } - } - - if (u8offset == -1) throw new Exception("File is not a valid U8 Archive!"); - - int nodecount = Tools.HexStringToInt(u8archive[u8offset + 0x28].ToString("x2") + u8archive[u8offset + 0x29].ToString("x2") + u8archive[u8offset + 0x2a].ToString("x2") + u8archive[u8offset + 0x2b].ToString("x2")); - int nodeoffset = 0x20; - - string[,] nodes = new string[nodecount, 5]; - - for (int j = 0; j < nodecount; j++) - { - nodes[j, 0] = u8archive[u8offset + nodeoffset].ToString("x2") + u8archive[u8offset + nodeoffset + 1].ToString("x2"); - nodes[j, 1] = u8archive[u8offset + nodeoffset + 2].ToString("x2") + u8archive[u8offset + nodeoffset + 3].ToString("x2"); - nodes[j, 2] = u8archive[u8offset + nodeoffset + 4].ToString("x2") + u8archive[u8offset + nodeoffset + 5].ToString("x2") + u8archive[u8offset + nodeoffset + 6].ToString("x2") + u8archive[u8offset + nodeoffset + 7].ToString("x2"); - nodes[j, 3] = u8archive[u8offset + nodeoffset + 8].ToString("x2") + u8archive[u8offset + nodeoffset + 9].ToString("x2") + u8archive[u8offset + nodeoffset + 10].ToString("x2") + u8archive[u8offset + nodeoffset + 11].ToString("x2"); - - nodeoffset += 12; - } - - int stringtablepos = u8offset + nodeoffset; - - for (int x = 0; x < nodecount; x++) - { - bool end = false; - int nameoffset = Tools.HexStringToInt(nodes[x, 1]); - string thisname = ""; - - do - { - if (u8archive[stringtablepos + nameoffset] != 0x00) - { - char tempchar = Convert.ToChar(u8archive[stringtablepos + nameoffset]); - thisname += tempchar.ToString(); - nameoffset++; - } - else end = true; - } while (end == false); - - nodes[x, 4] = thisname; - } - - string[] dirs = new string[nodecount]; - dirs[0] = unpackpath; - int[] dircount = new int[nodecount]; - int dirindex = 0; - - try - { - for (int y = 1; y < nodecount; y++) - { - switch (nodes[y, 0]) - { - case "0100": - if (dirs[dirindex][dirs[dirindex].Length - 1] != '\\') { dirs[dirindex] = dirs[dirindex] + "\\"; } - Directory.CreateDirectory(dirs[dirindex] + nodes[y, 4]); - dirs[dirindex + 1] = dirs[dirindex] + nodes[y, 4]; - dirindex++; - dircount[dirindex] = Tools.HexStringToInt(nodes[y, 3]); - break; - default: - int filepos = u8offset + Tools.HexStringToInt(nodes[y, 2]); - int filesize = Tools.HexStringToInt(nodes[y, 3]); - - using (FileStream fs = new FileStream(dirs[dirindex] + "\\" + nodes[y, 4], FileMode.Create)) - { - fs.Write(u8archive, filepos, filesize); - } - break; - } - - while (dirindex > 0 && dircount[dirindex] == (y + 1)) - { - dirindex--; - } - } - } - catch { } - } - - /// - /// Gets the Banner.bin out of the 00000000.app - /// - /// - /// - public static byte[] GetBannerBin(byte[] nullapp) - { - int lz77offset = Lz77.GetLz77Offset(nullapp); - if (lz77offset != -1) { nullapp = Lz77.Decompress(nullapp, lz77offset); } - - int u8offset = -1; - for (int i = 0; i < 2500; i++) - { - if (nullapp[i] == 0x55 && nullapp[i + 1] == 0xAA && nullapp[i + 2] == 0x38 && nullapp[i + 3] == 0x2D) - { - u8offset = i; - break; - } - } - - if (u8offset == -1) throw new Exception("File is not a valid U8 Archive!"); - - int nodecount = Tools.HexStringToInt(nullapp[u8offset + 0x28].ToString("x2") + nullapp[u8offset + 0x29].ToString("x2") + nullapp[u8offset + 0x2a].ToString("x2") + nullapp[u8offset + 0x2b].ToString("x2")); - int nodeoffset = 0x20; - - string[,] nodes = new string[nodecount, 5]; - - for (int j = 0; j < nodecount; j++) - { - nodes[j, 0] = nullapp[u8offset + nodeoffset].ToString("x2") + nullapp[u8offset + nodeoffset + 1].ToString("x2"); - nodes[j, 1] = nullapp[u8offset + nodeoffset + 2].ToString("x2") + nullapp[u8offset + nodeoffset + 3].ToString("x2"); - nodes[j, 2] = nullapp[u8offset + nodeoffset + 4].ToString("x2") + nullapp[u8offset + nodeoffset + 5].ToString("x2") + nullapp[u8offset + nodeoffset + 6].ToString("x2") + nullapp[u8offset + nodeoffset + 7].ToString("x2"); - nodes[j, 3] = nullapp[u8offset + nodeoffset + 8].ToString("x2") + nullapp[u8offset + nodeoffset + 9].ToString("x2") + nullapp[u8offset + nodeoffset + 10].ToString("x2") + nullapp[u8offset + nodeoffset + 11].ToString("x2"); - - nodeoffset += 12; - } - - int stringtablepos = u8offset + nodeoffset; - - for (int x = 0; x < nodecount; x++) - { - bool end = false; - int nameoffset = Tools.HexStringToInt(nodes[x, 1]); - string thisname = ""; - - while (end == false) - { - if (nullapp[stringtablepos + nameoffset] != 0x00) - { - char tempchar = Convert.ToChar(nullapp[stringtablepos + nameoffset]); - thisname += tempchar.ToString(); - nameoffset++; - } - else end = true; - } - - nodes[x, 4] = thisname; - } - - for (int y = 1; y < nodecount; y++) - { - if (nodes[y, 4] == "banner.bin") - { - int filepos = u8offset + Tools.HexStringToInt(nodes[y, 2]); - int filesize = Tools.HexStringToInt(nodes[y, 3]); - - MemoryStream ms = new MemoryStream(nullapp); - byte[] banner = new byte[filesize]; - ms.Seek(filepos, SeekOrigin.Begin); - ms.Read(banner, 0, filesize); - ms.Close(); - - return banner; - } - } - - throw new Exception("This file doesn't contain banner.bin!"); - } - - /// - /// Gets the Icon.bin out of the 00000000.app - /// - /// - /// - public static byte[] GetIconBin(byte[] nullapp) - { - int lz77offset = Lz77.GetLz77Offset(nullapp); - if (lz77offset != -1) { nullapp = Lz77.Decompress(nullapp, lz77offset); } - - int u8offset = -1; - for (int i = 0; i < 2500; i++) - { - if (nullapp[i] == 0x55 && nullapp[i + 1] == 0xAA && nullapp[i + 2] == 0x38 && nullapp[i + 3] == 0x2D) - { - u8offset = i; - break; - } - } - - if (u8offset == -1) throw new Exception("File is not a valid U8 Archive!"); - - int nodecount = Tools.HexStringToInt(nullapp[u8offset + 0x28].ToString("x2") + nullapp[u8offset + 0x29].ToString("x2") + nullapp[u8offset + 0x2a].ToString("x2") + nullapp[u8offset + 0x2b].ToString("x2")); - int nodeoffset = 0x20; - - string[,] nodes = new string[nodecount, 5]; - - for (int j = 0; j < nodecount; j++) - { - nodes[j, 0] = nullapp[u8offset + nodeoffset].ToString("x2") + nullapp[u8offset + nodeoffset + 1].ToString("x2"); - nodes[j, 1] = nullapp[u8offset + nodeoffset + 2].ToString("x2") + nullapp[u8offset + nodeoffset + 3].ToString("x2"); - nodes[j, 2] = nullapp[u8offset + nodeoffset + 4].ToString("x2") + nullapp[u8offset + nodeoffset + 5].ToString("x2") + nullapp[u8offset + nodeoffset + 6].ToString("x2") + nullapp[u8offset + nodeoffset + 7].ToString("x2"); - nodes[j, 3] = nullapp[u8offset + nodeoffset + 8].ToString("x2") + nullapp[u8offset + nodeoffset + 9].ToString("x2") + nullapp[u8offset + nodeoffset + 10].ToString("x2") + nullapp[u8offset + nodeoffset + 11].ToString("x2"); - - nodeoffset += 12; - } - - int stringtablepos = u8offset + nodeoffset; - - for (int x = 0; x < nodecount; x++) - { - bool end = false; - int nameoffset = Tools.HexStringToInt(nodes[x, 1]); - string thisname = ""; - - while (end == false) - { - if (nullapp[stringtablepos + nameoffset] != 0x00) - { - char tempchar = Convert.ToChar(nullapp[stringtablepos + nameoffset]); - thisname += tempchar.ToString(); - nameoffset++; - } - else end = true; - } - - nodes[x, 4] = thisname; - } - - for (int y = 1; y < nodecount; y++) - { - if (nodes[y, 4] == "icon.bin") - { - int filepos = u8offset + Tools.HexStringToInt(nodes[y, 2]); - int filesize = Tools.HexStringToInt(nodes[y, 3]); - - MemoryStream ms = new MemoryStream(nullapp); - byte[] icon = new byte[filesize]; - ms.Seek(filepos, SeekOrigin.Begin); - ms.Read(icon, 0, filesize); - ms.Close(); - - return icon; - } - } - - throw new Exception("This file doesn't contain icon.bin!"); - } - - /// - /// Extracts all Tpl's to the given path - /// - /// - /// - public static void UnpackTpls(byte[] u8archive, string unpackpath) - { - int lz77offset = Lz77.GetLz77Offset(u8archive); - if (lz77offset != -1) { u8archive = Lz77.Decompress(u8archive, lz77offset); } - - if (unpackpath[unpackpath.Length - 1] != '\\') { unpackpath = unpackpath + "\\"; } - if (!Directory.Exists(unpackpath)) Directory.CreateDirectory(unpackpath); - - int u8offset = -1; - int length = 2500; - if (u8archive.Length < 2500) length = u8archive.Length - 4; - - for (int i = 0; i < 2500; i++) - { - if (u8archive[i] == 0x55 && u8archive[i + 1] == 0xAA && u8archive[i + 2] == 0x38 && u8archive[i + 3] == 0x2D) - { - u8offset = i; - break; - } - } - - if (u8offset == -1) throw new Exception("File is not a valid U8 Archive!"); - - int nodecount = Tools.HexStringToInt(u8archive[u8offset + 0x28].ToString("x2") + u8archive[u8offset + 0x29].ToString("x2") + u8archive[u8offset + 0x2a].ToString("x2") + u8archive[u8offset + 0x2b].ToString("x2")); - int nodeoffset = 0x20; - - string[,] nodes = new string[nodecount, 5]; - - for (int j = 0; j < nodecount; j++) - { - nodes[j, 0] = u8archive[u8offset + nodeoffset].ToString("x2") + u8archive[u8offset + nodeoffset + 1].ToString("x2"); - nodes[j, 1] = u8archive[u8offset + nodeoffset + 2].ToString("x2") + u8archive[u8offset + nodeoffset + 3].ToString("x2"); - nodes[j, 2] = u8archive[u8offset + nodeoffset + 4].ToString("x2") + u8archive[u8offset + nodeoffset + 5].ToString("x2") + u8archive[u8offset + nodeoffset + 6].ToString("x2") + u8archive[u8offset + nodeoffset + 7].ToString("x2"); - nodes[j, 3] = u8archive[u8offset + nodeoffset + 8].ToString("x2") + u8archive[u8offset + nodeoffset + 9].ToString("x2") + u8archive[u8offset + nodeoffset + 10].ToString("x2") + u8archive[u8offset + nodeoffset + 11].ToString("x2"); - - nodeoffset += 12; - } - - int stringtablepos = u8offset + nodeoffset; - - for (int x = 0; x < nodecount; x++) - { - bool end = false; - int nameoffset = Tools.HexStringToInt(nodes[x, 1]); - string thisname = ""; - - while (end == false) - { - if (u8archive[stringtablepos + nameoffset] != 0x00) - { - char tempchar = Convert.ToChar(u8archive[stringtablepos + nameoffset]); - thisname += tempchar.ToString(); - nameoffset++; - } - else end = true; - } - - nodes[x, 4] = thisname; - } - - for (int y = 1; y < nodecount; y++) - { - if (nodes[y, 4].Contains(".")) - { - if (nodes[y, 4].Remove(0, nodes[y, 4].LastIndexOf('.')) == ".tpl") - { - int filepos = u8offset + Tools.HexStringToInt(nodes[y, 2]); - int filesize = Tools.HexStringToInt(nodes[y, 3]); - - using (FileStream fs = new FileStream(unpackpath + nodes[y, 4], FileMode.Create)) - { - fs.Write(u8archive, filepos, filesize); - } - } - } - } - } - } - - public class Lz77 - { - private const int N = 4096; - private const int F = 18; - private const int threshold = 2; - private static int[] lson = new int[N + 1]; - private static int[] rson = new int[N + 257]; - private static int[] dad = new int[N + 1]; - private static ushort[] text_buf = new ushort[N + 17]; - private static int match_position = 0, match_length = 0; - private static int textsize = 0; - private static int codesize = 0; - - /// - /// Returns the Offset to the Lz77 Header - /// -1 will be returned, if the file is not Lz77 compressed - /// - /// - /// - public static int GetLz77Offset(byte[] data) - { - int length = 5000; - if (data.Length < 5000) length = data.Length - 4; - - for (int i = 0; i < length; i++) - { - if (data[i] == 0x55 && data[i + 1] == 0xAA && data[i + 2] == 0x38 && data[i + 3] == 0x2D) - { - break; - } - - UInt32 tmp = BitConverter.ToUInt32(data, i); - if (tmp == 0x37375a4c) return i; - } - - return -1; - } - - /// - /// Decompresses the given file - /// - /// - /// - public static void Decompress(string infile, string outfile) - { - byte[] input = Tools.LoadFileToByteArray(infile); - int offset = GetLz77Offset(input); - if (offset == -1) throw new Exception("File is not Lz77 compressed!"); - Tools.SaveFileFromByteArray(Decompress(input, offset), outfile); - } - - /// - /// Decompresses the given data - /// - /// - /// - /// - public static byte[] Decompress(byte[] compressed, int offset) - { - int i, j, k, r, c, z; - uint flags; - UInt32 decomp_size; - UInt32 cur_size = 0; - - MemoryStream infile = new MemoryStream(compressed); - MemoryStream outfile = new MemoryStream(); - - UInt32 gbaheader = new UInt32(); - byte[] temp = new byte[4]; - infile.Seek(offset + 4, SeekOrigin.Begin); - infile.Read(temp, 0, 4); - gbaheader = BitConverter.ToUInt32(temp, 0); - - decomp_size = gbaheader >> 8; - byte[] text_buf = new byte[N + 17]; - - for (i = 0; i < N - F; i++) text_buf[i] = 0xdf; - r = N - F; flags = 7; z = 7; - - while (true) - { - flags <<= 1; - z++; - if (z == 8) - { - if ((c = (char)infile.ReadByte()) == -1) break; - flags = (uint)c; - z = 0; - } - if ((flags & 0x80) == 0) - { - if ((c = infile.ReadByte()) == infile.Length - 1) break; - if (cur_size < decomp_size) outfile.WriteByte((byte)c); - text_buf[r++] = (byte)c; - r &= (N - 1); - cur_size++; - } - else - { - if ((i = infile.ReadByte()) == -1) break; - if ((j = infile.ReadByte()) == -1) break; - j = j | ((i << 8) & 0xf00); - i = ((i >> 4) & 0x0f) + threshold; - for (k = 0; k <= i; k++) - { - c = text_buf[(r - j - 1) & (N - 1)]; - if (cur_size < decomp_size) outfile.WriteByte((byte)c); text_buf[r++] = (byte)c; r &= (N - 1); cur_size++; - } - } - } - - return outfile.ToArray(); - } - - public static void InitTree() - { - int i; - for (i = N + 1; i <= N + 256; i++) rson[i] = N; - for (i = 0; i < N; i++) dad[i] = N; - } - - public static void InsertNode(int r) - { - int i, p, cmp; - cmp = 1; - p = N + 1 + (text_buf[r] == 0xffff ? 0 : text_buf[r]); //text_buf[r]; - rson[r] = lson[r] = N; match_length = 0; - for (; ; ) - { - if (cmp >= 0) - { - if (rson[p] != N) p = rson[p]; - else { rson[p] = r; dad[r] = p; return; } - } - else - { - if (lson[p] != N) p = lson[p]; - else { lson[p] = r; dad[r] = p; return; } - } - for (i = 1; i < F; i++) - if ((cmp = text_buf[r + i] - text_buf[p + i]) != 0) break; - if (i > match_length) - { - match_position = p; - if ((match_length = i) >= F) break; - } - } - dad[r] = dad[p]; lson[r] = lson[p]; rson[r] = rson[p]; - dad[lson[p]] = r; dad[rson[p]] = r; - if (rson[dad[p]] == p) rson[dad[p]] = r; - else lson[dad[p]] = r; - dad[p] = N; - } - - public static void DeleteNode(int p) - { - int q; - - if (dad[p] == N) return; /* not in tree */ - if (rson[p] == N) q = lson[p]; - else if (lson[p] == N) q = rson[p]; - else - { - q = lson[p]; - if (rson[q] != N) - { - do { q = rson[q]; } while (rson[q] != N); - rson[dad[q]] = lson[q]; dad[lson[q]] = dad[q]; - lson[q] = lson[p]; dad[lson[p]] = q; - } - rson[q] = rson[p]; dad[rson[p]] = q; - } - dad[q] = dad[p]; - if (rson[dad[p]] == p) rson[dad[p]] = q; else lson[dad[p]] = q; - dad[p] = N; - } - - /// - /// Lz77 compresses the given File - /// - /// - /// - public static void Compress(string infile, string outfile) - { - byte[] thisfile = Tools.LoadFileToByteArray(infile); - thisfile = Compress(thisfile); - Tools.SaveFileFromByteArray(thisfile, outfile); - } - - /// - /// Lz77 compresses the given and saves it to the given Path - /// - /// - /// - public static void Compress(byte[] file, string outfile) - { - byte[] temp = Compress(file); - Tools.SaveFileFromByteArray(temp, outfile); - } - - /// - /// Lz77 compresses the given Byte Array - /// - /// - /// - public static byte[] Compress(byte[] file) - { - int i, c, len, r, s, last_match_length, code_buf_ptr; - int[] code_buf = new int[17]; - int mask; - UInt32 filesize = ((Convert.ToUInt32(file.Length)) << 8) + 0x10; - byte[] filesizebytes = BitConverter.GetBytes(filesize); - - MemoryStream output = new MemoryStream(); - output.WriteByte((byte)'L'); output.WriteByte((byte)'Z'); output.WriteByte((byte)'7'); output.WriteByte((byte)'7'); - MemoryStream infile = new MemoryStream(file); - - output.Write(filesizebytes, 0, filesizebytes.Length); - - InitTree(); - code_buf[0] = 0; - code_buf_ptr = 1; - mask = 0x80; - s = 0; - r = N - F; - - for (i = s; i < r; i++) text_buf[i] = 0xffff; - for (len = 0; len < F && (c = (int)infile.ReadByte()) != -1; len++) - text_buf[r + len] = (ushort)c; - - if ((textsize = len) == 0) return file; - - for (i = 1; i <= F; i++) InsertNode(r - i); - - InsertNode(r); - - do - { - if (match_length > len) match_length = len; - - if (match_length <= threshold) - { - match_length = 1; - code_buf[code_buf_ptr++] = text_buf[r]; - } - else - { - code_buf[0] |= mask; - - code_buf[code_buf_ptr++] = (char) - (((r - match_position - 1) >> 8) & 0x0f) | - ((match_length - (threshold + 1)) << 4); - - code_buf[code_buf_ptr++] = (char)((r - match_position - 1) & 0xff); - } - if ((mask >>= 1) == 0) - { - for (i = 0; i < code_buf_ptr; i++) - output.WriteByte((byte)code_buf[i]); - codesize += code_buf_ptr; - code_buf[0] = 0; code_buf_ptr = 1; - mask = 0x80; - } - - last_match_length = match_length; - for (i = 0; i < last_match_length && - (c = (int)infile.ReadByte()) != -1; i++) - { - DeleteNode(s); - text_buf[s] = (ushort)c; - if (s < F - 1) text_buf[s + N] = (ushort)c; - s = (s + 1) & (N - 1); r = (r + 1) & (N - 1); - InsertNode(r); - } - - while (i++ < last_match_length) - { - DeleteNode(s); - s = (s + 1) & (N - 1); r = (r + 1) & (N - 1); - if (--len != 0) InsertNode(r); - } - } while (len > 0); - - - if (code_buf_ptr > 1) - { - for (i = 0; i < code_buf_ptr; i++) output.WriteByte((byte)code_buf[i]); - codesize += code_buf_ptr; - } - - if (codesize % 4 != 0) - for (i = 0; i < 4 - (codesize % 4); i++) - output.WriteByte(0x00); - - infile.Close(); - return output.ToArray(); - } - } - - public class TPL - { - /// - /// Converts a Tpl to a Bitmap - /// - /// - /// - public static Bitmap ConvertFromTPL(string tpl) - { - byte[] tplarray = Wii.Tools.LoadFileToByteArray(tpl); - return ConvertFromTPL(tplarray); - } - - /// - /// Converts a Tpl to a Bitmap - /// - /// - /// - public static Bitmap ConvertFromTPL(byte[] tpl) - { - if (GetTextureCount(tpl) > 1) throw new Exception("Tpl's containing more than one Texture are not supported!"); - - int width = GetTextureWidth(tpl); - int height = GetTextureHeight(tpl); - int format = GetTextureFormat(tpl); - if (format == -1) throw new Exception("The Texture has an unsupported format!"); - - switch (format) - { - case 0: - byte[] temp0 = FromI4(tpl); - return ConvertPixelToBitmap(temp0, width, height); - case 1: - byte[] temp1 = FromI8(tpl); - return ConvertPixelToBitmap(temp1, width, height); - case 2: - byte[] temp2 = FromIA4(tpl); - return ConvertPixelToBitmap(temp2, width, height); - case 3: - byte[] temp3 = FromIA8(tpl); - return ConvertPixelToBitmap(temp3, width, height); - case 4: - byte[] temp4 = FromRGB565(tpl); - return ConvertPixelToBitmap(temp4, width, height); - case 5: - byte[] temp5 = FromRGB5A3(tpl); - return ConvertPixelToBitmap(temp5, width, height); - case 6: - byte[] temp6 = FromRGBA8(tpl); - return ConvertPixelToBitmap(temp6, width, height); - case 14: - byte[] temp14 = FromCMP(tpl); - return ConvertPixelToBitmap(temp14, width, height); - default: - throw new Exception("The Texture has an unsupported format!"); - } - } - - /// - /// Converts the Pixel Data into a Png Image - /// - /// Byte array with pixel data - public static System.Drawing.Bitmap ConvertPixelToBitmap(byte[] data, int width, int height) - { - if (width == 0) width = 1; - if (height == 0) height = 1; - - System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits( - new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), - System.Drawing.Imaging.ImageLockMode.WriteOnly, bmp.PixelFormat); - - System.Runtime.InteropServices.Marshal.Copy(data, 0, bmpData.Scan0, data.Length); - bmp.UnlockBits(bmpData); - return bmp; - } - - /// - /// Gets the Number of Textures in a Tpl - /// - /// - /// - public static int GetTextureCount(byte[] tpl) - { - byte[] tmp = new byte[4]; - tmp[3] = tpl[4]; - tmp[2] = tpl[5]; - tmp[1] = tpl[6]; - tmp[0] = tpl[7]; - UInt32 count = BitConverter.ToUInt32(tmp, 0); - return (int)count; - } - - /// - /// Gets the Format of the Texture in the Tpl - /// - /// - /// - public static int GetTextureFormat(string tpl) - { - byte[] temp = Tools.LoadFileToByteArray(tpl, 0, 50); - return GetTextureFormat(temp); - } - - /// - /// Gets the Format of the Texture in the Tpl - /// - /// - /// - public static int GetTextureFormat(byte[] tpl) - { - byte[] tmp = new byte[4]; - tmp[3] = tpl[24]; - tmp[2] = tpl[25]; - tmp[1] = tpl[26]; - tmp[0] = tpl[27]; - UInt32 format = BitConverter.ToUInt32(tmp, 0); - - if (format == 0 || - format == 1 || - format == 2 || - format == 3 || - format == 4 || - format == 5 || - format == 6 || - format == 14) return (int)format; - - else return -1; //Unsupported Format - } - - /// - /// Gets the Format Name of the Texture in the Tpl - /// - /// - /// - public static string GetTextureFormatName(byte[] tpl) - { - switch (GetTextureFormat(tpl)) - { - case 0: - return "I4"; - case 1: - return "I8"; - case 2: - return "IA4"; - case 3: - return "IA8"; - case 4: - return "RGB565"; - case 5: - return "RGB5A3"; - case 6: - return "RGBA8"; - case 14: - return "CMP"; - default: - return "Unknown"; - } - } - - public static int avg(int w0, int w1, int c0, int c1) - { - int a0 = c0 >> 11; - int a1 = c1 >> 11; - int a = (w0 * a0 + w1 * a1) / (w0 + w1); - int c = (a << 11) & 0xffff; - - a0 = (c0 >> 5) & 63; - a1 = (c1 >> 5) & 63; - a = (w0 * a0 + w1 * a1) / (w0 + w1); - c = c | ((a << 5) & 0xffff); - - a0 = c0 & 31; - a1 = c1 & 31; - a = (w0 * a0 + w1 * a1) / (w0 + w1); - c = c | a; - - return c; - } - - /// - /// Gets the Width of the Texture in the Tpl - /// - /// - /// - public static int GetTextureWidth(byte[] tpl) - { - byte[] tmp = new byte[2]; - tmp[1] = tpl[22]; - tmp[0] = tpl[23]; - UInt16 width = BitConverter.ToUInt16(tmp, 0); - return (int)width; - } - - /// - /// Gets the Height of the Texture in the Tpl - /// - /// - /// - public static int GetTextureHeight(byte[] tpl) - { - byte[] tmp = new byte[2]; - tmp[1] = tpl[20]; - tmp[0] = tpl[21]; - UInt16 height = BitConverter.ToUInt16(tmp, 0); - return (int)height; - } - - /// - /// Gets the offset to the Texturedata in the Tpl - /// - /// - /// - public static int GetTextureOffset(byte[] tpl) - { - byte[] tmp = new byte[4]; - tmp[3] = tpl[28]; - tmp[2] = tpl[29]; - tmp[1] = tpl[30]; - tmp[0] = tpl[31]; - UInt32 offset = BitConverter.ToUInt32(tmp, 0); - return (int)offset; - } - - /// - /// Converts RGBA8 Tpl Array to RGBA Byte Array - /// - /// - /// - public static byte[] FromRGBA8(byte[] tpl) - { - int width = GetTextureWidth(tpl); - int height = GetTextureHeight(tpl); - int offset = GetTextureOffset(tpl); - UInt32[] output = new UInt32[width * height]; - int inp = 0; - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 4) - { - for (int k = 0; k < 2; k++) - { - for (int y1 = y; y1 < y + 4; y1++) - { - for (int x1 = x; x1 < x + 4; x1++) - { - byte[] pixelbytes = new byte[2]; - pixelbytes[1] = tpl[offset + inp * 2]; - pixelbytes[0] = tpl[offset + inp * 2 + 1]; - UInt16 pixel = BitConverter.ToUInt16(pixelbytes, 0); - inp++; - - if ((x1 >= width) || (y1 >= height)) - continue; - - if (k == 0) - { - int a = (pixel >> 8) & 0xff; - int r = (pixel >> 0) & 0xff; - output[x1 + (y1 * width)] |= (UInt32)((r << 16) | (a << 24)); - } - else - { - int g = (pixel >> 8) & 0xff; - int b = (pixel >> 0) & 0xff; - output[x1 + (y1 * width)] |= (UInt32)((g << 8) | (b << 0)); - } - } - } - } - } - } - - return Tools.UInt32ArrayToByteArray(output); - } - - /// - /// Converts RGB5A3 Tpl Array to RGBA Byte Array - /// - /// - /// - public static byte[] FromRGB5A3(byte[] tpl) - { - int width = GetTextureWidth(tpl); - int height = GetTextureHeight(tpl); - int offset = GetTextureOffset(tpl); - UInt32[] output = new UInt32[width * height]; - int inp = 0; - int r, g, b; - int a = 0; - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 4) - { - for (int y1 = y; y1 < y + 4; y1++) - { - for (int x1 = x; x1 < x + 4; x1++) - { - byte[] pixelbytes = new byte[2]; - pixelbytes[1] = tpl[offset + inp * 2]; - pixelbytes[0] = tpl[offset + inp * 2 + 1]; - UInt16 pixel = BitConverter.ToUInt16(pixelbytes, 0); - inp++; - - if (y1 >= height || x1 >= width) - continue; - - if ((pixel & (1 << 15)) != 0) - { - b = (((pixel >> 10) & 0x1F) * 255) / 31; - g = (((pixel >> 5) & 0x1F) * 255) / 31; - r = (((pixel >> 0) & 0x1F) * 255) / 31; - a = 255; - } - else - { - a = (((pixel >> 12) & 0x07) * 255) / 7; - b = (((pixel >> 8) & 0x0F) * 255) / 15; - g = (((pixel >> 4) & 0x0F) * 255) / 15; - r = (((pixel >> 0) & 0x0F) * 255) / 15; - } - - int rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24); - output[(y1 * width) + x1] = (UInt32)rgba; - } - } - } - } - - return Tools.UInt32ArrayToByteArray(output); - } - - /// - /// Converts RGB565 Tpl Array to RGBA Byte Array - /// - /// - /// - public static byte[] FromRGB565(byte[] tpl) - { - int width = GetTextureWidth(tpl); - int height = GetTextureHeight(tpl); - int offset = GetTextureOffset(tpl); - UInt32[] output = new UInt32[width * height]; - int inp = 0; - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 4) - { - for (int y1 = y; y1 < y + 4; y1++) - { - for (int x1 = x; x1 < x + 4; x1++) - { - byte[] pixelbytes = new byte[2]; - pixelbytes[1] = tpl[offset + inp * 2]; - pixelbytes[0] = tpl[offset + inp * 2 + 1]; - UInt16 pixel = BitConverter.ToUInt16(pixelbytes, 0); - inp++; - - if (y1 >= height || x1 >= width) - continue; - - int b = (((pixel >> 11) & 0x1F) << 3) & 0xff; - int g = (((pixel >> 5) & 0x3F) << 2) & 0xff; - int r = (((pixel >> 0) & 0x1F) << 3) & 0xff; - int a = 255; - - int rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24); - output[y1 * width + x1] = (UInt32)rgba; - } - } - } - } - - return Tools.UInt32ArrayToByteArray(output); - } - - /// - /// Converts I4 Tpl Array to RGBA Byte Array - /// - /// - /// - public static byte[] FromI4(byte[] tpl) - { - int width = GetTextureWidth(tpl); - int height = GetTextureHeight(tpl); - int offset = GetTextureOffset(tpl); - UInt32[] output = new UInt32[width * height]; - int inp = 0; - for (int y = 0; y < height; y += 8) - { - for (int x = 0; x < width; x += 8) - { - for (int y1 = y; y1 < y + 8; y1++) - { - for (int x1 = x; x1 < x + 8; x1 += 2) - { - int pixel = tpl[offset + inp]; - - if (y1 >= height || x1 >= width) - continue; - - int r = (pixel >> 4) * 255 / 15; - int g = (pixel >> 4) * 255 / 15; - int b = (pixel >> 4) * 255 / 15; - int a = (pixel >> 4) * 255 / 15; - - int rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24); - output[y1 * width + x1] = (UInt32)rgba; - - pixel = tpl[offset + inp]; - inp++; - - if (y1 >= height || x1 >= width) - continue; - - r = (pixel & 0x0F) * 255 / 15; - g = (pixel & 0x0F) * 255 / 15; - b = (pixel & 0x0F) * 255 / 15; - a = (pixel & 0x0F) * 255 / 15; - - rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24); - output[y1 * width + x1 + 1] = (UInt32)rgba; - } - } - } - } - - return Tools.UInt32ArrayToByteArray(output); - } - - /// - /// Converts IA4 Tpl Array to RGBA Byte Array - /// - /// - /// - public static byte[] FromIA4(byte[] tpl) - { - int width = GetTextureWidth(tpl); - int height = GetTextureHeight(tpl); - int offset = GetTextureOffset(tpl); - UInt32[] output = new UInt32[width * height]; - int inp = 0; - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 8) - { - for (int y1 = y; y1 < y + 4; y1++) - { - for (int x1 = x; x1 < x + 8; x1++) - { - int pixel = tpl[offset + inp]; - inp++; - - if (y1 >= height || x1 >= width) - continue; - - int r = ((pixel & 0x0F) * 255 / 15) & 0xff; - int g = ((pixel & 0x0F) * 255 / 15) & 0xff; - int b = ((pixel & 0x0F) * 255 / 15) & 0xff; - int a = (((pixel >> 4) * 255) / 15) & 0xff; - - int rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24); - output[y1 * width + x1] = (UInt32)rgba; - } - } - } - } - - return Tools.UInt32ArrayToByteArray(output); - } - - /// - /// Converts I8 Tpl Array to RGBA Byte Array - /// - /// - /// - public static byte[] FromI8(byte[] tpl) - { - int width = GetTextureWidth(tpl); - int height = GetTextureHeight(tpl); - int offset = GetTextureOffset(tpl); - UInt32[] output = new UInt32[width * height]; - int inp = 0; - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 8) - { - for (int y1 = y; y1 < y + 4; y1++) - { - for (int x1 = x; x1 < x + 8; x1++) - { - int pixel = tpl[offset + inp]; - inp++; - - if (y1 >= height || x1 >= width) - continue; - - int r = pixel; - int g = pixel; - int b = pixel; - int a = 255; - - int rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24); - output[y1 * width + x1] = (UInt32)rgba; - } - } - } - } - - return Tools.UInt32ArrayToByteArray(output); - } - - /// - /// Converts IA8 Tpl Array to RGBA Byte Array - /// - /// - /// - public static byte[] FromIA8(byte[] tpl) - { - int width = GetTextureWidth(tpl); - int height = GetTextureHeight(tpl); - int offset = GetTextureOffset(tpl); - UInt32[] output = new UInt32[width * height]; - int inp = 0; - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 4) - { - for (int y1 = y; y1 < y + 4; y1++) - { - for (int x1 = x; x1 < x + 4; x1++) - { - byte[] pixelbytes = new byte[2]; - pixelbytes[1] = tpl[offset + inp * 2]; - pixelbytes[0] = tpl[offset + inp * 2 + 1]; - UInt16 pixel = BitConverter.ToUInt16(pixelbytes, 0); - inp++; - - if (y1 >= height || x1 >= width) - continue; - - int r = (pixel >> 8);// &0xff; - int g = (pixel >> 8);// &0xff; - int b = (pixel >> 8);// &0xff; - int a = (pixel >> 8) & 0xff; - - int rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24); - output[y1 * width + x1] = (UInt32)rgba; - } - } - } - } - - return Tools.UInt32ArrayToByteArray(output); - } - - /// - /// Converts CMP Tpl Array to RGBA Byte Array - /// - /// - /// - public static byte[] FromCMP(byte[] tpl) - { - int width = GetTextureWidth(tpl); - int height = GetTextureHeight(tpl); - int offset = GetTextureOffset(tpl); - UInt32[] output = new UInt32[width * height]; - UInt16[] c = new UInt16[4]; - int[] pix = new int[3]; - int inp = 0; - - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - int ww = Tools.AddPadding(width, 8); - - int x0 = x & 0x03; - int x1 = (x >> 2) & 0x01; - int x2 = x >> 3; - - int y0 = y & 0x03; - int y1 = (y >> 2) & 0x01; - int y2 = y >> 3; - - int off = (8 * x1) + (16 * y1) + (32 * x2) + (4 * ww * y2); - - byte[] tmp1 = new byte[2]; - tmp1[1] = tpl[offset + off]; - tmp1[0] = tpl[offset + off + 1]; - c[0] = BitConverter.ToUInt16(tmp1, 0); - tmp1[1] = tpl[offset + off + 2]; - tmp1[0] = tpl[offset + off + 3]; - c[1] = BitConverter.ToUInt16(tmp1, 0); - - if (c[0] > c[1]) - { - c[2] = (UInt16)avg(2, 1, c[0], c[1]); - c[3] = (UInt16)avg(1, 2, c[0], c[1]); - } - else - { - c[2] = (UInt16)avg(1, 1, c[0], c[1]); - c[3] = 0; - } - - byte[] pixeldata = new byte[4]; - pixeldata[3] = tpl[offset + off + 4]; - pixeldata[2] = tpl[offset + off + 5]; - pixeldata[1] = tpl[offset + off + 6]; - pixeldata[0] = tpl[offset + off + 7]; - UInt32 pixel = BitConverter.ToUInt32(pixeldata, 0); - - int ix = x0 + (4 * y0); - int raw = c[(pixel >> (30 - (2 * ix))) & 0x03]; - - pix[0] = (raw >> 8) & 0xf8; - pix[1] = (raw >> 3) & 0xf8; - pix[2] = (raw << 3) & 0xf8; - - int intout = (pix[0] << 16) | (pix[1] << 8) | (pix[2] << 0) | (255 << 24); - output[inp] = (UInt32)intout; - inp++; - } - } - - return Tools.UInt32ArrayToByteArray(output); - } - - /// - /// Gets the pixel data of a Bitmap as an Byte Array - /// - /// - /// - public static uint[] BitmapToRGBA(Bitmap img) - { - int x = img.Width; - int y = img.Height; - UInt32[] rgba = new UInt32[x * y]; - - for (int i = 0; i < y; i += 4) - { - for (int j = 0; j < x; j += 4) - { - for (int y1 = i; y1 < i + 4; y1++) - { - for (int x1 = j; x1 < j + 4; x1++) - { - if (y1 >= y || x1 >= x) - continue; - - Color color = img.GetPixel(x1, y1); - rgba[x1 + (y1 * x)] = (UInt32)color.ToArgb(); - } - } - } - } - - return rgba; - } - - /// - /// Converts an Image to a Tpl - /// - /// - /// 4 = RGB565, 5 = RGB5A3, 6 = RGBA8 - /// - public static void ConvertToTPL(Bitmap img, string destination, int format) - { - byte[] tpl = ConvertToTPL(img, format); - - using (FileStream fs = new FileStream(destination, FileMode.Create)) - { - fs.Write(tpl, 0, tpl.Length); - } - } - - /// - /// Converts an Image to a Tpl - /// - /// - /// 4 = RGB565, 5 = RGB5A3, 6 = RGBA8 - /// - public static void ConvertToTPL(Image img, string destination, int format) - { - byte[] tpl = ConvertToTPL((Bitmap)img, format); - - using (FileStream fs = new FileStream(destination, FileMode.Create)) - { - fs.Write(tpl, 0, tpl.Length); - } - } - - /// - /// Converts an Image to a Tpl - /// - /// - /// 4 = RGB565, 5 = RGB5A3, 6 = RGBA8 - /// - public static byte[] ConvertToTPL(Image img, int format) - { - return ConvertToTPL((Bitmap)img, format); - } - - /// - /// Converts an Image to a Tpl - /// - /// - /// 4 = RGB565, 5 = RGB5A3, 6 = RGBA8 - /// - public static byte[] ConvertToTPL(Bitmap img, int format) - { - using (MemoryStream ms = new MemoryStream()) - { - byte[] rgbaData; - - UInt32 tplmagic = 0x20af30; - UInt32 ntextures = 0x1; - UInt32 headersize = 0xc; - UInt32 texheaderoff = 0x14; - UInt32 texpaletteoff = 0x0; - - UInt16 texheight = (UInt16)img.Height; - UInt16 texwidth = (UInt16)img.Width; - UInt32 texformat; - UInt32 texdataoffset = 0x40; - byte[] rest = new byte[] { 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 00, 00, 00, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 }; - //This should do it for our needs.. rest includes padding - - switch (format) - { - case 4: //RGB565 - texformat = 0x4; - rgbaData = ToRGB565(img); - break; - case 5: //RGB5A3 - texformat = 0x5; - rgbaData = ToRGB5A3(img); - break; - default: //RGBA8 = 6 - texformat = 0x6; - rgbaData = ToRGBA8(img); - break; - } - - byte[] buffer = BitConverter.GetBytes(tplmagic); Array.Reverse(buffer); - ms.Seek(0, SeekOrigin.Begin); - ms.Write(buffer, 0, buffer.Length); - - buffer = BitConverter.GetBytes(ntextures); Array.Reverse(buffer); - ms.Write(buffer, 0, buffer.Length); - - buffer = BitConverter.GetBytes(headersize); Array.Reverse(buffer); - ms.Write(buffer, 0, buffer.Length); - - buffer = BitConverter.GetBytes(texheaderoff); Array.Reverse(buffer); - ms.Write(buffer, 0, buffer.Length); - - buffer = BitConverter.GetBytes(texpaletteoff); Array.Reverse(buffer); - ms.Write(buffer, 0, buffer.Length); - - buffer = BitConverter.GetBytes(texheight); Array.Reverse(buffer); - ms.Write(buffer, 0, buffer.Length); - - buffer = BitConverter.GetBytes(texwidth); Array.Reverse(buffer); - ms.Write(buffer, 0, buffer.Length); - - buffer = BitConverter.GetBytes(texformat); Array.Reverse(buffer); - ms.Write(buffer, 0, buffer.Length); - - buffer = BitConverter.GetBytes(texdataoffset); Array.Reverse(buffer); - ms.Write(buffer, 0, buffer.Length); - - ms.Write(rest, 0, rest.Length); - - ms.Write(rgbaData, 0, rgbaData.Length); - - return ms.ToArray(); - } - } - - /// - /// Converts an Image to RGBA8 Tpl data - /// - /// - /// - public static byte[] ToRGBA8(Bitmap img) - { - uint[] pixeldata = BitmapToRGBA(img); - int w = img.Width; - int h = img.Height; - int z = 0, iv = 0; - byte[] output = new byte[Tools.AddPadding(w, 4) * Tools.AddPadding(h, 4) * 4]; - uint[] lr = new uint[32], lg = new uint[32], lb = new uint[32], la = new uint[32]; - - for (int y1 = 0; y1 < h; y1 += 4) - { - for (int x1 = 0; x1 < w; x1 += 4) - { - for (int y = y1; y < (y1 + 4); y++) - { - for (int x = x1; x < (x1 + 4); x++) - { - UInt32 rgba; - - if (y >= h || x >= w) - { - rgba = 0; - } - else - { - rgba = pixeldata[x + (y * w)]; - } - - lr[z] = (uint)(rgba >> 16) & 0xff; - lg[z] = (uint)(rgba >> 8) & 0xff; - lb[z] = (uint)(rgba >> 0) & 0xff; - la[z] = (uint)(rgba >> 24) & 0xff; - - z++; - } - } - - if (z == 16) - { - for (int i = 0; i < 16; i++) - { - output[iv++] = (byte)(la[i]); - output[iv++] = (byte)(lr[i]); - } - for (int i = 0; i < 16; i++) - { - output[iv++] = (byte)(lg[i]); - output[iv++] = (byte)(lb[i]); - } - - z = 0; - } - } - } - - - return output; - } - - /// - /// Converts an Image to RGBA565 Tpl data - /// - /// - /// - public static byte[] ToRGB565(Bitmap img) - { - uint[] pixeldata = BitmapToRGBA(img); - int w = img.Width; - int h = img.Height; - int z = -1; - byte[] output = new byte[Tools.AddPadding(w, 4) * Tools.AddPadding(h, 4) * 2]; - - for (int y1 = 0; y1 < h; y1 += 4) - { - for (int x1 = 0; x1 < w; x1 += 4) - { - for (int y = y1; y < y1 + 4; y++) - { - for (int x = x1; x < x1 + 4; x++) - { - UInt16 newpixel; - - if (y >= h || x >= w) - { - newpixel = 0; - } - else - { - uint rgba = pixeldata[x + (y * w)]; - - uint b = (rgba >> 16) & 0xff; - uint g = (rgba >> 8) & 0xff; - uint r = (rgba >> 0) & 0xff; - - newpixel = (UInt16)(((b >> 3) << 11) | ((g >> 2) << 5) | ((r >> 3) << 0)); - } - - byte[] temp = BitConverter.GetBytes(newpixel); - Array.Reverse(temp); - - output[++z] = temp[0]; - output[++z] = temp[1]; - } - } - } - } - - return output; - } - - /// - /// Converts an Image to RGBA5A3 Tpl data - /// - /// - /// - public static byte[] ToRGB5A3(Bitmap img) - { - uint[] pixeldata = BitmapToRGBA(img); - int w = img.Width; - int h = img.Height; - int z = -1; - byte[] output = new byte[Tools.AddPadding(w, 4) * Tools.AddPadding(h, 4) * 2]; - - for (int y1 = 0; y1 < h; y1 += 4) - { - for (int x1 = 0; x1 < w; x1 += 4) - { - for (int y = y1; y < y1 + 4; y++) - { - for (int x = x1; x < x1 + 4; x++) - { - int newpixel; - - if (y >= h || x >= w) - { - newpixel = 0; - } - else - { - int rgba = (int)pixeldata[x + (y * w)]; - newpixel = 0; - - int r = (rgba >> 16) & 0xff; - int g = (rgba >> 8) & 0xff; - int b = (rgba >> 0) & 0xff; - int a = (rgba >> 24) & 0xff; - - if (a <= 0xda) - { - //RGB4A3 - - newpixel &= ~(1 << 15); - - r = ((r * 15) / 255) & 0xf; - g = ((g * 15) / 255) & 0xf; - b = ((b * 15) / 255) & 0xf; - a = ((a * 7) / 255) & 0x7; - - newpixel |= a << 12; - newpixel |= b << 0; - newpixel |= g << 4; - newpixel |= r << 8; - } - else - { - //RGB5 - - newpixel |= (1 << 15); - - r = ((r * 31) / 255) & 0x1f; - g = ((g * 31) / 255) & 0x1f; - b = ((b * 31) / 255) & 0x1f; - - newpixel |= b << 0; - newpixel |= g << 5; - newpixel |= r << 10; - } - } - - byte[] temp = BitConverter.GetBytes((UInt16)newpixel); - Array.Reverse(temp); - - output[++z] = temp[0]; - output[++z] = temp[1]; - } - } - } - } - - return output; - } - } - - public class NAND - { - /// - /// Backups all Saves from a NAND Backup - /// - /// - /// - public static void BackupSaves(string nandpath, string destinationpath) - { - string titlefolder = nandpath + "\\title"; - string[] lowerdirs = Directory.GetDirectories(titlefolder); - Tools.ChangeProgress(0); - - for (int i = 0; i < lowerdirs.Length; i++) - { - Tools.ChangeProgress((i + 1) * 100 / lowerdirs.Length); - string[] upperdirs = Directory.GetDirectories(lowerdirs[i]); - - for (int j = 0; j < upperdirs.Length; j++) - { - if (Directory.Exists(upperdirs[j] + "\\data")) - { - if (Directory.GetFiles(upperdirs[j] + "\\data").Length > 0 || - Directory.GetDirectories(upperdirs[j] + "\\data").Length > 0) - { - Tools.CopyDirectory(upperdirs[j] + "\\data", (upperdirs[j] + "\\data").Replace(nandpath, destinationpath).Replace("\\title", "")); - } - } - } - } - } - - /// - /// Restores all Saves for existing titles to a NAND Backup - /// - /// - /// - public static void RestoreSaves(string backuppath, string nandpath) - { - string titlefolder = nandpath + "\\title"; - string[] lowerdirs = Directory.GetDirectories(backuppath); - Tools.ChangeProgress(0); - - for (int i = 0; i < lowerdirs.Length; i++) - { - Tools.ChangeProgress((i + 1) * 100 / lowerdirs.Length); - string[] upperdirs = Directory.GetDirectories(lowerdirs[i]); - - for (int j = 0; j < upperdirs.Length; j++) - { - string[] datafiles = Directory.GetFiles(upperdirs[j] + "\\data"); - string upperdirnand = upperdirs[j].Replace(backuppath, titlefolder); - - if (Directory.Exists(upperdirnand) && - (Directory.GetFiles(upperdirs[j] + "\\data").Length > 0 || - Directory.GetDirectories(upperdirs[j] + "\\data").Length > 0)) - { - if (!Directory.Exists(upperdirnand + "\\data")) Directory.CreateDirectory(upperdirnand + "\\data"); - Tools.CopyDirectory(upperdirs[j] + "\\data", (upperdirs[j] + "\\data").Replace(backuppath, titlefolder)); - } - } - } - - Tools.ChangeProgress(100); - } - - /// - /// Backups a single Save - /// - /// - /// Format: XXXXXXXX\XXXXXXXX - /// - public static void BackupSingleSave(string nandpath, string titlepath, string destinationpath) - { - string datafolder = nandpath + "\\title\\" + titlepath + "\\data"; - - if (Directory.GetFiles(datafolder).Length > 0 || - Directory.GetDirectories(datafolder).Length > 0) - { - string savefolder = datafolder.Replace(nandpath, destinationpath).Replace("\\title", ""); - if (!Directory.Exists(savefolder)) Directory.CreateDirectory(savefolder); - - Tools.CopyDirectory(datafolder, savefolder); - } - else - { - throw new Exception("No save data was found!"); - } - } - - /// - /// Restores a singe Save, if the title exists on NAND Backup - /// - /// - /// Format: XXXXXXXX\XXXXXXXX - /// - public static void RestoreSingleSave(string backuppath, string titlepath, string nandpath) - { - string titlefoldernand = nandpath + "\\title\\" + titlepath; - string titlefolder = titlefoldernand.Replace(nandpath, backuppath).Replace("\\title", ""); - - if (Directory.Exists(titlefoldernand) && - (Directory.GetFiles(titlefolder + "\\data").Length > 0 || - Directory.GetDirectories(titlefolder + "\\data").Length > 0)) - { - if (!Directory.Exists(titlefoldernand + "\\data")) Directory.CreateDirectory(titlefoldernand + "\\data"); - Tools.CopyDirectory(titlefolder + "\\data", titlefoldernand + "\\data"); - } - else - { - throw new Exception("Title not found in NAND Backup!"); - } - } - - /// - /// Checks, if save data exists in the given title folder - /// - /// - /// Format: XXXXXXXX\XXXXXXXX - public static bool CheckForSaveData(string nandpath, string titlepath) - { - string datafolder = nandpath + "\\title\\" + titlepath + "\\data"; - - if (!Directory.Exists(datafolder)) return false; - else - { - string[] datafiles = Directory.GetFiles(datafolder); - - if (datafiles.Length > 0) return true; - else return false; - } - } - - /// - /// Checks, if save data exists in the given title folder - /// - /// - /// Format: XXXXXXXX\XXXXXXXX - public static bool CheckForBackupData(string backuppath, string titlepath) - { - string datafolder = backuppath + "\\" + titlepath + "\\data"; - - if (!Directory.Exists(datafolder)) return false; - else - { - string[] datafiles = Directory.GetFiles(datafolder); - - if (datafiles.Length > 0) return true; - else return false; - } - } - } - - public class Sound - { - /// - /// Checks if the given Wave is a proper PCM WAV file - /// - /// - /// - public static bool CheckWave(string wavefile) - { - byte[] wave = Tools.LoadFileToByteArray(wavefile, 0, 256); - return CheckWave(wave); - } - - /// - /// Checks if the given Wave is a proper PCM WAV file - /// - /// - /// - public static bool CheckWave(byte[] wavefile) - { - if (wavefile[0] != 'R' || - wavefile[1] != 'I' || - wavefile[2] != 'F' || - wavefile[3] != 'F' || - - wavefile[8] != 'W' || - wavefile[9] != 'A' || - wavefile[10] != 'V' || - wavefile[11] != 'E' || - - wavefile[12] != 'f' || - wavefile[13] != 'm' || - wavefile[14] != 't' || - - wavefile[20] != 0x01 || //Format = PCM - wavefile[21] != 0x00 || - - wavefile[34] != 0x10 || //Bitrate (16bit) - wavefile[35] != 0x00 - ) return false; - - return true; - } - - /// - /// Returns the playlength of the Wave file in seconds - /// - /// - /// - public static int GetWaveLength(string wavefile) - { - byte[] wave = Tools.LoadFileToByteArray(wavefile, 0, 256); - return GetWaveLength(wave); - } - - /// - /// Returns the playlength of the Wave file in seconds - /// - /// - /// - public static int GetWaveLength(byte[] wavefile) - { - if (CheckWave(wavefile) == true) - { - byte[] BytesPerSec = new byte[] { wavefile[28], wavefile[29], wavefile[30], wavefile[31] }; - int bps = BitConverter.ToInt32(BytesPerSec, 0); - - byte[] Chunksize = new byte[] { wavefile[4], wavefile[5], wavefile[6], wavefile[7] }; - int chunks = BitConverter.ToInt32(Chunksize, 0); - - return Math.Abs(chunks / bps); - } - else - throw new Exception("This is not a supported PCM Wave file!"); - } - - /// - /// Converts a wave file to a sound.bin - /// - /// - /// - public static void WaveToSoundBin(string wavefile, string soundbin, bool compress) - { - if (CheckWave(wavefile) == true) - { - byte[] sound = Tools.LoadFileToByteArray(wavefile); - if (compress == true) sound = Lz77.Compress(sound); - sound = U8.AddHeaderIMD5(sound); - Wii.Tools.SaveFileFromByteArray(sound, soundbin); - } - else - throw new Exception("This is not a supported 16bit PCM Wave file!"); - } - - /// - /// Converts a sound.bin to a wave file - /// - /// - /// - public static void SoundBinToWave(string soundbin, string wavefile) - { - MemoryStream ms = new MemoryStream(Tools.LoadFileToByteArray(soundbin)); - byte[] wave = new byte[ms.Length - 32]; - int offset = 0; - - ms.Seek(32, SeekOrigin.Begin); - ms.Read(wave, 0, wave.Length); - - if ((offset = Lz77.GetLz77Offset(wave)) != -1) - wave = Lz77.Decompress(wave, offset); - - Tools.SaveFileFromByteArray(wave, wavefile); - } - } - - public class Brlyt - { - /// - /// Checks, if the TPLs match the TPLs specified in the brlyt - /// - /// - /// - /// - public static bool CheckBrlytTpls(string brlyt, string[] tpls) - { - byte[] brlytArray = Tools.LoadFileToByteArray(brlyt); - return CheckBrlytTpls(brlytArray, tpls); - } - - /// - /// Checks, if the TPLs match the TPLs specified in the brlyt - /// - /// - /// - /// - public static bool CheckBrlytTpls(byte[] brlyt, string[] tpls) - { - int texcount = Tools.HexStringToInt(brlyt[44].ToString("x2") + brlyt[45].ToString("x2")); - if (tpls.Length != texcount) return false; - - int texnamepos = 48 + (texcount * 8); - for (int i = 0; i < texcount; i++) - { - string thisTex = ""; - while (brlyt[texnamepos] != 0x00) - { - thisTex += Convert.ToChar(brlyt[texnamepos]); - texnamepos++; - } - texnamepos++; - - bool exists = Array.Exists(tpls,tpl => tpl == thisTex); - if (exists == false) return false; - } - - return true; - } - - /// - /// Checks, if one or more Tpls specified in the brlyt are missing and returns - /// the names of the missing ones. - /// - /// - /// - /// - /// - public static bool CheckForMissingTpls(string brlyt, string[] tpls, out string[] missingtpls) - { - byte[] brlytArray = Tools.LoadFileToByteArray(brlyt); - return CheckForMissingTpls(brlytArray, tpls, out missingtpls); - } - - /// - /// Checks, if one or more Tpls specified in the brlyt are missing and returns - /// the names of the missing ones. - /// - /// - /// - /// - /// - public static bool CheckForMissingTpls(byte[] brlyt, string[] tpls, out string[] missingtpls) - { - List missings = new List(); - string[] brlytTpls = GetBrlytTpls(brlyt); - bool missing = false; - - for (int i = 0; i < brlytTpls.Length; i++) - { - if (Tools.StringExistsInStringArray(brlytTpls[i], tpls) == false) - { - missings.Add(brlytTpls[i]); - missing = true; - } - } - - missingtpls = missings.ToArray(); - return missing; - } - - /// - /// Checks, if one or more Tpls are not specified in the brlyt and returns - /// the names of the missing ones. - /// - /// - /// - /// - /// - public static bool CheckForUnusedTpls(string brlyt, string[] tpls, out string[] unusedtpls) - { - byte[] brlytArray = Tools.LoadFileToByteArray(brlyt); - return CheckForUnusedTpls(brlytArray, tpls, out unusedtpls); - } - - /// - /// Checks, if one or more Tpls are not specified in the brlyt and returns - /// the names of the missing ones. - /// - /// - /// - /// - /// - public static bool CheckForUnusedTpls(byte[] brlyt, string[] tpls, out string[] unusedtpls) - { - List unuseds = new List(); - string[] brlytTpls = GetBrlytTpls(brlyt); - bool missing = false; - - for (int i = 0; i < tpls.Length; i++) - { - if (Tools.StringExistsInStringArray(tpls[i], brlytTpls) == false) - { - unuseds.Add(tpls[i]); - missing = true; - } - } - - unusedtpls = unuseds.ToArray(); - return missing; - } - - /// - /// Returns the name of all Tpls specified in the brlyt - /// - /// - /// - public static string[] GetBrlytTpls(string brlyt) - { - byte[] temp = Tools.LoadFileToByteArray(brlyt); - return GetBrlytTpls(temp); - } - - /// - /// Returns the name of all Tpls specified in the brlyt - /// - /// - /// - public static string[] GetBrlytTpls(byte[] brlyt) - { - int texcount = Tools.HexStringToInt(brlyt[44].ToString("x2") + brlyt[45].ToString("x2")); - int texnamepos = 48 + (texcount * 8); - List Tpls = new List(); - - for (int i = 0; i < texcount; i++) - { - string thisTex = ""; - while (brlyt[texnamepos] != 0x00) - { - thisTex += Convert.ToChar(brlyt[texnamepos]); - texnamepos++; - } - Tpls.Add(thisTex); - texnamepos++; - } - - return Tpls.ToArray(); - } - - /// - /// Returns true, if the given Tpl is specified in the brlyt. - /// TplName must end with ".tpl"! - /// - /// - /// - /// - public static bool IsTplInBrlyt(byte[] brlyt, string TplName) - { - string[] brlytTpls = GetBrlytTpls(brlyt); - bool exists = Array.Exists(brlytTpls, Tpl => Tpl == TplName); - return exists; - } - } - - public class ProgressChangedEventArgs : EventArgs - { - private readonly int p_Percent = 0; - - public int PercentProgress - { - get { return p_Percent; } - } - - internal ProgressChangedEventArgs(int PercentProgress) - : base() - { - this.p_Percent = PercentProgress; - } - } -} \ No newline at end of file diff --git a/CustomizeMii.sln b/TransmitMii.sln similarity index 54% rename from CustomizeMii.sln rename to TransmitMii.sln index 617b3b2..57aa49b 100644 --- a/CustomizeMii.sln +++ b/TransmitMii.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 10.00 # Visual C# Express 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomizeMii", "CustomizeMii\CustomizeMii.csproj", "{46B7F0BC-101B-4167-95AD-4C5D78AA0A20}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TransmitMii", "TransmitMii\TransmitMii.csproj", "{70517550-06FA-4743-B5D7-2CB7C153E35E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -9,10 +9,10 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {46B7F0BC-101B-4167-95AD-4C5D78AA0A20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {46B7F0BC-101B-4167-95AD-4C5D78AA0A20}.Debug|Any CPU.Build.0 = Debug|Any CPU - {46B7F0BC-101B-4167-95AD-4C5D78AA0A20}.Release|Any CPU.ActiveCfg = Release|Any CPU - {46B7F0BC-101B-4167-95AD-4C5D78AA0A20}.Release|Any CPU.Build.0 = Release|Any CPU + {70517550-06FA-4743-B5D7-2CB7C153E35E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70517550-06FA-4743-B5D7-2CB7C153E35E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70517550-06FA-4743-B5D7-2CB7C153E35E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70517550-06FA-4743-B5D7-2CB7C153E35E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TransmitMii.suo b/TransmitMii.suo new file mode 100644 index 0000000000000000000000000000000000000000..f8a1f31815f2e3260ea0df0c6741ea7177c5dfe8 GIT binary patch literal 22528 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 literal 0 HcmV?d00001 diff --git a/CustomizeMii/License.txt b/TransmitMii/License.txt similarity index 100% rename from CustomizeMii/License.txt rename to TransmitMii/License.txt diff --git a/CustomizeMii/Program.cs b/TransmitMii/Program.cs similarity index 67% rename from CustomizeMii/Program.cs rename to TransmitMii/Program.cs index 8848c92..4b73f54 100644 --- a/CustomizeMii/Program.cs +++ b/TransmitMii/Program.cs @@ -1,12 +1,12 @@ -/* This file is part of CustomizeMii +/* This file is part of TransmitMii * Copyright (C) 2009 Leathl * - * CustomizeMii is free software: you can redistribute it and/or + * TransmitMii is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * CustomizeMii is distributed in the hope that it will be + * TransmitMii is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -18,7 +18,7 @@ using System; using System.Windows.Forms; -namespace CustomizeMii +namespace TransmitMii { static class Program { @@ -26,11 +26,15 @@ namespace CustomizeMii /// Der Haupteinstiegspunkt für die Anwendung. /// [STAThread] - static void Main() + static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new CustomizeMii_Main()); + + if (args.Length > 0) + Application.Run(new TransmitMii_Main(args)); + else + Application.Run(new TransmitMii_Main()); } } } diff --git a/CustomizeMii/Properties/AssemblyInfo.cs b/TransmitMii/Properties/AssemblyInfo.cs similarity index 74% rename from CustomizeMii/Properties/AssemblyInfo.cs rename to TransmitMii/Properties/AssemblyInfo.cs index 0c1e38a..e3e1eb0 100644 --- a/CustomizeMii/Properties/AssemblyInfo.cs +++ b/TransmitMii/Properties/AssemblyInfo.cs @@ -1,12 +1,12 @@ -/* This file is part of CustomizeMii +/* This file is part of TransmitMii * Copyright (C) 2009 Leathl * - * CustomizeMii is free software: you can redistribute it and/or + * TransmitMii is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * CustomizeMii is distributed in the hope that it will be + * TransmitMii is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -18,16 +18,15 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using System.Resources; // Allgemeine Informationen über eine Assembly werden über die folgenden // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, // die mit einer Assembly verknüpft sind. -[assembly: AssemblyTitle("CustomizeMii")] -[assembly: AssemblyDescription("CustomizeMii is a custom channel creator for the Wii")] +[assembly: AssemblyTitle("TransmitMii")] +[assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("CustomizeMii")] +[assembly: AssemblyProduct("TransmitMii")] [assembly: AssemblyCopyright("Copyright © Leathl 2009")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -38,7 +37,7 @@ using System.Resources; [assembly: ComVisible(false)] // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("b8292272-5915-44f7-a7b1-a347bea3ecd5")] +[assembly: Guid("2f34de47-0b02-4f59-b976-b1630f56d8dc")] // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: // @@ -50,6 +49,5 @@ using System.Resources; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] -[assembly: NeutralResourcesLanguageAttribute("en")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CustomizeMii/Properties/Resources.Designer.cs b/TransmitMii/Properties/Resources.Designer.cs similarity index 69% rename from CustomizeMii/Properties/Resources.Designer.cs rename to TransmitMii/Properties/Resources.Designer.cs index 14c69f3..cbbaff5 100644 --- a/CustomizeMii/Properties/Resources.Designer.cs +++ b/TransmitMii/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace CustomizeMii.Properties { +namespace TransmitMii.Properties { using System; @@ -39,7 +39,7 @@ namespace CustomizeMii.Properties { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CustomizeMii.Properties.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TransmitMii.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; @@ -60,27 +60,11 @@ namespace CustomizeMii.Properties { } } - internal static System.Drawing.Icon CustomizeMii { + internal static System.Drawing.Icon TransmitMii_Icon { get { - object obj = ResourceManager.GetObject("CustomizeMii", resourceCulture); + object obj = ResourceManager.GetObject("TransmitMii_Icon", resourceCulture); return ((System.Drawing.Icon)(obj)); } } - - /// - /// Sucht eine lokalisierte Zeichenfolge, die {\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Arial;}} - ///{\colortbl ;\red255\green0\blue0;\red0\green0\blue255;} - ///{\*\generator Msftedit 5.41.21.2509;}\viewkind4\uc1\pard\sa200\sl276\slmult1\b\fs20 These are some basic instructions for CustomizeMii.\b0\par - ///\par - ///\cf1 At the very beginning, let me say this again: Don't install any WADs without a proper brick protection!\cf0\par - ///\par - ///Ok, so you want to create your own custom channels?\par - ///First it is important to understand how the [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. - /// - internal static string Instructions { - get { - return ResourceManager.GetString("Instructions", resourceCulture); - } - } } } diff --git a/CustomizeMii/CustomizeMii_Preview.resx b/TransmitMii/Properties/Resources.resx similarity index 90% rename from CustomizeMii/CustomizeMii_Preview.resx rename to TransmitMii/Properties/Resources.resx index ff31a6d..fd3a021 100644 --- a/CustomizeMii/CustomizeMii_Preview.resx +++ b/TransmitMii/Properties/Resources.resx @@ -1,4 +1,4 @@ - + + \ No newline at end of file diff --git a/TransmitMii/TransmitMii.csproj.user b/TransmitMii/TransmitMii.csproj.user new file mode 100644 index 0000000..7ff3943 --- /dev/null +++ b/TransmitMii/TransmitMii.csproj.user @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/TransmitMii/TransmitMii_Main.Designer.cs b/TransmitMii/TransmitMii_Main.Designer.cs new file mode 100644 index 0000000..0a212a9 --- /dev/null +++ b/TransmitMii/TransmitMii_Main.Designer.cs @@ -0,0 +1,189 @@ +/* This file is part of TransmitMii + * Copyright (C) 2009 Leathl + * + * TransmitMii is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * TransmitMii is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace TransmitMii +{ + partial class TransmitMii_Main + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.lbIP = new System.Windows.Forms.Label(); + this.lbFile = new System.Windows.Forms.Label(); + this.tbFile = new System.Windows.Forms.TextBox(); + this.btnBrowseFile = new System.Windows.Forms.Button(); + this.btnSend = new System.Windows.Forms.Button(); + this.lbStatus = new System.Windows.Forms.Label(); + this.tbIP = new System.Windows.Forms.TextBox(); + this.lbProtocol = new System.Windows.Forms.Label(); + this.cmbProtocol = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // lbIP + // + this.lbIP.AutoSize = true; + this.lbIP.Location = new System.Drawing.Point(12, 76); + this.lbIP.Name = "lbIP"; + this.lbIP.Size = new System.Drawing.Size(61, 13); + this.lbIP.TabIndex = 2; + this.lbIP.Text = "IP Address:"; + // + // lbFile + // + this.lbFile.AutoSize = true; + this.lbFile.Location = new System.Drawing.Point(12, 46); + this.lbFile.Name = "lbFile"; + this.lbFile.Size = new System.Drawing.Size(26, 13); + this.lbFile.TabIndex = 3; + this.lbFile.Text = "File:"; + // + // tbFile + // + this.tbFile.Location = new System.Drawing.Point(44, 43); + this.tbFile.Name = "tbFile"; + this.tbFile.Size = new System.Drawing.Size(166, 20); + this.tbFile.TabIndex = 4; + this.tbFile.MouseLeave += new System.EventHandler(this.tbFile_MouseLeave); + this.tbFile.MouseEnter += new System.EventHandler(this.tbFile_MouseEnter); + // + // btnBrowseFile + // + this.btnBrowseFile.Location = new System.Drawing.Point(216, 42); + this.btnBrowseFile.Name = "btnBrowseFile"; + this.btnBrowseFile.Size = new System.Drawing.Size(75, 20); + this.btnBrowseFile.TabIndex = 5; + this.btnBrowseFile.Text = "Browse..."; + this.btnBrowseFile.UseVisualStyleBackColor = true; + this.btnBrowseFile.Click += new System.EventHandler(this.btnBrowseFile_Click); + // + // btnSend + // + this.btnSend.Location = new System.Drawing.Point(216, 72); + this.btnSend.Name = "btnSend"; + this.btnSend.Size = new System.Drawing.Size(75, 20); + this.btnSend.TabIndex = 5; + this.btnSend.Text = "Send"; + this.btnSend.UseVisualStyleBackColor = true; + this.btnSend.Click += new System.EventHandler(this.btnSend_Click); + // + // lbStatus + // + this.lbStatus.AutoSize = true; + this.lbStatus.Location = new System.Drawing.Point(12, 108); + this.lbStatus.Name = "lbStatus"; + this.lbStatus.Size = new System.Drawing.Size(40, 13); + this.lbStatus.TabIndex = 7; + this.lbStatus.Text = "Status:"; + // + // tbIP + // + this.tbIP.Location = new System.Drawing.Point(79, 72); + this.tbIP.Name = "tbIP"; + this.tbIP.Size = new System.Drawing.Size(131, 20); + this.tbIP.TabIndex = 8; + this.tbIP.MouseLeave += new System.EventHandler(this.tbIP_MouseLeave); + this.tbIP.MouseEnter += new System.EventHandler(this.tbIP_MouseEnter); + // + // lbProtocol + // + this.lbProtocol.AutoSize = true; + this.lbProtocol.Location = new System.Drawing.Point(12, 16); + this.lbProtocol.Name = "lbProtocol"; + this.lbProtocol.Size = new System.Drawing.Size(49, 13); + this.lbProtocol.TabIndex = 9; + this.lbProtocol.Text = "Protocol:"; + // + // cmbProtocol + // + this.cmbProtocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbProtocol.FormattingEnabled = true; + this.cmbProtocol.Items.AddRange(new object[] { + "HBC 1.0.5+ (JODI)", + "HBC -1.0.4 (HAXX)", + "USB Loader GX"}); + this.cmbProtocol.Location = new System.Drawing.Point(67, 13); + this.cmbProtocol.Name = "cmbProtocol"; + this.cmbProtocol.Size = new System.Drawing.Size(224, 21); + this.cmbProtocol.TabIndex = 10; + this.cmbProtocol.MouseEnter += new System.EventHandler(this.cmbProtocol_MouseEnter); + this.cmbProtocol.MouseLeave += new System.EventHandler(this.cmbProtocol_MouseLeave); + // + // TransmitMii_Main + // + this.AllowDrop = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(303, 128); + this.Controls.Add(this.cmbProtocol); + this.Controls.Add(this.lbProtocol); + this.Controls.Add(this.tbIP); + this.Controls.Add(this.lbStatus); + this.Controls.Add(this.btnSend); + this.Controls.Add(this.btnBrowseFile); + this.Controls.Add(this.tbFile); + this.Controls.Add(this.lbFile); + this.Controls.Add(this.lbIP); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.Name = "TransmitMii_Main"; + this.Text = "TransmitMii X by Leathl"; + this.Load += new System.EventHandler(this.TransmitMii_Main_Load); + this.DragDrop += new System.Windows.Forms.DragEventHandler(this.TransmitMii_Main_DragDrop); + this.DragEnter += new System.Windows.Forms.DragEventHandler(this.TransmitMii_Main_DragEnter); + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.TransmitMii_Main_FormClosing); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbIP; + private System.Windows.Forms.Label lbFile; + private System.Windows.Forms.TextBox tbFile; + private System.Windows.Forms.Button btnBrowseFile; + private System.Windows.Forms.Button btnSend; + private System.Windows.Forms.Label lbStatus; + private System.Windows.Forms.TextBox tbIP; + private System.Windows.Forms.Label lbProtocol; + private System.Windows.Forms.ComboBox cmbProtocol; + } +} + diff --git a/TransmitMii/TransmitMii_Main.cs b/TransmitMii/TransmitMii_Main.cs new file mode 100644 index 0000000..45c6441 --- /dev/null +++ b/TransmitMii/TransmitMii_Main.cs @@ -0,0 +1,361 @@ +/* This file is part of TransmitMii + * Copyright (C) 2009 Leathl + * + * TransmitMii is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * TransmitMii is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Net; +using System.Net.Sockets; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +namespace TransmitMii +{ + public partial class TransmitMii_Main : Form + { + const string version = "1.0"; //Hint for myself: Never use a char in the Version (UpdateCheck)! + private bool IsRunning = false; + private string fileName; + private string statusText; + private bool JODI; + EventHandler UpdateStatus; + EventHandler EnableButtons; + BackgroundWorker bwTransmit = new BackgroundWorker(); + Regex IpAdress; + + public TransmitMii_Main() + { + InitializeComponent(); + this.CenterToScreen(); + this.Icon = Properties.Resources.TransmitMii_Icon; + } + + public TransmitMii_Main(string[] args) + { + InitializeComponent(); + this.CenterToScreen(); + + if (args[0].EndsWith(".dol") || args[0].EndsWith(".elf")) + tbFile.Text = args[0]; + } + + private void TransmitMii_Main_Load(object sender, EventArgs e) + { + this.Text = this.Text.Replace("X", version); + UpdateCheck(); + + UpdateStatus = new EventHandler(this.StatusUpdate); + EnableButtons = new EventHandler(this.ButtonEnable); + bwTransmit.DoWork += new DoWorkEventHandler(bwTransmit_DoWork); + bwTransmit.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwTransmit_RunWorkerCompleted); + bwTransmit.WorkerSupportsCancellation = true; + + string IpPattern = @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])"; + IpAdress = new Regex(IpPattern); + + LoadSettings(); + + if (!string.IsNullOrEmpty(tbIP.Text) && !string.IsNullOrEmpty(tbFile.Text)) + btnSend_Click(null, null); + } + + private void LoadSettings() + { + tbIP.Text = Properties.Settings.Default.IPAddress; + cmbProtocol.SelectedIndex = Properties.Settings.Default.Protocol; + } + + private void SaveSettings() + { + Properties.Settings.Default.IPAddress = tbIP.Text; + Properties.Settings.Default.Protocol = cmbProtocol.SelectedIndex; + Properties.Settings.Default.Save(); + } + + private void UpdateCheck() + { + try + { + WebClient GetVersion = new WebClient(); + string NewVersion = GetVersion.DownloadString("http://customizemii.googlecode.com/svn/transmitmii-version.txt"); + + int newVersion = Convert.ToInt32(NewVersion.Replace(".", string.Empty).Length == 2 ? (NewVersion.Replace(".", string.Empty) + "0") : NewVersion.Replace(".", string.Empty)); + int thisVersion = Convert.ToInt32(version.Replace(".", string.Empty).Length == 2 ? (version.Replace(".", string.Empty) + "0") : version.Replace(".", string.Empty)); + + if (newVersion > thisVersion) + { + if (MessageBox.Show("Version " + NewVersion + + " is availabe.\nDo you want the download page to be opened?", + "Update availabe", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == + DialogResult.Yes) + { + Process.Start("http://code.google.com/p/customizemii/downloads/list"); + } + } + } + catch { } + } + + private void ErrorBox(string message) + { + MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + private void StatusUpdate(string theMessage) + { + statusText = "Status: " + theMessage; + this.Invoke(UpdateStatus); + } + + private void StatusUpdate(object sender, EventArgs e) + { + lbStatus.Text = statusText; + } + + private void ButtonEnable(object sender, EventArgs e) + { + IsRunning = false; + btnBrowseFile.Enabled = true; + btnSend.Enabled = true; + } + + private bool Transmit(string fileName, byte[] fileData, bool JODI) //(byte[] theFile, int fileLength, byte[] args, int argsLength) + { + TcpClient theClient = new TcpClient(); + NetworkStream theStream; + + int Blocksize = 4 * 1024; + if (!JODI) Blocksize = 16 * 1024; + byte[] buffer = new byte[4]; + string theIP = tbIP.Text; + + StatusUpdate("Connecting..."); + try { theClient.Connect(theIP, 4299); } + catch (Exception ex) { ErrorBox("Connection Failed:\n" + ex.Message); theClient.Close(); return false; } + theStream = theClient.GetStream(); + + StatusUpdate("Connected... Sending Magic..."); + buffer[0] = (byte)'H'; + buffer[1] = (byte)'A'; + buffer[2] = (byte)'X'; + buffer[3] = (byte)'X'; + try { theStream.Write(buffer, 0, 4); } + catch (Exception ex) { ErrorBox("Error sending Magic:\n" + ex.Message); theStream.Close(); theClient.Close(); return false; } + + StatusUpdate("Magic Sent... Sending Version Info..."); + if (JODI) + { + buffer[0] = 0; + buffer[1] = 5; + buffer[2] = (byte)(((fileName.Length + 2) >> 8) & 0xff); + buffer[3] = (byte)((fileName.Length + 2) & 0xff); + } + else + { + buffer[0] = 0; + buffer[1] = 1; + buffer[2] = 0; + buffer[3] = 0; + } + try { theStream.Write(buffer, 0, 4); } + catch (Exception ex) { ErrorBox("Error sending Version Info:\n" + ex.Message); theStream.Close(); theClient.Close(); return false; } + + StatusUpdate("Version Info Sent... Sending Filesize..."); + //First compressed filesize, then uncompressed filesize + buffer[0] = (byte)((fileData.Length >> 24) & 0xff); + buffer[1] = (byte)((fileData.Length >> 16) & 0xff); + buffer[2] = (byte)((fileData.Length >> 8) & 0xff); + buffer[3] = (byte)(fileData.Length & 0xff); + try { theStream.Write(buffer, 0, 4); } + catch (Exception ex) { ErrorBox("Error sending Filesize:\n" + ex.Message); theStream.Close(); theClient.Close(); return false; } + + if (JODI) + { + buffer[0] = 0; + buffer[1] = 0; + buffer[2] = 0; + buffer[3] = 0; + try { theStream.Write(buffer, 0, 4); } + catch (Exception ex) { ErrorBox("Error sending Filesize:\n" + ex.Message); theStream.Close(); theClient.Close(); return false; } + } + + StatusUpdate("Filesize Sent... Sending File..."); + int off = 0; + int cur = 0; + int count = fileData.Length / Blocksize; + int left = fileData.Length % Blocksize; + + try + { + do + { + StatusUpdate("Sending File: " + ((cur + 1) * 100 / count).ToString() + "%"); + theStream.Write(fileData, off, Blocksize); + off += Blocksize; + cur++; + } while (cur < count); + + if (left > 0) + { + theStream.Write(fileData, off, fileData.Length - off); + } + } + catch (Exception ex) { ErrorBox("Error sending File:\n" + ex.Message); theStream.Close(); theClient.Close(); return false; } + + if (JODI) + { + StatusUpdate("File Sent... Sending Arguments..."); + byte[] theArgs = new byte[fileName.Length + 2]; + for (int i = 0; i < fileName.Length; i++) { theArgs[i] = (byte)fileName.ToCharArray()[i]; } + try { theStream.Write(theArgs, 0, theArgs.Length); } + catch (Exception ex) { ErrorBox("Error sending Arguments:\n" + ex.Message); theStream.Close(); theClient.Close(); return false; } + } + + theStream.Close(); + theClient.Close(); + + StatusUpdate(string.Empty); + + return true; + } + + private void btnBrowseFile_Click(object sender, EventArgs e) + { + OpenFileDialog ofd = new OpenFileDialog(); + ofd.Filter = "DOL|*.dol|ELF|*.elf|WAD|*.wad|All|*.dol;*.elf;*.wad"; + ofd.FilterIndex = 4; + + if (ofd.ShowDialog() == DialogResult.OK) + { + tbFile.Text = ofd.FileName; + } + } + + private void btnSend_Click(object sender, EventArgs e) + { + if (File.Exists(tbFile.Text)) + { + if (IpAdress.IsMatch(tbIP.Text)) + { + if (tbFile.Text.EndsWith(".wad") && cmbProtocol.SelectedIndex != 2) + { ErrorBox("WAD files can only be sent to USB Loader GX!"); return; } + + btnSend.Enabled = false; + btnBrowseFile.Enabled = false; + IsRunning = true; + + FileStream fs = new FileStream(tbFile.Text, FileMode.Open); + byte[] theFile = new byte[fs.Length]; + fs.Read(theFile, 0, theFile.Length); + + fileName = Path.GetFileName(tbFile.Text); + + JODI = cmbProtocol.SelectedIndex == 0 ? true : false; + bwTransmit.RunWorkerAsync(theFile); + } + else { tbIP.Focus(); tbIP.SelectAll(); } + } + else { tbFile.Focus(); tbFile.SelectAll(); } + } + + void bwTransmit_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + this.Invoke(EnableButtons); + StatusUpdate(string.Empty); + } + + void bwTransmit_DoWork(object sender, DoWorkEventArgs e) + { + byte[] theFile = e.Argument as byte[]; + + if (Transmit(fileName, theFile, JODI)) + { + MessageBox.Show("File Sent...", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void tbFile_MouseEnter(object sender, EventArgs e) + { + if (IsRunning == false) + lbStatus.Text = "The file to transmit..."; + } + + private void tbFile_MouseLeave(object sender, EventArgs e) + { + if (IsRunning == false) + lbStatus.Text = "Status:"; + } + + private void tbIP_MouseEnter(object sender, EventArgs e) + { + if (IsRunning == false) + lbStatus.Text = "The IP address of the Wii..."; + } + + private void cmbProtocol_MouseEnter(object sender, EventArgs e) + { + if (IsRunning == false) + lbStatus.Text = "The protocol to use for transmitting..."; + } + + private void cmbProtocol_MouseLeave(object sender, EventArgs e) + { + if (IsRunning == false) + lbStatus.Text = "Status:"; + } + + private void tbIP_MouseLeave(object sender, EventArgs e) + { + if (IsRunning == false) + lbStatus.Text = "Status:"; + } + + private void TransmitMii_Main_FormClosing(object sender, FormClosingEventArgs e) + { + bwTransmit.CancelAsync(); + SaveSettings(); + } + + private void TransmitMii_Main_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop)) + { + string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); + if (files.Length == 1) + { + if (Path.GetExtension(files[0]) == ".dol" || Path.GetExtension(files[0]) == ".elf") + e.Effect = DragDropEffects.Copy; + else + e.Effect = DragDropEffects.None; + } + else e.Effect = DragDropEffects.None; + } + else e.Effect = DragDropEffects.None; + } + + private void TransmitMii_Main_DragDrop(object sender, DragEventArgs e) + { + string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); + tbFile.Text = files[0]; + } + } +} diff --git a/CustomizeMii/CustomizeMii_InputBox.resx b/TransmitMii/TransmitMii_Main.resx similarity index 100% rename from CustomizeMii/CustomizeMii_InputBox.resx rename to TransmitMii/TransmitMii_Main.resx diff --git a/TransmitMii/app.config b/TransmitMii/app.config new file mode 100644 index 0000000..b2e47bb --- /dev/null +++ b/TransmitMii/app.config @@ -0,0 +1,18 @@ + + + + +
+ + + + + + + + + 0 + + + + \ No newline at end of file