/* 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 . */ //#define Mono //Change all "\\" to "/" (in all files; without quotes) while compiling for OS X / Linux (Mono) //#define Debug //Always remember to turn off :) using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.IO; using System.Net; using System.Windows.Forms; using ForwardMii; namespace CustomizeMii { public partial class CustomizeMii_Main : Form { #region Constants 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 const int CreditsScrollSpeed = 75; //Timer Intervall for the scrolling Credits #endregion #region Variables public static bool Mono = false; public static string TempPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\"; public static string TempWadPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\TempWad.wad"; public static string TempUnpackPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Unpack\\"; public static string TempBannerPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Banner\\"; public static string TempIconPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Icon\\"; public static string TempSoundPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\sound.bin"; public static string TempWavePath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Temp.wav"; public static string TempBnsPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Temp.bns"; public static string TempDolPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Temp.dol"; public static string TempTempPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Temp\\"; public static string TempUnpackBannerTplPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Unpack\\00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\timg\\"; public static string TempUnpackIconTplPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Unpack\\00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\timg\\"; public static string TempUnpackBannerBrlytPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Unpack\\00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\blyt\\"; public static string TempUnpackIconBrlytPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Unpack\\00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\blyt\\"; public static string TempUnpackBannerBrlanPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Unpack\\00000000.app_OUT\\meta\\banner.bin_OUT\\arc\\anim\\"; public static string TempUnpackIconBrlanPath = Path.GetTempPath() + "CustomizeMii_Temp\\XXX\\Unpack\\00000000.app_OUT\\meta\\icon.bin_OUT\\arc\\anim\\"; //public static 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!", "_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_", "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(), string.Format("My name is {0}", Environment.UserName) }; public static string[] SourceWadUrls = new string[] { "StaticBase.wad", "MPlayer_CE_Short.wad", "MPlayer_CE_Long.wad", "Snes9xGX.wad", "FCE_Ultra_wilsoff.wad", "FCE_Ultra_Leathl.wad", "Wii64.wad", "WiiSX_Full.wad", "WiiSX_Retro.wad", "WADder_Base_1.wad", "WADder_Base_2.wad", "WADder_Base_3.wad", "UniiLoader.wad", "Backup_Channel.wad" }; public static string[] SourceWadPreviewUrls = new string[] { "http://www.youtube.com/watch?v=pFNKldTYQq0", "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" }; public static string BannerReplace = string.Empty; public static string IconReplace = string.Empty; public static string BannerTplPath = string.Empty; public static 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 SoundReplace = string.Empty; private bool BrlytChanged = false; private bool BrlanChanged = false; private Progress currentProgress; private EventHandler ProgressUpdate; private int UnpackFolderErrorCount = 0; private List BannerTransparents = new List(); private List IconTransparents = new List(); private string Mp3Path; private double separatorBtn; private Timer tmrCredits = new Timer(); private ToolTip tTip = new ToolTip(); #endregion public CustomizeMii_Main() { InitializeComponent(); this.Icon = global::CustomizeMii.Properties.Resources.CustomizeMii; } private void CustomizeMii_Main_Load(object sender, EventArgs e) { #if !Mono this.Text = this.Text.Replace("X", version); this.lbCreditVersion.Text = this.lbCreditVersion.Text.Replace("X", version); CommonKeyCheck(); #endif #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) { llbUpdateAvailable.Text = llbUpdateAvailable.Text.Replace("X", NewVersion); llbUpdateAvailable.Visible = true; if (MessageBox.Show("Version " + NewVersion + " is available.\nDo you want the download page to be opened?", "Update available", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) { Process.Start("http://code.google.com/p/customizemii/downloads/list"); } } } catch { } } } private string GetInstallerVersion() { return CustomizeMiiInstaller.CustomizeMiiInstaller_Plugin.GetVersion(); } #if !Mono private string GetForwardMiiVersion() { return ForwardMii_Plugin.GetVersion(); } #endif 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 (btnBrowseSource.Text.ToLower() == "clear") { Initialize(null, null); } else LoadChannel(); } private void btnLoadBaseWad_Click(object sender, EventArgs e) { if (lbxBaseWads.SelectedIndex != -1) { if (pbProgress.Value == 100) { if (CheckInet() == true) { #if Mono CommonKeyCheck(); #endif if (tbSourceWad.Text != SourceWadUrls[lbxBaseWads.SelectedIndex]) { SourceWad = "http://customizemii.googlecode.com/svn/branches/Base_WADs/" + SourceWadUrls[lbxBaseWads.SelectedIndex]; tbSourceWad.Text = SourceWad; System.Threading.Thread dlThread = new System.Threading.Thread(new System.Threading.ThreadStart(DownloadBaseWad)); dlThread.Start(); } } else { ErrorBox("You're not connected to the Internet!"); } } } } void DownloadBaseWad() { try { WebClient Client = new WebClient(); Client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Client_DownloadProgressChanged); Client.DownloadFileCompleted += new AsyncCompletedEventHandler(Client_DownloadFileCompleted); currentProgress.progressState = "Downloading Base WAD..."; currentProgress.progressValue= 0; this.Invoke(ProgressUpdate); if (!Directory.Exists(TempWadPath.Remove(TempWadPath.LastIndexOf('\\')))) Directory.CreateDirectory(TempWadPath.Remove(TempWadPath.LastIndexOf('\\'))); Client.DownloadFileAsync(new Uri(SourceWad), TempWadPath); } catch (Exception ex) { SetText(tbSourceWad, string.Empty); ErrorBox(ex.Message); } } void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { currentProgress.progressValue = e.ProgressPercentage; currentProgress.progressState = "Downloading Base WAD..."; this.Invoke(ProgressUpdate); } void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) { currentProgress.progressValue = 0; currentProgress.progressState = string.Empty; this.Invoke(ProgressUpdate); if (File.Exists(TempWadPath)) { FileInfo fi = new FileInfo(TempWadPath); if (fi.Length > 0) { 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); } else { SetText(tbSourceWad, string.Empty); File.Delete(TempWadPath); ErrorBox("The requested file couldn't be downloaded."); } } } 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 available, 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 = "http://customizemii.googlecode.com/svn/branches/Base_WADs/" + 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) { if (tbSourceWad.Text == Url && File.Exists(TempWadPath)) { File.Copy(TempWadPath, sfd.FileName, true); InfoBox(string.Format("Saved channel as {0}", Path.GetFileName(sfd.FileName))); } else { System.Threading.Thread saveThread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(SaveBaseWad)); saveThread.Start((object) new string[] { Url, sfd.FileName }); } } } } else { ErrorBox("You're not connected to the Internet!"); } } } void SaveBaseWad(object urlAndSavePath) { try { WebClient SaveClient = new WebClient(); SaveClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(SaveClient_DownloadProgressChanged); SaveClient.DownloadFileCompleted += new AsyncCompletedEventHandler(SaveClient_DownloadFileCompleted); currentProgress.progressValue = 0; currentProgress.progressState = "Downloading Base WAD..."; this.Invoke(ProgressUpdate); SaveClient.DownloadFileAsync(new Uri(((string[])urlAndSavePath)[0]), ((string[])urlAndSavePath)[1]); } catch (Exception ex) { ErrorBox(ex.Message); } } void SaveClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { currentProgress.progressValue = e.ProgressPercentage; currentProgress.progressState = "Downloading Base WAD..."; this.Invoke(ProgressUpdate); } void SaveClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) { currentProgress.progressValue = 100; currentProgress.progressState = " "; this.Invoke(ProgressUpdate); } 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 tbReplace_TextChanged(object sender, EventArgs e) { if (string.IsNullOrEmpty(tbReplace.Text)) { btnBrowseReplace.Text = "Browse..."; 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..."); } else { btnBrowseReplace.Text = "Clear"; tTip.SetToolTip(btnBrowseReplace, "Clear the replaced Banner / Icon / Sound and use the one within the Base WAD..."); } } private void btnBrowseReplace_Click(object sender, EventArgs e) { if (btnBrowseReplace.Text == "Clear") { 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); } } else { ReplacePart(); } } private void btnBrowseDol_Click(object sender, EventArgs e) { if (btnBrowseDol.Text == "Clear") { if (Directory.Exists(TempTempPath + "TempWad")) Directory.Delete(TempTempPath + "TempWad", true); if (File.Exists(TempDolPath)) File.Delete(TempDolPath); SetText(tbDol, string.Empty); btnBrowseDol.Text = "Browse..."; SimpleForwarder.Clear(); ComplexForwarder.Clear(); } else { cmDol.Show(MousePosition); } } private void btnBrowseSound_Click(object sender, EventArgs e) { if (btnBrowseSound.Text == "Clear") { if (File.Exists(TempWavePath)) File.Delete(TempWavePath); if (File.Exists(TempBnsPath)) File.Delete(TempBnsPath); SetText(tbSound, string.Empty); btnBrowseSound.Text = "Browse..."; } else cmSound.Show(MousePosition); } 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().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); 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 8: cmbFormatBanner.SelectedIndex = 7; break; case 9: cmbFormatBanner.SelectedIndex = 8; break; case 10: cmbFormatBanner.SelectedIndex = 9; break; case 14: cmbFormatBanner.SelectedIndex = 10; 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().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); 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 8: cmbFormatBanner.SelectedIndex = 7; break; case 9: cmbFormatBanner.SelectedIndex = 8; break; case 10: cmbFormatBanner.SelectedIndex = 9; break; case 14: cmbFormatBanner.SelectedIndex = 10; 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 < 7) { 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().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); Image Img; if (!ofd.FileName.ToLower().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 6: //I4 TplFormat = 0; break; case 5: //I8 TplFormat = 1; break; case 4: //IA4 TplFormat = 2; break; case 3: //IA8 TplFormat = 3; break; 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 a different one!"); } } } private void btnExtractBanner_Click(object sender, EventArgs e) { if (lbxBannerTpls.SelectedIndex != -1) { 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; } 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; sfd.FileName = lbxBannerTpls.SelectedItem.ToString().Replace(".tpl", string.Empty); if (sfd.ShowDialog() == DialogResult.OK) { try { if (!sfd.FileName.ToLower().EndsWith(".tpl")) { 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 { 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 { CustomizeMii_Preview pvw = new CustomizeMii_Preview(); pvw.startTPL = lbxBannerTpls.SelectedItem.ToString().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); pvw.ShowDialog(); pvw = null; } catch (Exception ex) { ErrorBox(ex.Message); } lbxBannerTpls.Focus(); } } private void btnReplaceIcon_Click(object sender, EventArgs e) { if (lbxIconTpls.SelectedIndex != -1) { int Format = cmbFormatIcon.SelectedIndex; if (Format < 7) { 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().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); byte[] TplArray = Wii.Tools.LoadFileToByteArray(Tpl); Image Img; if (!ofd.FileName.ToLower().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 6: //I4 TplFormat = 0; break; case 5: //I8 TplFormat = 1; break; case 4: //IA4 TplFormat = 2; break; case 3: //IA8 TplFormat = 3; break; 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 a different one!"); } } } private void btnExtractIcon_Click(object sender, EventArgs e) { if (lbxIconTpls.SelectedIndex != -1) { 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; } 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; sfd.FileName = lbxIconTpls.SelectedItem.ToString().Replace(".tpl", string.Empty); if (sfd.ShowDialog() == DialogResult.OK) { try { if (!sfd.FileName.ToLower().EndsWith(".tpl")) { 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 { 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 { CustomizeMii_Preview pvw = new CustomizeMii_Preview(); pvw.startIcon = true; pvw.startTPL = lbxIconTpls.SelectedItem.ToString().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 1); pvw.ShowDialog(); pvw = null; } catch (Exception ex) { ErrorBox(ex.Message); } lbxIconTpls.Focus(); } } 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)) { if (!File.Exists(Application.StartupPath + "\\CustomizeMiiInstaller.dll")) { ErrorBox("CustomizeMiiInstaller.dll wasn't found!"); } else { if (cbFailureChecks.Checked == true || FailureCheck() == true) { CustomizeMii_Transmit cmt = new CustomizeMii_Transmit(); if (cmt.ShowDialog() == DialogResult.OK) { try { WadCreationInfo wadInfo = new WadCreationInfo(); wadInfo.outFile = TempPath + "SendToWii.wad"; wadInfo.nandLoader = (WadCreationInfo.NandLoader)cmbNandLoader.SelectedIndex; wadInfo.sendToWii = true; wadInfo.transmitProtocol = (TransmitProtocol)cmt.Protocol; wadInfo.transmitIp = cmt.IPAddress; wadInfo.transmitIos = int.Parse(cmt.IOS); 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(wadInfo); } catch (Exception ex) { ErrorBox(ex.Message); } } } } } } } else { //CREATE WAD if (pbProgress.Value == 100) { if (!string.IsNullOrEmpty(tbSourceWad.Text)) { if (cbFailureChecks.Checked == true || 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(); 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; 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(wadInfo); return; } catch (Exception ex) { CreationTimer.Stop(); ErrorBox(ex.Message); } } } } } currentProgress.progressValue = 100; currentProgress.progressState = " "; this.Invoke(ProgressUpdate); } } 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 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), true); else File.Copy(ofd.FileName, BannerBrlanPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1), true); 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), true); else File.Copy(ofd.FileName, IconBrlanPath + ofd.FileName.Remove(0, ofd.FileName.LastIndexOf('\\') + 1), true); 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, true); } 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, true); } catch (Exception ex) { ErrorBox(ex.Message); } } } } 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(), true); BrlytChanged = true; } else { File.Delete(BannerBrlytPath + lbxBrlytBanner.SelectedItem.ToString()); File.Copy(ofd.FileName, BannerBrlytPath + lbxBrlytBanner.SelectedItem.ToString(), true); BrlytChanged = true; } } else { if (string.IsNullOrEmpty(IconReplace)) { File.Delete(TempUnpackIconBrlytPath + lbxBrlytIcon.SelectedItem.ToString()); File.Copy(ofd.FileName, TempUnpackIconBrlytPath + lbxBrlytIcon.SelectedItem.ToString(), true); BrlytChanged = true; } else { File.Delete(IconBrlytPath + lbxBrlytIcon.SelectedItem.ToString()); File.Copy(ofd.FileName, IconBrlytPath + lbxBrlytIcon.SelectedItem.ToString(), true); 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(), true); BrlanChanged = true; } else { File.Delete(BannerBrlanPath + lbxBrlanBanner.SelectedItem.ToString()); File.Copy(ofd.FileName, BannerBrlanPath + lbxBrlanBanner.SelectedItem.ToString(), true); BrlanChanged = true; } } else { if (string.IsNullOrEmpty(IconReplace)) { File.Delete(TempUnpackIconBrlanPath + lbxBrlanIcon.SelectedItem.ToString()); File.Copy(ofd.FileName, TempUnpackIconBrlanPath + lbxBrlanIcon.SelectedItem.ToString(), true); BrlanChanged = true; } else { File.Delete(IconBrlanPath + lbxBrlanIcon.SelectedItem.ToString()); File.Copy(ofd.FileName, IconBrlanPath + lbxBrlanIcon.SelectedItem.ToString(), true); BrlanChanged = true; } } } catch (Exception ex) { ErrorBox(ex.Message); } } } } private void llbUpdateAvailable_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { try { llbUpdateAvailable.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) { if (lbxBannerTpls.SelectedIndex != -1) { int idx = lbxBannerTpls.SelectedIndex; try { 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"); if (!Wii.Tools.StringExistsInStringArray(TplName, brlytTpls) || cbFailureChecks.Checked) { 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); } for (; ; ) { try { lbxBannerTpls.SelectedIndex = idx; break; } catch { idx--; } } } lbxBannerTpls.Select(); } private void btnDeleteIcon_Click(object sender, EventArgs e) { if (lbxIconTpls.SelectedIndex != -1) { int idx = lbxIconTpls.SelectedIndex; try { 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"); if (!Wii.Tools.StringExistsInStringArray(TplName, brlytTpls) || cbFailureChecks.Checked) { 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); } for (; ; ) { try { lbxIconTpls.SelectedIndex = idx; break; } catch { idx--; } } } lbxIconTpls.Select(); } private void btnAddBanner_Click(object sender, EventArgs e) { try { AddTpl(lbxBannerTpls); } catch (Exception ex) { ErrorBox(ex.Message); } } private void btnAddIcon_Click(object sender, EventArgs e) { try { AddTpl(lbxIconTpls); } 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", (File.Exists(CurBannerPath + "anim\\banner.brlan")) ? CurBannerPath + "anim\\banner.brlan" : CurBannerPath + "anim\\banner_loop.brlan"); 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", CurIconPath + "anim\\icon.brlan"); 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(); lbxBannerTpls.Items.Remove(lbxBannerTpls.SelectedItem); lbxBannerTpls.Items.Add(thisItem + " (Transparent)"); lbxBannerTpls.SelectedItem = thisItem + " (Transparent)"; BannerTransparents.Add(thisItem.Remove(thisItem.IndexOf('(', 0) - 1)); } } catch { } } else { try { 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.Remove(thisItem.IndexOf('(', 0) - 1)); } catch { } } lbxBannerTpls.Focus(); } } 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(); lbxIconTpls.Items.Remove(lbxIconTpls.SelectedItem); lbxIconTpls.Items.Add(thisItem + " (Transparent)"); lbxIconTpls.SelectedItem = thisItem + " (Transparent)"; IconTransparents.Add(thisItem.Remove(thisItem.IndexOf('(', 0) - 1)); } } catch { } } else { try { 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.Remove(thisItem.IndexOf('(', 0) - 1)); } catch { } } lbxIconTpls.Focus(); } } private void btnForwarder_Click(object sender, EventArgs e) { #if Mono ErrorBox("This feature doesn't work under Mono!"); #endif #if !Mono if (CheckForForwardMii() == true) { if (CheckDevKit() == false) { ForwarderDialogSimple(); } else { cmForwarder.Show(MousePosition); } } else { if (MessageBox.Show("You don't have the ForwardMii.dll in your application folder.\nYou can download it on the project page, do you want the page to be opened?", "Plugin not available", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) { Process.Start("http://code.google.com/p/customizemii/downloads/list"); } } #endif } private void cmForwarderItem_Click(object sender, EventArgs e) { #if !Mono ToolStripMenuItem cmSender = sender as ToolStripMenuItem; if (cmSender == cmSimpleForwarder) ForwarderDialogSimple(); else { try { string CurrentVersion = GetForwardMiiVersion(); int cVersion = Convert.ToInt32(CurrentVersion.Replace(".", string.Empty).Length == 2 ? (CurrentVersion.Replace(".", string.Empty) + "0") : CurrentVersion.Replace(".", string.Empty)); if (cVersion < 110) { ErrorBox("Version 1.1 or higher of the ForwardMii.dll is required!"); return; } ForwarderDialogComplex(); } catch (Exception ex) { ErrorBox(ex.Message); } } #endif } private void btnOptionsExtract_Click(object sender, EventArgs e) { cmOptionsExtract.Show(MousePosition); } private void cmOptionsExtract_MouseClick(object sender, EventArgs e) { ToolStripMenuItem cmSender = sender as ToolStripMenuItem; if (cmSender.OwnerItem == tsExtractImages) { try { FolderBrowserDialog fbd = new FolderBrowserDialog(); if (cmSender.Text.ToLower() == "both") { fbd.Description = "Select the path where the images will be extracted to. Two folders \"Banner\" and \"Icon\" will be created."; } else { fbd.Description = "Select the path where the images will be extracted to."; } if (fbd.ShowDialog() == DialogResult.OK) { string bannerPath; string iconPath; switch (cmSender.Text.ToLower()) { case "banner": bannerPath = fbd.SelectedPath; iconPath = string.Empty; break; case "icon": bannerPath = string.Empty; iconPath = fbd.SelectedPath; break; default: //both bannerPath = fbd.SelectedPath + "\\Banner"; iconPath = fbd.SelectedPath + "\\Icon"; break; } if (!string.IsNullOrEmpty(bannerPath)) { if (!Directory.Exists(bannerPath)) Directory.CreateDirectory(bannerPath); string[] tplFiles = Directory.GetFiles(BannerTplPath, "*.tpl"); Image img; foreach (string thisTpl in tplFiles) { img = Wii.TPL.ConvertFromTPL(thisTpl); img.Save(bannerPath + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".png", System.Drawing.Imaging.ImageFormat.Png); } } if (!string.IsNullOrEmpty(iconPath)) { if (!Directory.Exists(iconPath)) Directory.CreateDirectory(iconPath); string[] tplFiles = Directory.GetFiles(IconTplPath, "*.tpl"); Image img; foreach (string thisTpl in tplFiles) { img = Wii.TPL.ConvertFromTPL(thisTpl); img.Save(iconPath + "\\" + Path.GetFileNameWithoutExtension(thisTpl) + ".png", System.Drawing.Imaging.ImageFormat.Png); } } InfoBox("Extracted images successfully!"); } } catch (Exception ex) { ErrorBox(ex.Message); } } else if (cmSender.OwnerItem == tsExtractSound) { try { SaveFileDialog sfd = new SaveFileDialog(); if (cmSender.Name.ToLower() == "cmextractsoundasbin") { sfd.Filter = "BIN|*.bin"; sfd.FileName = "sound.bin"; } else if (cmSender.Name.ToLower() == "cmextractsoundasaudio") { byte[] soundBin = Wii.Tools.LoadFileToByteArray(TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", 32, 16); if (soundBin[0] == 'R' && soundBin[1] == 'I' && soundBin[2] == 'F' && soundBin[3] == 'F') { sfd.Filter = "Wave|*.wav"; sfd.FileName = "sound.wav"; } else if (soundBin[0] == 'B' && soundBin[1] == 'N' && soundBin[2] == 'S' && soundBin[3] == ' ') { sfd.Filter = "BNS|*.bns"; sfd.FileName = "sound.bns"; } else if (soundBin[0] == 'F' && soundBin[1] == 'O' && soundBin[2] == 'R' && soundBin[3] == 'M') { sfd.Filter = "AIFF|*.aif;*.aiff"; sfd.FileName = "sound.aif"; } else if (soundBin[0] == 'L' && soundBin[1] == 'Z' && soundBin[2] == '7' && soundBin[3] == '7') { if (soundBin[9] == 'R' && soundBin[10] == 'I' && soundBin[11] == 'F' && soundBin[12] == 'F') { sfd.Filter = "Wave|*.wav"; sfd.FileName = "sound.wav"; } else if (soundBin[9] == 'B' && soundBin[10] == 'N' && soundBin[11] == 'S' && soundBin[12] == ' ') { sfd.Filter = "BNS|*.bns"; sfd.FileName = "sound.bns"; } else if (soundBin[9] == 'F' && soundBin[10] == 'O' && soundBin[11] == 'R' && soundBin[12] == 'M') { sfd.Filter = "AIFF|*.aif;*.aiff"; sfd.FileName = "sound.aif"; } else throw new Exception("Unsupported Audio Format!"); } else throw new Exception("Unsupported Audio Format!"); } if (sfd.ShowDialog() == DialogResult.OK) { if (sfd.FileName.ToLower().EndsWith(".bin")) { File.Copy(TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", sfd.FileName, true); InfoBox("The sound.bin was successfully extraced!"); } else { Wii.Sound.SoundBinToAudio(TempUnpackPath + "00000000.app_OUT\\meta\\sound.bin", sfd.FileName); InfoBox(string.Format("The sound.bin was successfully converted to {0}!", Path.GetFileName(sfd.FileName))); } } } catch (Exception ex) { ErrorBox(ex.Message); } } else if (cmSender.OwnerItem == tsExtractBrl) { try { FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd.Description = "Select the path where the files will be extracted to."; if (fbd.ShowDialog() == DialogResult.OK) { if (cmSender == cmExtractBrlyt || cmSender == cmExtractBothBrl) { //Extract brlyts string[] bannerFiles = Directory.GetFiles(GetCurBannerPath() + "blyt", "*.brlyt"); string[] iconFiles = Directory.GetFiles(GetCurIconPath() + "blyt", "*.brlyt"); foreach (string thisFile in bannerFiles) File.Copy(thisFile, fbd.SelectedPath + "\\" + Path.GetFileName(thisFile),true); foreach (string thisFile in iconFiles) File.Copy(thisFile, fbd.SelectedPath + "\\" + Path.GetFileName(thisFile), true); } if (cmSender == cmExtractBothBrl || cmSender == cmExtractBrlan) { //Extract brlans string[] bannerFiles = Directory.GetFiles(GetCurBannerPath() + "anim", "*.brlan"); string[] iconFiles = Directory.GetFiles(GetCurIconPath() + "anim", "*.brlan"); foreach (string thisFile in bannerFiles) File.Copy(thisFile, fbd.SelectedPath + "\\" + Path.GetFileName(thisFile), true); foreach (string thisFile in iconFiles) File.Copy(thisFile, fbd.SelectedPath + "\\" + Path.GetFileName(thisFile), true); } InfoBox("Extracted files successfully!"); } } catch (Exception ex) { ErrorBox(ex.Message); } } else //DOL { try { string[] tmdFile = Directory.GetFiles(TempUnpackPath, "*.tmd"); byte[] tmd = Wii.Tools.LoadFileToByteArray(tmdFile[0]); int numContents = Wii.WadInfo.GetContentNum(tmd); if (numContents == 3) { int bootIndex = Wii.WadInfo.GetBootIndex(tmd); string appFile = string.Empty; if (bootIndex == 1) { appFile = "00000002.app"; } else if (bootIndex == 2) { appFile = "00000001.app"; } if (!string.IsNullOrEmpty(appFile)) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "Wii Executables|*.dol"; sfd.FileName = (string.IsNullOrEmpty(tbAllLanguages.Text) ? tbEnglish.Text : tbAllLanguages.Text) + ".dol"; if (sfd.ShowDialog() == DialogResult.OK) { File.Copy(TempUnpackPath + appFile, sfd.FileName, true); InfoBox(string.Format("The DOL file was successfully extracted to {0}!", Path.GetFileName(sfd.FileName))); } } else ErrorBox("The DOL file couldn't be found!"); } else ErrorBox("The DOL file couldn't be found!"); } catch (Exception ex) { ErrorBox(ex.Message); } } } private void cmLoadAudioFile_Click(object sender, EventArgs e) { if (pbProgress.Value == 100) { OpenFileDialog ofd = new OpenFileDialog(); if (File.Exists(Application.StartupPath + "\\lame.exe")) { ofd.Filter = "Wave Files|*.wav|Mp3 Files|*.mp3|BNS Files|*.bns|All|*.wav;*.mp3;*.bns"; ofd.FilterIndex = 4; } else { ofd.Filter = "Wave Files|*.wav|BNS Files|*.bns|All|*.wav;*.bns"; ofd.FilterIndex = 3; } if (ofd.ShowDialog() == DialogResult.OK) { if (ofd.FileName.ToLower().EndsWith(".mp3")) { ConvertMp3ToWave(ofd.FileName); } else { 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 cmConvertToBns_Click(object sender, EventArgs e) { if (pbProgress.Value == 100) { CustomizeMii_BnsConvert bnsConvert = new CustomizeMii_BnsConvert(File.Exists(Application.StartupPath + "\\lame.exe")); if (bnsConvert.ShowDialog() == DialogResult.OK) { BnsConversionInfo bnsInfo = new BnsConversionInfo(); bnsInfo.AudioFile = bnsConvert.AudioFile; bnsInfo.StereoToMono = false; if (bnsConvert.ChannelCount == 2) { if (MessageBox.Show("Do you want to convert the stereo Wave file to a mono BNS file?\nOnly the left channel will be taken.", "Convert to Mono?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) bnsInfo.StereoToMono = true; } if (bnsConvert.LoopFromAudio) { bnsInfo.Loop = BnsConversionInfo.LoopType.FromWave; } else if (bnsConvert.LoopManually) { bnsInfo.LoopStartSample = bnsConvert.LoopStartSample; bnsInfo.Loop = BnsConversionInfo.LoopType.Manual; } else bnsInfo.Loop = BnsConversionInfo.LoopType.None; BackgroundWorker bwConvertToBns = new BackgroundWorker(); bwConvertToBns.WorkerReportsProgress = true; bwConvertToBns.DoWork += new DoWorkEventHandler(bwConvertToBns_DoWork); bwConvertToBns.ProgressChanged += new ProgressChangedEventHandler(bwConvertToBns_ProgressChanged); bwConvertToBns.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwConvertToBns_RunWorkerCompleted); bwConvertToBns.RunWorkerAsync(bnsInfo); } } } private void cmExtractWad_Click(object sender, EventArgs e) { FolderBrowserDialog fbd = new FolderBrowserDialog(); string unpackDir = string.Format("{0} - {1}", Wii.WadInfo.GetChannelTitlesFromApp(TempUnpackPath + "00000000.app")[1], Wii.WadInfo.GetTitleID(Directory.GetFiles(TempUnpackPath, "*.tmd")[0], 1)); fbd.Description = string.Format("Choose the path where the WAD will be extracted to. A folder called \"{0}\" containing the contents will be created!", unpackDir); if (fbd.ShowDialog() == DialogResult.OK) { unpackDir = fbd.SelectedPath + "\\" + unpackDir; string[] files = Directory.GetFiles(TempUnpackPath); if (!Directory.Exists(unpackDir)) Directory.CreateDirectory(unpackDir); foreach (string thisFile in files) File.Copy(thisFile, unpackDir + "\\" + Path.GetFileName(thisFile), true); InfoBox("Successfully extracted WAD file!"); } } private void cmLoadDol_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Wii Executables|*.dol|Wii Channels|*.wad|All|*.dol;*.wad"; ofd.FilterIndex = 3; if (ofd.ShowDialog() == DialogResult.OK) { if (ofd.FileName.ToLower().EndsWith(".wad")) { try { byte[] wad = Wii.Tools.LoadFileToByteArray(ofd.FileName); int numContents = Wii.WadInfo.GetContentNum(wad); if (numContents == 3) { int bootIndex = Wii.WadInfo.GetBootIndex(wad); string appFile = string.Empty; if (bootIndex == 1) { appFile = "00000002.app"; } else if (bootIndex == 2) { appFile = "00000001.app"; } if (!string.IsNullOrEmpty(appFile)) { if (Directory.Exists(TempTempPath + "TempWad")) Directory.Delete(TempTempPath + "TempWad", true); Wii.WadUnpack.UnpackWad(ofd.FileName, TempTempPath + "TempWad"); File.Copy(TempTempPath + "TempWad\\" + appFile, TempDolPath, true); SetText(tbDol, ofd.FileName); btnBrowseDol.Text = "Clear"; } else ErrorBox("The DOL file couldn't be found!"); } else ErrorBox("The DOL file couldn't be found!"); } catch (Exception ex) { SetText(tbDol, string.Empty); ErrorBox(ex.Message); } } else { SetText(tbDol, ofd.FileName); btnBrowseDol.Text = "Clear"; } } } private void cmDolFromSource_Click(object sender, EventArgs e) { try { string[] tmdFile = Directory.GetFiles(TempUnpackPath, "*.tmd"); byte[] tmd = Wii.Tools.LoadFileToByteArray(tmdFile[0]); int numContents = Wii.WadInfo.GetContentNum(tmd); if (numContents == 3) { int bootIndex = Wii.WadInfo.GetBootIndex(tmd); string appFile = string.Empty; if (bootIndex == 1) { appFile = "00000002.app"; } else if (bootIndex == 2) { appFile = "00000001.app"; } if (!string.IsNullOrEmpty(appFile)) { File.Copy(TempUnpackPath + appFile, TempDolPath, true); SetText(tbDol, "Internal"); btnBrowseDol.Text = "Clear"; } else ErrorBox("The DOL file couldn't be found!"); } else ErrorBox("The DOL file couldn't be found!"); } catch (Exception ex) { SetText(tbDol, string.Empty); btnBrowseDol.Text = "Browse..."; ErrorBox(ex.Message); } } private void llbTranslateChannel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { if (!tbAllLanguages.Text.ToLower().Contains("channel")) { tbAllLanguages.Focus(); tbAllLanguages.SelectAll(); return; } string tempText = tbAllLanguages.Text; int startIndex = tempText.ToLower().IndexOf("channel"); try { tbEnglish.Text = tempText.Remove(startIndex, 7).Insert(startIndex, "Channel"); 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 { if (tempText[startIndex - 1] != ' ') tbFrench.Text = tempText.Remove(startIndex, 7).Insert(0, "Chaîne "); else tbFrench.Text = tempText.Remove(startIndex - 1, 8).Insert(0, "Chaîne "); } catch { tbFrench.Text = tempText.Remove(startIndex, 7).Insert(0, "Chaîne"); } try { if (tempText[startIndex - 1] != ' ') tbSpanish.Text = tempText.Remove(startIndex, 7).Insert(0, "Canal "); else tbSpanish.Text = tempText.Remove(startIndex - 1, 8).Insert(0, "Canal "); } catch { tbSpanish.Text = tempText.Remove(startIndex, 7).Insert(0, "Canal"); } try { if (tempText[startIndex - 1] != ' ') tbItalian.Text = tempText.Remove(startIndex, 7).Insert(0, "Canale "); else tbItalian.Text = tempText.Remove(startIndex - 1, 8).Insert(0, "Canale "); } catch { tbItalian.Text = tempText.Remove(startIndex, 7).Insert(0, "Canale"); } tbAllLanguages.Text = string.Empty; } catch (Exception ex) { tbAllLanguages.Text = tempText; tbEnglish.Text = string.Empty; tbJapanese.Text = string.Empty; tbGerman.Text = string.Empty; tbFrench.Text = string.Empty; tbSpanish.Text = string.Empty; tbItalian.Text = string.Empty; tbDutch.Text = string.Empty; tbKorean.Text = string.Empty; ErrorBox(ex.Message); } } private void tbAllLanguages_TextChanged(object sender, EventArgs e) { 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); } } }