diff --git a/CustomizeMii/BNS.cs b/CustomizeMii/BNS.cs index 35bbd3a..f723c27 100644 --- a/CustomizeMii/BNS.cs +++ b/CustomizeMii/BNS.cs @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -//These classes are based on bns.py of the Wii.py Framework with improvements by me (Leathl) +//These classes are based on bns.py (by megazig) of the Wii.py Framework with improvements by me (Leathl) //Thanks to Xuzz, SquidMan, megazig, Matt_P, Omega and The Lemon Man, the authors of Wii.py! using System; diff --git a/CustomizeMii/CustomizeMii_BackgroundWorkers.cs b/CustomizeMii/CustomizeMii_BackgroundWorkers.cs index da66df6..87430c3 100644 --- a/CustomizeMii/CustomizeMii_BackgroundWorkers.cs +++ b/CustomizeMii/CustomizeMii_BackgroundWorkers.cs @@ -493,9 +493,11 @@ namespace CustomizeMii bwLoadChannel.ReportProgress(90, "Gathering Information..."); string[] ChannelTitles = Wii.WadInfo.GetChannelTitles(WadFile); string TitleID = Wii.WadInfo.GetTitleID(WadFile, 1); + string IosFlag = Wii.WadInfo.GetIosFlag(WadFile).Replace("IOS", string.Empty); bool allLangs = true; SetText(tbTitleID, TitleID); + SetText(tbStartupIos, IosFlag); if (ChannelTitles[0] != ChannelTitles[1]) SetText(tbJapanese, ChannelTitles[0]); else allLangs = false; @@ -509,6 +511,7 @@ namespace CustomizeMii else allLangs = false; if (ChannelTitles[6] != ChannelTitles[1]) SetText(tbDutch, ChannelTitles[6]); else allLangs = false; + if (ChannelTitles[7] != ChannelTitles[1]) SetText(tbKorean, ChannelTitles[7]); if (allLangs) SetText(tbEnglish, ChannelTitles[1]); else SetText(tbAllLanguages, ChannelTitles[1]); @@ -843,7 +846,7 @@ namespace CustomizeMii 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)) + if (!string.IsNullOrEmpty(SoundReplace) || !string.IsNullOrEmpty(wadInfo.sound)) { bwCreateWad.ReportProgress(50, "Packing sound.bin..."); @@ -852,20 +855,20 @@ namespace CustomizeMii 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)) + else if (!string.IsNullOrEmpty(wadInfo.sound)) { if (tbSound.Text.EndsWith(".bns")) { - Wii.Sound.BnsToSoundBin(tbSound.Text, TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", false); + Wii.Sound.BnsToSoundBin(wadInfo.sound, TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", false); } - else if (tbSound.Text.StartsWith("BNS:")) + else if (wadInfo.sound.StartsWith("BNS:")) { Wii.Sound.BnsToSoundBin(TempBnsPath, TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", false); } else { - string SoundFile = tbSound.Text; - if (tbSound.Text.EndsWith(".mp3")) SoundFile = TempWavePath; + string SoundFile = wadInfo.sound; + if (wadInfo.sound.EndsWith(".mp3")) SoundFile = TempWavePath; Wii.Sound.WaveToSoundBin(SoundFile, TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", false); } @@ -874,13 +877,13 @@ namespace CustomizeMii 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; + for (int i = 0; i < wadInfo.titles.Length; i++) + if (string.IsNullOrEmpty(wadInfo.titles[i])) wadInfo.titles[i] = wadInfo.allLangTitle; - 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); + byte[] nullapp = Wii.U8.PackU8(TempUnpackPath + "00000000.app_OUT", out Sizes[0], out Sizes[1], out Sizes[2]); + nullapp = Wii.U8.AddHeaderIMET(nullapp, wadInfo.titles, Sizes); Wii.Tools.SaveFileFromByteArray(nullapp, TempUnpackPath + "00000000.app"); Directory.Delete(TempUnpackPath + "00000000.app_OUT", true); @@ -888,7 +891,7 @@ namespace CustomizeMii string[] tmdfile = Directory.GetFiles(TempUnpackPath, "*.tmd"); byte[] tmd = Wii.Tools.LoadFileToByteArray(tmdfile[0]); - if (!string.IsNullOrEmpty(tbDol.Text)) + if (!string.IsNullOrEmpty(wadInfo.dol)) { bwCreateWad.ReportProgress(80, "Inserting new DOL..."); string[] AppFiles = Directory.GetFiles(TempUnpackPath, "*.app"); @@ -907,22 +910,22 @@ namespace CustomizeMii } } - if (tbDol.Text.StartsWith("Simple Forwarder:")) + if (wadInfo.dol.StartsWith("Simple Forwarder:")) { CreateForwarderSimple(TempUnpackPath + "\\00000002.app"); } - else if (tbDol.Text.StartsWith("Complex Forwarder")) + else if (wadInfo.dol.StartsWith("Complex Forwarder")) { bwCreateWad.ReportProgress(82, "Compiling Forwarder..."); CreateForwarderComplex(TempUnpackPath + "\\00000002.app"); } - else if (tbDol.Text == "Internal" || tbDol.Text.EndsWith(".wad")) + else if (wadInfo.dol == "Internal" || wadInfo.dol.EndsWith(".wad")) { File.Copy(TempDolPath, TempUnpackPath + "\\00000002.app"); } else { - File.Copy(tbDol.Text, TempUnpackPath + "\\00000002.app"); + File.Copy(wadInfo.dol, TempUnpackPath + "\\00000002.app"); } tmd = Wii.WadEdit.ChangeTmdBootIndex(tmd, 1); @@ -938,16 +941,16 @@ namespace CustomizeMii } } - if (tbDol.Text.StartsWith("Simple Forwarder:")) + if (wadInfo.dol.StartsWith("Simple Forwarder:")) { CreateForwarderSimple(TempUnpackPath + "\\00000001.app"); } - else if (tbDol.Text.StartsWith("Complex Forwarder")) + else if (wadInfo.dol.StartsWith("Complex Forwarder")) { bwCreateWad.ReportProgress(82, "Compiling Forwarder..."); CreateForwarderComplex(TempUnpackPath + "\\00000001.app"); } - else if (tbDol.Text == "Internal") + else if (wadInfo.dol == "Internal") { File.Copy(TempDolPath, TempUnpackPath + "\\00000001.app"); } @@ -980,10 +983,14 @@ namespace CustomizeMii } bwCreateWad.ReportProgress(85, "Updating TMD..."); + Wii.WadEdit.ChangeIosFlag(tmdfile[0], wadInfo.requiredIos); Wii.WadEdit.UpdateTmdContents(tmdfile[0]); - Wii.WadEdit.ChangeTitleID(tikfile[0], 0, tbTitleID.Text.ToUpper()); - Wii.WadEdit.ChangeTitleID(tmdfile[0], 1, tbTitleID.Text.ToUpper()); + if (!string.IsNullOrEmpty(wadInfo.titleId)) + { + Wii.WadEdit.ChangeTitleID(tikfile[0], 0, wadInfo.titleId); + Wii.WadEdit.ChangeTitleID(tmdfile[0], 1, wadInfo.titleId); + } bwCreateWad.ReportProgress(90, "Trucha Signing..."); Wii.WadEdit.TruchaSign(tmdfile[0], 1); diff --git a/CustomizeMii/CustomizeMii_BnsConvert.Designer.cs b/CustomizeMii/CustomizeMii_BnsConvert.Designer.cs index 28d6e88..699c02c 100644 --- a/CustomizeMii/CustomizeMii_BnsConvert.Designer.cs +++ b/CustomizeMii/CustomizeMii_BnsConvert.Designer.cs @@ -197,7 +197,7 @@ namespace CustomizeMii this.rbFromAudioFile.Name = "rbFromAudioFile"; this.rbFromAudioFile.Size = new System.Drawing.Size(281, 17); this.rbFromAudioFile.TabIndex = 0; - this.rbFromAudioFile.Text = "From Audio File (works only with pre-looped wave files)"; + this.rbFromAudioFile.Text = "From Audio File (only works with pre-looped wave files)"; this.rbFromAudioFile.UseVisualStyleBackColor = true; this.rbFromAudioFile.CheckedChanged += new System.EventHandler(this.rbSelectionChanged); // @@ -396,6 +396,7 @@ namespace CustomizeMii this.AcceptButton = this.btnConvert; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; this.CancelButton = this.btnCancel; this.ClientSize = new System.Drawing.Size(674, 230); this.Controls.Add(this.gbPrelisten); diff --git a/CustomizeMii/CustomizeMii_ComplexForwarder.Designer.cs b/CustomizeMii/CustomizeMii_ComplexForwarder.Designer.cs index 660863e..6a3b39c 100644 --- a/CustomizeMii/CustomizeMii_ComplexForwarder.Designer.cs +++ b/CustomizeMii/CustomizeMii_ComplexForwarder.Designer.cs @@ -434,6 +434,7 @@ namespace CustomizeMii this.AcceptButton = this.btnOK; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; this.CancelButton = this.btnCancel; this.ClientSize = new System.Drawing.Size(358, 383); this.Controls.Add(this.tabPaths); diff --git a/CustomizeMii/CustomizeMii_InputBox.Designer.cs b/CustomizeMii/CustomizeMii_InputBox.Designer.cs index a3ef099..a78a8b1 100644 --- a/CustomizeMii/CustomizeMii_InputBox.Designer.cs +++ b/CustomizeMii/CustomizeMii_InputBox.Designer.cs @@ -111,6 +111,7 @@ namespace CustomizeMii this.AcceptButton = this.btnOK; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; this.CancelButton = this.btnExit; this.ClientSize = new System.Drawing.Size(238, 92); this.Controls.Add(this.cbElf); diff --git a/CustomizeMii/CustomizeMii_Main.Designer.cs b/CustomizeMii/CustomizeMii_Main.Designer.cs index 534e3e7..fbfc4ea 100644 --- a/CustomizeMii/CustomizeMii_Main.Designer.cs +++ b/CustomizeMii/CustomizeMii_Main.Designer.cs @@ -64,6 +64,7 @@ namespace CustomizeMii this.lbSource = new System.Windows.Forms.Label(); this.tabTitle = new System.Windows.Forms.TabPage(); this.llbTranslateChannel = new System.Windows.Forms.LinkLabel(); + this.tbKorean = new System.Windows.Forms.TextBox(); this.tbItalian = new System.Windows.Forms.TextBox(); this.tbFrench = new System.Windows.Forms.TextBox(); this.tbJapanese = new System.Windows.Forms.TextBox(); @@ -72,6 +73,7 @@ namespace CustomizeMii this.tbGerman = new System.Windows.Forms.TextBox(); this.tbEnglish = new System.Windows.Forms.TextBox(); this.lbDutch = new System.Windows.Forms.Label(); + this.lbKorean = 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(); @@ -92,12 +94,15 @@ namespace CustomizeMii this.cmbNandLoader = new System.Windows.Forms.ComboBox(); this.btnBrowseDol = new System.Windows.Forms.Button(); this.tbDol = new System.Windows.Forms.TextBox(); + this.tbStartupIos = 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.lbStartupIos = new System.Windows.Forms.Label(); this.lbTitleID = new System.Windows.Forms.Label(); this.tabBanner = new System.Windows.Forms.TabPage(); + this.llbBannerMultiReplace = new System.Windows.Forms.LinkLabel(); this.cbBannerMakeTransparent = new System.Windows.Forms.CheckBox(); this.cmbFormatBanner = new System.Windows.Forms.ComboBox(); this.lbFormatBanner = new System.Windows.Forms.Label(); @@ -108,6 +113,7 @@ namespace CustomizeMii this.btnReplaceBanner = new System.Windows.Forms.Button(); this.lbxBannerTpls = new System.Windows.Forms.ListBox(); this.tabIcon = new System.Windows.Forms.TabPage(); + this.llbIconMultiReplace = new System.Windows.Forms.LinkLabel(); this.cbIconMakeTransparent = new System.Windows.Forms.CheckBox(); this.cmbFormatIcon = new System.Windows.Forms.ComboBox(); this.lbFormatIcon = new System.Windows.Forms.Label(); @@ -383,6 +389,7 @@ namespace CustomizeMii // tabTitle // this.tabTitle.Controls.Add(this.llbTranslateChannel); + this.tabTitle.Controls.Add(this.tbKorean); this.tabTitle.Controls.Add(this.tbItalian); this.tabTitle.Controls.Add(this.tbFrench); this.tabTitle.Controls.Add(this.tbJapanese); @@ -391,6 +398,7 @@ namespace CustomizeMii this.tabTitle.Controls.Add(this.tbGerman); this.tabTitle.Controls.Add(this.tbEnglish); this.tabTitle.Controls.Add(this.lbDutch); + this.tabTitle.Controls.Add(this.lbKorean); this.tabTitle.Controls.Add(this.lbItalian); this.tabTitle.Controls.Add(this.lbSpanish); this.tabTitle.Controls.Add(this.lbFrench); @@ -420,6 +428,14 @@ namespace CustomizeMii this.llbTranslateChannel.Text = "Translate \"Channel\""; this.llbTranslateChannel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llbTranslateChannel_LinkClicked); // + // tbKorean + // + this.tbKorean.Location = new System.Drawing.Point(301, 171); + this.tbKorean.MaxLength = 20; + this.tbKorean.Name = "tbKorean"; + this.tbKorean.Size = new System.Drawing.Size(124, 20); + this.tbKorean.TabIndex = 16; + // // tbItalian // this.tbItalian.Location = new System.Drawing.Point(301, 143); @@ -485,6 +501,15 @@ namespace CustomizeMii this.lbDutch.TabIndex = 9; this.lbDutch.Text = "Dutch:"; // + // lbKorean + // + this.lbKorean.AutoSize = true; + this.lbKorean.Location = new System.Drawing.Point(221, 174); + this.lbKorean.Name = "lbKorean"; + this.lbKorean.Size = new System.Drawing.Size(44, 13); + this.lbKorean.TabIndex = 8; + this.lbKorean.Text = "Korean:"; + // // lbItalian // this.lbItalian.AutoSize = true; @@ -578,10 +603,12 @@ namespace CustomizeMii this.tabOptions.Controls.Add(this.cmbNandLoader); this.tabOptions.Controls.Add(this.btnBrowseDol); this.tabOptions.Controls.Add(this.tbDol); + this.tabOptions.Controls.Add(this.tbStartupIos); 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.lbStartupIos); this.tabOptions.Controls.Add(this.lbTitleID); this.tabOptions.Location = new System.Drawing.Point(4, 22); this.tabOptions.Name = "tabOptions"; @@ -700,6 +727,16 @@ namespace CustomizeMii this.tbDol.DragDrop += new System.Windows.Forms.DragEventHandler(this.tbDol_DragDrop); this.tbDol.DragEnter += new System.Windows.Forms.DragEventHandler(this.tbDol_DragEnter); // + // tbStartupIos + // + this.tbStartupIos.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; + this.tbStartupIos.Location = new System.Drawing.Point(299, 49); + this.tbStartupIos.MaxLength = 4; + this.tbStartupIos.Name = "tbStartupIos"; + this.tbStartupIos.Size = new System.Drawing.Size(55, 20); + this.tbStartupIos.TabIndex = 4; + this.tbStartupIos.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.tbStartupIos_KeyPress); + // // tbTitleID // this.tbTitleID.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; @@ -736,6 +773,15 @@ namespace CustomizeMii this.lbNewDol.TabIndex = 1; this.lbNewDol.Text = "New DOL:"; // + // lbStartupIos + // + this.lbStartupIos.AutoSize = true; + this.lbStartupIos.Location = new System.Drawing.Point(192, 52); + this.lbStartupIos.Name = "lbStartupIos"; + this.lbStartupIos.Size = new System.Drawing.Size(65, 13); + this.lbStartupIos.TabIndex = 0; + this.lbStartupIos.Text = "Startup IOS:"; + // // lbTitleID // this.lbTitleID.AutoSize = true; @@ -747,6 +793,7 @@ namespace CustomizeMii // // tabBanner // + this.tabBanner.Controls.Add(this.llbBannerMultiReplace); this.tabBanner.Controls.Add(this.cbBannerMakeTransparent); this.tabBanner.Controls.Add(this.cmbFormatBanner); this.tabBanner.Controls.Add(this.lbFormatBanner); @@ -764,6 +811,17 @@ namespace CustomizeMii this.tabBanner.Text = "Banner"; this.tabBanner.UseVisualStyleBackColor = true; // + // llbBannerMultiReplace + // + this.llbBannerMultiReplace.AutoSize = true; + this.llbBannerMultiReplace.Location = new System.Drawing.Point(282, 190); + this.llbBannerMultiReplace.Name = "llbBannerMultiReplace"; + this.llbBannerMultiReplace.Size = new System.Drawing.Size(72, 13); + this.llbBannerMultiReplace.TabIndex = 7; + this.llbBannerMultiReplace.TabStop = true; + this.llbBannerMultiReplace.Text = "Multi Replace"; + this.llbBannerMultiReplace.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llbMultiReplace_LinkClicked); + // // cbBannerMakeTransparent // this.cbBannerMakeTransparent.AutoSize = true; @@ -870,6 +928,7 @@ namespace CustomizeMii // // tabIcon // + this.tabIcon.Controls.Add(this.llbIconMultiReplace); this.tabIcon.Controls.Add(this.cbIconMakeTransparent); this.tabIcon.Controls.Add(this.cmbFormatIcon); this.tabIcon.Controls.Add(this.lbFormatIcon); @@ -887,6 +946,17 @@ namespace CustomizeMii this.tabIcon.Text = "Icon"; this.tabIcon.UseVisualStyleBackColor = true; // + // llbIconMultiReplace + // + this.llbIconMultiReplace.AutoSize = true; + this.llbIconMultiReplace.Location = new System.Drawing.Point(282, 190); + this.llbIconMultiReplace.Name = "llbIconMultiReplace"; + this.llbIconMultiReplace.Size = new System.Drawing.Size(72, 13); + this.llbIconMultiReplace.TabIndex = 13; + this.llbIconMultiReplace.TabStop = true; + this.llbIconMultiReplace.Text = "Multi Replace"; + this.llbIconMultiReplace.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llbMultiReplace_LinkClicked); + // // cbIconMakeTransparent // this.cbIconMakeTransparent.AutoSize = true; @@ -1710,6 +1780,12 @@ namespace CustomizeMii private System.Windows.Forms.ToolStripMenuItem cmExtractBrlan; private System.Windows.Forms.ToolStripMenuItem cmExtractBothBrl; private System.Windows.Forms.LinkLabel llbTranslateChannel; + private System.Windows.Forms.TextBox tbStartupIos; + private System.Windows.Forms.Label lbStartupIos; + private System.Windows.Forms.TextBox tbKorean; + private System.Windows.Forms.Label lbKorean; + private System.Windows.Forms.LinkLabel llbBannerMultiReplace; + private System.Windows.Forms.LinkLabel llbIconMultiReplace; } } diff --git a/CustomizeMii/CustomizeMii_Main.cs b/CustomizeMii/CustomizeMii_Main.cs index c37d96b..f648b3d 100644 --- a/CustomizeMii/CustomizeMii_Main.cs +++ b/CustomizeMii/CustomizeMii_Main.cs @@ -33,7 +33,7 @@ namespace CustomizeMii public partial class CustomizeMii_Main : Form { #region Constants - const string version = "2.2"; //Hint for myself: Never use a char in the Version (UpdateCheck)! + const string version = "2.3"; //Hint for myself: Never use a char in the Version (UpdateCheck)! const int SoundMaxLength = 30; //In seconds const int SoundWarningLength = 20; //In seconds const int BnsWarningLength = 45; //In seconds @@ -92,26 +92,30 @@ namespace CustomizeMii private void CustomizeMii_Main_Load(object sender, EventArgs e) { - MethodInvoker Update = new MethodInvoker(UpdateCheck); - - UpdatePaths(); - Update.BeginInvoke(null, null); - #if !Mono - MethodInvoker FUpdate = new MethodInvoker(UpdateCheckForwardMii); - FUpdate.BeginInvoke(null, null); + this.Text = this.Text.Replace("X", version); + this.lbCreditVersion.Text = this.lbCreditVersion.Text.Replace("X", version); CommonKeyCheck(); #endif - - InitializeStartup(); - #if Mono + this.Text = this.Text.Replace("X", version + " (Mono)"); + this.lbCreditVersion.Text = this.lbCreditVersion.Text.Replace("X", version + " (Mono)"); Mono = true; //TextBox.MaxLength is not implemented in Mono, so don't use it for (int i = 0; i < tabControl.TabPages.Count; i++) for(int j=0;j thisVersion) - { - if (MessageBox.Show("Version " + NewVersion + - " of the ForwardMii-Plugin is available.\nDo you want the download page to be opened?", - "ForwardMii Update available", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == - DialogResult.Yes) - { - Process.Start("http://code.google.com/p/customizemii/downloads/list"); - } - } - } - } - catch { } - } - } - } #endif private void llbSite_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) @@ -895,7 +861,7 @@ namespace CustomizeMii cbBannerMakeTransparent.Enabled = true; cbBannerMakeTransparent.Checked = lbxBannerTpls.SelectedItem.ToString().EndsWith("(Transparent)"); - string TplFile = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string TplFile = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); int TplFormat = Wii.TPL.GetTextureFormat(TplFile); switch (TplFormat) @@ -956,7 +922,7 @@ namespace CustomizeMii cbIconMakeTransparent.Enabled = true; cbIconMakeTransparent.Checked = lbxIconTpls.SelectedItem.ToString().EndsWith("(Transparent)"); - string TplFile = IconTplPath + lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string TplFile = IconTplPath + lbxIconTpls.SelectedItem.ToString().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); int TplFormat = Wii.TPL.GetTextureFormat(TplFile); switch (TplFormat) @@ -1024,7 +990,7 @@ namespace CustomizeMii { try { - string Tpl = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string Tpl = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); Image Img; @@ -1085,7 +1051,7 @@ namespace CustomizeMii { if (lbxBannerTpls.SelectedIndex != -1) { - string Tpl = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string Tpl = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); int format = Wii.TPL.GetTextureFormat(Tpl); if (format == 8 || format == 9 || format == 10) { ErrorBox("This format is not supported!"); return; } @@ -1138,7 +1104,7 @@ namespace CustomizeMii try { CustomizeMii_Preview pvw = new CustomizeMii_Preview(); - pvw.startTPL = lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + pvw.startTPL = lbxBannerTpls.SelectedItem.ToString().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); pvw.ShowDialog(); pvw = null; } @@ -1167,7 +1133,7 @@ namespace CustomizeMii { try { - string Tpl = IconTplPath + lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string Tpl = IconTplPath + lbxIconTpls.SelectedItem.ToString().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); Image Img; @@ -1228,7 +1194,7 @@ namespace CustomizeMii { if (lbxIconTpls.SelectedIndex != -1) { - string Tpl = BannerTplPath + lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string Tpl = IconTplPath + lbxIconTpls.SelectedItem.ToString().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); int format = Wii.TPL.GetTextureFormat(Tpl); if (format == 8 || format == 9 || format == 10) { ErrorBox("This format is not supported!"); return; } @@ -1282,7 +1248,7 @@ namespace CustomizeMii { CustomizeMii_Preview pvw = new CustomizeMii_Preview(); pvw.startIcon = true; - pvw.startTPL = lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + pvw.startTPL = lbxIconTpls.SelectedItem.ToString().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); pvw.ShowDialog(); pvw = null; } @@ -1295,334 +1261,13 @@ namespace CustomizeMii } } - private bool CheckUnpackFolder() - { - try - { - //Check Unpack Root - string[] RootFiles = Directory.GetFiles(TempUnpackPath); - string[] RootDirs = Directory.GetDirectories(TempUnpackPath); - - foreach (string thisFile in RootFiles) - { - if (!thisFile.ToLower().EndsWith(".app") && - !thisFile.ToLower().EndsWith(".cert") && - !thisFile.ToLower().EndsWith(".tik") && - !thisFile.ToLower().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.ToLower().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.ToLower().EndsWith("banner.bin") && - !thisFile.ToLower().EndsWith("icon.bin") && - !thisFile.ToLower().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.ToLower().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.ToLower().EndsWith("anim") && - !thisDir.ToLower().EndsWith("blyt") && - !thisDir.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().EndsWith("anim") && - !thisDir.ToLower().EndsWith("blyt") && - !thisDir.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().EndsWith("anim") && - !thisDir.ToLower().EndsWith("blyt") && - !thisDir.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().EndsWith("anim") && - !thisDir.ToLower().EndsWith("blyt") && - !thisDir.ToLower().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.ToLower().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.ToLower().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.ToLower().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) { Point mousePos = MousePosition; if (mousePos.X < (this.Location.X + btnCreateWad.Location.X + Math.Ceiling(separatorBtn) + 3)) { + //SEND WAD if (pbProgress.Value == 100) { if (!string.IsNullOrEmpty(tbSourceWad.Text)) @@ -1668,6 +1313,7 @@ namespace CustomizeMii } else { + //CREATE WAD if (pbProgress.Value == 100) { if (!string.IsNullOrEmpty(tbSourceWad.Text)) @@ -1690,6 +1336,14 @@ namespace CustomizeMii CreationTimer.Start(); WadCreationInfo wadInfo = new WadCreationInfo(); + + if (!int.TryParse(tbStartupIos.Text, out wadInfo.requiredIos)) { ErrorBox("Please enter a valid Required IOS! (0 - 255)"); return; } + wadInfo.titles = new string[] { tbJapanese.Text, tbEnglish.Text, tbGerman.Text, tbFrench.Text, tbSpanish.Text, tbItalian.Text, tbDutch.Text, tbKorean.Text }; + wadInfo.allLangTitle = tbAllLanguages.Text; + wadInfo.titleId = tbTitleID.Text; + wadInfo.sound = tbSound.Text; + wadInfo.dol = tbDol.Text; + wadInfo.outFile = sfd.FileName; wadInfo.nandLoader = (WadCreationInfo.NandLoader)cmbNandLoader.SelectedIndex; @@ -1699,6 +1353,8 @@ namespace CustomizeMii bwCreateWad.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwCreateWad_RunWorkerCompleted); bwCreateWad.WorkerReportsProgress = true; bwCreateWad.RunWorkerAsync(wadInfo); + + return; } catch (Exception ex) { @@ -1709,6 +1365,10 @@ namespace CustomizeMii } } } + + currentProgress.progressValue = 100; + currentProgress.progressState = " "; + this.Invoke(ProgressUpdate); } } @@ -2052,7 +1712,7 @@ namespace CustomizeMii try { - string TplName = lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string TplName = lbxBannerTpls.SelectedItem.ToString().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); string CurBannerPath = GetCurBannerPath(); string[] brlytTpls = Wii.Brlyt.GetBrlytTpls(CurBannerPath + "blyt\\banner.brlyt", (File.Exists(CurBannerPath + "anim\\banner.brlan")) ? CurBannerPath + "anim\\banner.brlan" : CurBannerPath + "anim\\banner_loop.brlan"); @@ -2090,7 +1750,7 @@ namespace CustomizeMii try { - string TplName = lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string TplName = lbxIconTpls.SelectedItem.ToString().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); string CurIconPath = GetCurIconPath(); string[] brlytTpls = Wii.Brlyt.GetBrlytTpls(CurIconPath + "blyt\\icon.brlyt", CurIconPath + "anim\\icon.brlan"); @@ -2165,11 +1825,11 @@ namespace CustomizeMii { if (!lbxBannerTpls.SelectedItem.ToString().EndsWith("(Transparent)")) { - string thisItem = lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string thisItem = lbxBannerTpls.SelectedItem.ToString(); lbxBannerTpls.Items.Remove(lbxBannerTpls.SelectedItem); lbxBannerTpls.Items.Add(thisItem + " (Transparent)"); lbxBannerTpls.SelectedItem = thisItem + " (Transparent)"; - BannerTransparents.Add(thisItem); + BannerTransparents.Add(thisItem.Remove(thisItem.IndexOf('(', 0) - 1)); } } catch { } @@ -2178,11 +1838,11 @@ namespace CustomizeMii { try { - string thisItem = lbxBannerTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string thisItem = lbxBannerTpls.SelectedItem.ToString(); lbxBannerTpls.Items.Remove(lbxBannerTpls.SelectedItem); lbxBannerTpls.Items.Add(thisItem.Replace(" (Transparent)", string.Empty)); lbxBannerTpls.SelectedItem = thisItem.Replace(" (Transparent)", string.Empty); - BannerTransparents.Remove(thisItem.Replace(" (Transparent)", string.Empty)); + BannerTransparents.Remove(thisItem.Remove(thisItem.IndexOf('(', 0) - 1)); } catch { } } @@ -2201,11 +1861,11 @@ namespace CustomizeMii { if (!lbxIconTpls.SelectedItem.ToString().EndsWith("(Transparent)")) { - string thisItem = lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string thisItem = lbxIconTpls.SelectedItem.ToString(); lbxIconTpls.Items.Remove(lbxIconTpls.SelectedItem); lbxIconTpls.Items.Add(thisItem + " (Transparent)"); lbxIconTpls.SelectedItem = thisItem + " (Transparent)"; - IconTransparents.Add(thisItem); + IconTransparents.Add(thisItem.Remove(thisItem.IndexOf('(', 0) - 1)); } } catch { } @@ -2214,11 +1874,11 @@ namespace CustomizeMii { try { - string thisItem = lbxIconTpls.SelectedItem.ToString().Replace(" (Transparent)", string.Empty); + string thisItem = lbxIconTpls.SelectedItem.ToString(); lbxIconTpls.Items.Remove(lbxIconTpls.SelectedItem); lbxIconTpls.Items.Add(thisItem.Replace(" (Transparent)", string.Empty)); lbxIconTpls.SelectedItem = thisItem.Replace(" (Transparent)", string.Empty); - IconTransparents.Remove(thisItem.Replace(" (Transparent)", string.Empty)); + IconTransparents.Remove(thisItem.Remove(thisItem.IndexOf('(', 0) - 1)); } catch { } } @@ -2257,6 +1917,7 @@ namespace CustomizeMii private void cmForwarderItem_Click(object sender, EventArgs e) { +#if !Mono ToolStripMenuItem cmSender = sender as ToolStripMenuItem; if (cmSender == cmSimpleForwarder) @@ -2280,6 +1941,7 @@ namespace CustomizeMii ErrorBox(ex.Message); } } +#endif } private void btnOptionsExtract_Click(object sender, EventArgs e) @@ -2687,6 +2349,7 @@ namespace CustomizeMii tbJapanese.Text = tempText.Remove(startIndex, 7).Insert(startIndex, "チャンネル"); tbGerman.Text = tempText.Remove(startIndex, 7).Insert(startIndex, "Kanal"); tbDutch.Text = tempText.Remove(startIndex, 7).Insert(startIndex, "Kanaal"); + tbKorean.Text = tempText.Remove(startIndex, 7).Insert(startIndex, "채널"); try { @@ -2720,6 +2383,7 @@ namespace CustomizeMii tbSpanish.Text = string.Empty; tbItalian.Text = string.Empty; tbDutch.Text = string.Empty; + tbKorean.Text = string.Empty; ErrorBox(ex.Message); } @@ -2729,5 +2393,15 @@ namespace CustomizeMii { llbTranslateChannel.Enabled = tbAllLanguages.Text.ToLower().Contains("channel"); } + + private void tbStartupIos_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = !char.IsDigit(e.KeyChar) && e.KeyChar != '\b'; + } + + private void llbMultiReplace_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + MultiReplace(sender == llbBannerMultiReplace); + } } } diff --git a/CustomizeMii/CustomizeMii_Main.resx b/CustomizeMii/CustomizeMii_Main.resx index 4f291d3..2f855fe 100644 --- a/CustomizeMii/CustomizeMii_Main.resx +++ b/CustomizeMii/CustomizeMii_Main.resx @@ -122,6 +122,7 @@ Xuzz for his idea and hard work WiiCrazy / I.R.on for CustomizeMii Installer Xuzz, SquidMan, megazig, Matt_P, Omega and The Lemon Man for Wii.py +megazig for his BNS conversion code SquidMan for Zetsubou Andre Perrot for gbalzss comex and Waninkoko for both their NAND Loader diff --git a/CustomizeMii/CustomizeMii_Preview.cs b/CustomizeMii/CustomizeMii_Preview.cs index f5375ab..24d8422 100644 --- a/CustomizeMii/CustomizeMii_Preview.cs +++ b/CustomizeMii/CustomizeMii_Preview.cs @@ -150,6 +150,8 @@ namespace CustomizeMii images[0, cbBanner.SelectedIndex].tplFormat.ToLower() == "ci14x2") lbNoPreview.Visible = true; else lbNoPreview.Visible = false; + + cbIcon.SelectedIndex = -1; } } @@ -195,6 +197,8 @@ namespace CustomizeMii images[1, cbIcon.SelectedIndex].tplFormat.ToLower() == "ci14x2") lbNoPreview.Visible = true; else lbNoPreview.Visible = false; + + cbBanner.SelectedIndex = -1; } } diff --git a/CustomizeMii/CustomizeMii_PrivateFunctions.cs b/CustomizeMii/CustomizeMii_PrivateFunctions.cs index f9992a3..eca3af7 100644 --- a/CustomizeMii/CustomizeMii_PrivateFunctions.cs +++ b/CustomizeMii/CustomizeMii_PrivateFunctions.cs @@ -34,6 +34,328 @@ namespace CustomizeMii private delegate void SetLabelInvoker(string text, Label lb); private delegate void SetButtonInvoker(string text, Button btn); + private bool CheckUnpackFolder() + { + try + { + //Check Unpack Root + string[] RootFiles = Directory.GetFiles(TempUnpackPath); + string[] RootDirs = Directory.GetDirectories(TempUnpackPath); + + foreach (string thisFile in RootFiles) + { + if (!thisFile.ToLower().EndsWith(".app") && + !thisFile.ToLower().EndsWith(".cert") && + !thisFile.ToLower().EndsWith(".tik") && + !thisFile.ToLower().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.ToLower().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.ToLower().EndsWith("banner.bin") && + !thisFile.ToLower().EndsWith("icon.bin") && + !thisFile.ToLower().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.ToLower().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.ToLower().EndsWith("anim") && + !thisDir.ToLower().EndsWith("blyt") && + !thisDir.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().EndsWith("anim") && + !thisDir.ToLower().EndsWith("blyt") && + !thisDir.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().EndsWith("anim") && + !thisDir.ToLower().EndsWith("blyt") && + !thisDir.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().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.ToLower().EndsWith("anim") && + !thisDir.ToLower().EndsWith("blyt") && + !thisDir.ToLower().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.ToLower().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.ToLower().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.ToLower().EndsWith(".tpl")) + File.Delete(thisFile); + } + + foreach (string thisDir in TimgDirs) + Directory.Delete(thisDir, true); + } + + return true; + } + catch { return false; } + } + private bool FailureCheck() { try @@ -86,6 +408,17 @@ namespace CustomizeMii ErrorBox("Please enter a valid Title ID!"); return false; } + //Check Required IOS Box + int tmp; + if (!int.TryParse(tbStartupIos.Text, out tmp)) + { + ErrorBox("Please enter a valid Required IOS! (0 - 255)"); return false; + } + else if (tmp < 0 || tmp > 255) + { + ErrorBox("Please enter a valid Required IOS! (0 - 255)"); 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) @@ -108,8 +441,8 @@ namespace CustomizeMii //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)); + foreach (string thisTpl in lbxBannerTpls.Items) BannerTpls.Add(thisTpl.Remove(thisTpl.IndexOf('(', 0) - 1)); + foreach (string thisTpl in lbxIconTpls.Items) IconTpls.Add(thisTpl.Remove(thisTpl.IndexOf('(', 0) - 1)); string[] BannerBrlytPath; string[] BannerBrlanPath; @@ -477,9 +810,11 @@ namespace CustomizeMii for (int i = 0; i < tpls.Length; i++) { if (BannerTransparents.Contains(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1))) - lbxBannerTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1) + " (Transparent)"); + lbxBannerTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1) + + string.Format(" ({0} x {1})", Wii.TPL.GetTextureWidth(File.ReadAllBytes(tpls[i])), Wii.TPL.GetTextureHeight(File.ReadAllBytes(tpls[i]))) + " (Transparent)"); else - lbxBannerTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1)); + lbxBannerTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1) + + string.Format(" ({0} x {1})", Wii.TPL.GetTextureWidth(File.ReadAllBytes(tpls[i])), Wii.TPL.GetTextureHeight(File.ReadAllBytes(tpls[i])))); } } } @@ -494,9 +829,11 @@ namespace CustomizeMii for (int i = 0; i < tpls.Length; i++) { if (IconTransparents.Contains(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1))) - lbxIconTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1) + " (Transparent)"); + lbxIconTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1) + + string.Format(" ({0} x {1})", Wii.TPL.GetTextureWidth(File.ReadAllBytes(tpls[i])), Wii.TPL.GetTextureHeight(File.ReadAllBytes(tpls[i]))) + " (Transparent)"); else - lbxIconTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1)); + lbxIconTpls.Items.Add(tpls[i].Remove(0, tpls[i].LastIndexOf('\\') + 1) + + string.Format(" ({0} x {1})", Wii.TPL.GetTextureWidth(File.ReadAllBytes(tpls[i])), Wii.TPL.GetTextureHeight(File.ReadAllBytes(tpls[i])))); } } } @@ -641,7 +978,7 @@ namespace CustomizeMii { if (thisTpl.EndsWith("(Transparent)")) { - string Tpl = GetCurBannerPath() + "timg\\" + thisTpl.Replace(" (Transparent)", string.Empty); + string Tpl = GetCurBannerPath() + "timg\\" + thisTpl.Remove(thisTpl.IndexOf('(', 0) - 1); byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); int Width = Wii.TPL.GetTextureWidth(TplArray); int Height = Wii.TPL.GetTextureHeight(TplArray); @@ -658,7 +995,7 @@ namespace CustomizeMii { if (thisTpl.EndsWith("(Transparent)")) { - string Tpl = GetCurIconPath() + "timg\\" + thisTpl.Replace(" (Transparent)", string.Empty); + string Tpl = GetCurIconPath() + "timg\\" + thisTpl.Remove(thisTpl.IndexOf('(', 0) - 1); byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); int Width = Wii.TPL.GetTextureWidth(TplArray); int Height = Wii.TPL.GetTextureHeight(TplArray); @@ -751,7 +1088,7 @@ namespace CustomizeMii using (Image img = Image.FromFile(inputFile)) { Wii.TPL.ConvertToTPL(img, CurPath + "timg\\" + TplName, TplFormat); - lbx.Items.Add(TplName); + lbx.Items.Add(TplName + string.Format(" ({0} x {1})", img.Width, img.Height)); } } } @@ -952,5 +1289,59 @@ namespace CustomizeMii } } } + + private void MultiReplace(bool banner) + { + FolderBrowserDialog fbd = new FolderBrowserDialog(); + fbd.Description = "Please select the folder where the images are in.\nThe images must have the same filename as the TPLs!"; + + if (fbd.ShowDialog() == DialogResult.OK) + { + string imageDir = fbd.SelectedPath; + string tplDir = ((banner) ? GetCurBannerPath() : GetCurIconPath()) + "timg\\"; + string[] tpls = Directory.GetFiles(tplDir, "*.tpl"); + + List replacedTpls = new List(); + foreach (string thisTpl in tpls) + { + string image = string.Empty; + + if (File.Exists(imageDir + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".png")) + image = imageDir + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".png"; + else if (File.Exists(imageDir + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".jpg")) + image = imageDir + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".jpg"; + else if (File.Exists(imageDir + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".gif")) + image = imageDir + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".gif"; + else if (File.Exists(imageDir + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".bmp")) + image = imageDir + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".bmp"; + else continue; + + try + { + Image img = Image.FromFile(image); + byte[] temp = File.ReadAllBytes(thisTpl); + int width = Wii.TPL.GetTextureWidth(temp); + int height = Wii.TPL.GetTextureHeight(temp); + int format = Wii.TPL.GetTextureFormat(temp); + + if (img.Width != width || img.Height != height) + img = ResizeImage(img, width, height); + + File.Delete(thisTpl); + Wii.TPL.ConvertToTPL(img, thisTpl, format); + + replacedTpls.Add(Path.GetFileName(thisTpl)); + } + catch { } + } + + if (replacedTpls.Count > 0) + { + string replaced = string.Join("\n", replacedTpls.ToArray()); + InfoBox(string.Format("The following TPLs were successfully replaced:\n\n{0}", replaced)); + } + else ErrorBox("No TPLs were replaced, did you name the images right?"); + } + } } } diff --git a/CustomizeMii/CustomizeMii_Structs.cs b/CustomizeMii/CustomizeMii_Structs.cs index c817149..13b05cb 100644 --- a/CustomizeMii/CustomizeMii_Structs.cs +++ b/CustomizeMii/CustomizeMii_Structs.cs @@ -60,6 +60,12 @@ namespace CustomizeMii Waninkoko = 1 } + public string titleId; + public string[] titles; + public string allLangTitle; + public int requiredIos; + public string sound; + public string dol; public string outFile; public NandLoader nandLoader; public bool sendToWii; diff --git a/CustomizeMii/CustomizeMii_Transmit.Designer.cs b/CustomizeMii/CustomizeMii_Transmit.Designer.cs index 2ef0dde..00bb024 100644 --- a/CustomizeMii/CustomizeMii_Transmit.Designer.cs +++ b/CustomizeMii/CustomizeMii_Transmit.Designer.cs @@ -135,6 +135,7 @@ namespace CustomizeMii this.AcceptButton = this.btnTransmit; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; this.CancelButton = this.btnCancel; this.ClientSize = new System.Drawing.Size(273, 145); this.Controls.Add(this.btnCancel); diff --git a/CustomizeMii/Properties/AssemblyInfo.cs b/CustomizeMii/Properties/AssemblyInfo.cs index 753fac6..e66282e 100644 --- a/CustomizeMii/Properties/AssemblyInfo.cs +++ b/CustomizeMii/Properties/AssemblyInfo.cs @@ -50,6 +50,6 @@ 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("2.2.0.0")] -[assembly: AssemblyFileVersion("2.2.0.0")] +[assembly: AssemblyVersion("2.3.0.0")] +[assembly: AssemblyFileVersion("2.3.0.0")] [assembly: NeutralResourcesLanguageAttribute("en")] diff --git a/CustomizeMii/Readme.txt b/CustomizeMii/Readme.txt index 75e0965..c6f98a1 100644 --- a/CustomizeMii/Readme.txt +++ b/CustomizeMii/Readme.txt @@ -9,6 +9,13 @@ Thanks to icefire / Xuzz for the basic idea of this Application! ----------------------------------------------------------------------------------------- Changelog: +Version 2.3 + - Fixed bug when extracting icon images + - Added ability to change the startup IOS (IOS used to launch the title) + - Added support for Korean channel title (reading and writing) + - Added TPL width and height to Banner and Icon list + - Added ability to replace multiple TPLs at once (images must have the same filename!) + Version 2.2 - Fixed some bugs with the preview window - Fixed Complex Forwarder in combination with Waninkoko's NAND Loader @@ -89,11 +96,12 @@ Thanks: Xuzz for his idea and hard work WiiCrazy / I.R.on for CustomizeMii Installer Xuzz, SquidMan, megazig, Matt_P, Omega and The Lemon Man for Wii.py +megazig for his BNS conversion code SquidMan for Zetsubou Andre Perrot for gbalzss comex and Waninkoko for both their NAND Loader -djdynamite123 for the forwarder base files (ForwardMii-Plugin) -The USB Loader GX Team for their forwarder source (ForwardMii-Plugin) +djdynamite123 for the forwarder base files +The USB Loader GX Team for their forwarder source ----------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------- diff --git a/CustomizeMii/Wii.cs b/CustomizeMii/Wii.cs index 01d9930..729454d 100644 --- a/CustomizeMii/Wii.cs +++ b/CustomizeMii/Wii.cs @@ -583,6 +583,14 @@ namespace Wii 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("MIOS")) + { + return "MIOS"; + } + else if (channeltype.Contains("BC")) + { + return "BC"; + } 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")); @@ -665,7 +673,7 @@ namespace Wii { if (!channeltype.Contains("Hidden")) { - string[] titles = new string[7]; + string[] titles = new string[8]; string[,] conts = GetContentInfo(wadfile); byte[] titlekey = GetTitleKey(wadfile); @@ -713,6 +721,15 @@ namespace Wii count++; } + for (int i = jappos + (9 * 84); i < (jappos + (9 * 84)) + 40; i += 2) + { + if (contenthandle[i] != 0x00) + { + char temp = BitConverter.ToChar(new byte[] { contenthandle[i], contenthandle[i - 1] }, 0); + titles[count] += temp; + } + } + return titles; } else @@ -727,17 +744,17 @@ namespace Wii } } - for (int i = 1; i < 7; i++) + for (int i = 1; i < 8; i++) titles[i] = titles[0]; return titles; } } - else return new string[7]; + else return new string[8]; } - else return new string[7]; + else return new string[8]; } - else return new string[7]; + else return new string[8]; } /// @@ -760,7 +777,7 @@ namespace Wii /// public static string[] GetChannelTitlesFromApp(byte[] app) { - string[] titles = new string[7]; + string[] titles = new string[8]; int imetpos = 0; int length = 400; @@ -797,6 +814,15 @@ namespace Wii count++; } + + for (int i = jappos + (9 * 84); i < (jappos + (9 * 84)) + 40; i += 2) + { + if (app[i] != 0x00) + { + char temp = BitConverter.ToChar(new byte[] { app[i], app[i - 1] }, 0); + titles[count] += temp; + } + } } return titles; @@ -1418,12 +1444,13 @@ namespace Wii /// public static byte[] ChangeChannelTitle(byte[] wadfile, string title) { - return ChangeChannelTitle(wadfile, title, title, title, title, title, title, title); + return ChangeChannelTitle(wadfile, title, title, title, title, title, title, title, title); } /// - /// Changes the Channel Title of the wad file - /// Each language has a specific title + /// Changes the Channel Title of the wad file. + /// Each language has a specific title. + /// 0 = Japanese, 1 = English, 2 = German, 3 = French, 4 = Spanish, 5 = Italian, 6 = Dutch, 7 = Korean /// /// /// @@ -1433,10 +1460,10 @@ namespace Wii /// /// /// - public static void ChangeChannelTitle(string wadfile, string jap, string eng, string ger, string fra, string spa, string ita, string dut) + public static void ChangeChannelTitle(string wadfile, params string[] titles) { byte[] wadarray = Tools.LoadFileToByteArray(wadfile); - wadarray = ChangeChannelTitle(wadarray, jap, eng, ger, fra, spa, ita, dut); + wadarray = ChangeChannelTitle(wadarray, titles[0], titles[1], titles[2], titles[3], titles[4], titles[5], titles[6], (titles.Length > 7) ? titles[8] : ""); using (FileStream fs = new FileStream(wadfile, FileMode.Open, FileAccess.Write)) { @@ -1446,29 +1473,27 @@ namespace Wii } /// - /// Changes the Channel Title of the wad file - /// Each language has a specific title + /// Changes the Channel Title of the wad file. + /// Each language has a specific title. + /// 0 = Japanese, 1 = English, 2 = German, 3 = French, 4 = Spanish, 5 = Italian, 6 = Dutch, 7 = Korean /// /// - /// 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) + public static byte[] ChangeChannelTitle(byte[] wadfile, params string[] titles) { + if (titles.Length < 7) throw new Exception("A title must be given for each language!"); + 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(); + char[] japchars = titles[0].ToCharArray(); + char[] engchars = titles[1].ToCharArray(); + char[] gerchars = titles[2].ToCharArray(); + char[] frachars = titles[3].ToCharArray(); + char[] spachars = titles[4].ToCharArray(); + char[] itachars = titles[5].ToCharArray(); + char[] dutchars = titles[6].ToCharArray(); + char[] korchars = new char[] { }; + if (titles.Length > 7) korchars = titles[7].ToCharArray(); byte[] titlekey = WadInfo.GetTitleKey(wadfile); string[,] conts = WadInfo.GetContentInfo(wadfile); @@ -1557,6 +1582,12 @@ namespace Wii contenthandle[x + 29 + 84 * 6 - 1] = BitConverter.GetBytes(dutchars[count])[1]; } else { contenthandle[x + 29 + 84 * 6] = 0x00; contenthandle[x + 29 + 84 * 6 - 1] = 0x00; } + if (korchars.Length > count) + { + contenthandle[x + 29 + 84 * 9] = BitConverter.GetBytes(korchars[count])[0]; + contenthandle[x + 29 + 84 * 9 - 1] = BitConverter.GetBytes(korchars[count])[1]; + } + else { contenthandle[x + 29 + 84 * 9] = 0x00; contenthandle[x + 29 + 84 * 9 - 1] = 0x00; } count++; } @@ -1576,6 +1607,7 @@ namespace Wii wadfile[contentpos + y] = contenthandle[y]; } + Tools.ChangeProgress(80); //SHA1 in TMD byte[] tmd = Tools.GetPartOfByteArray(wadfile, tmdpos, tmdsize); for (int i = 0; i < 20; i++) @@ -1583,55 +1615,6 @@ namespace Wii 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; } @@ -1797,8 +1780,8 @@ namespace Wii 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[] position = new int[2] { 0x1f2, 0x1d4 }; + int[] tosign = new int[2] { 0x140, 0x140 }; int tiktmdpos = 0; int tiktmdsize = wadtiktmd.Length; @@ -2338,6 +2321,34 @@ namespace Wii return decryptedkey; } + + /// + /// Changes the IOS flag (IOS used to launch the title) + /// + /// + /// + public static void ChangeIosFlag(string wadtmd, int newIos) + { + if (newIos < 0 || newIos > 255) throw new Exception("IOS must be between 0 and 255!"); + + Tools.SaveFileFromByteArray(ChangeIosFlag(Tools.LoadFileToByteArray(wadtmd), newIos), wadtmd); + } + + /// + /// Changes the IOS flag (IOS used to launch the title) + /// + /// + /// + public static byte[] ChangeIosFlag(byte[] wadtmd, int newIos) + { + if (newIos < 0 || newIos > 255) throw new Exception("IOS must be between 0 and 255!"); + + int tmdpos = 0; + if (WadInfo.IsThisWad(wadtmd)) tmdpos = WadInfo.GetTmdPos(wadtmd); + + wadtmd[tmdpos + 395] = (byte)newIos; + return wadtmd; + } } public class WadUnpack @@ -2864,7 +2875,7 @@ namespace Wii //Write Footer Timestamp byte[] footer = Tools.GetTimestamp(); - Array.Resize(ref footer, Tools.AddPadding(footer.Length, 16)); + Array.Resize(ref footer, Tools.AddPadding(footer.Length)); int footerLength = footer.Length; wadstream.Seek(Tools.AddPadding(contpos), SeekOrigin.Begin); @@ -3244,6 +3255,7 @@ namespace Wii byte[] spatitle = new byte[84]; byte[] itatitle = new byte[84]; byte[] duttitle = new byte[84]; + byte[] kortitle = new byte[84]; for (int i = 0; i < 20; i++) { @@ -3282,6 +3294,14 @@ namespace Wii duttitle[i * 2] = BitConverter.GetBytes(channeltitles[6][i])[1]; duttitle[i * 2 + 1] = BitConverter.GetBytes(channeltitles[6][i])[0]; } + if (channeltitles.Length > 7) + { + if (channeltitles[7].Length > i) + { + kortitle[i * 2] = BitConverter.GetBytes(channeltitles[7][i])[1]; + kortitle[i * 2 + 1] = BitConverter.GetBytes(channeltitles[7][i])[0]; + } + } } byte[] crypto = new byte[16]; @@ -3302,7 +3322,10 @@ namespace Wii ms.Write(itatitle, 0, itatitle.Length); ms.Write(duttitle, 0, duttitle.Length); - ms.Seek(0x348, SeekOrigin.Current); + ms.Seek(0x390, SeekOrigin.Begin); + ms.Write(kortitle, 0, kortitle.Length); + + ms.Seek(0x630, SeekOrigin.Begin); ms.Write(crypto, 0, crypto.Length); byte[] tohash = ms.ToArray();