mirror of
https://github.com/Brawl345/customizemii.git
synced 2024-11-14 12:25:13 +01:00
2534 lines
118 KiB
C#
2534 lines
118 KiB
C#
/* 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
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;
|
|
using libWiiSharp;
|
|
|
|
namespace CustomizeMii
|
|
{
|
|
public partial class CustomizeMii_Main : Form
|
|
{
|
|
#region Constants
|
|
private const string version = "3.11.1"; //Hint for myself: Never use a char in the Version (UpdateCheck)!
|
|
private const int soundMaxLength = 40; //In seconds
|
|
private const int soundWarningLength = 25; //In seconds
|
|
private const int bnsWarningLength = 45; //In seconds
|
|
private const int creditsScrollSpeed = 75; //Timer Intervall for the scrolling Credits
|
|
private const int creditsReturnValue = -150; //Need to change this when the credits label gets longer
|
|
#endregion
|
|
|
|
#region Variables
|
|
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" };
|
|
private bool brlytChanged = false;
|
|
private bool brlanChanged = false;
|
|
private Progress currentProgress;
|
|
private EventHandler ProgressUpdate;
|
|
private List<string> bannerTransparents = new List<string>();
|
|
private List<string> iconTransparents = new List<string>();
|
|
private double separatorBtn;
|
|
private Timer tmrCredits = new Timer();
|
|
private ToolTip tTip = new ToolTip();
|
|
#endregion
|
|
|
|
public CustomizeMii_Main(string[] args)
|
|
{
|
|
InitializeComponent();
|
|
this.Icon = global::CustomizeMii.Properties.Resources.CustomizeMii;
|
|
|
|
if (args.Length > 0 && File.Exists(args[0]) && args[0].ToLower().EndsWith(".wad"))
|
|
{
|
|
loadChannel(args[0]);
|
|
}
|
|
}
|
|
|
|
private void CustomizeMii_Main_Load(object sender, EventArgs e)
|
|
{
|
|
this.Text = this.Text.Replace("X", version);
|
|
this.lbCreditVersion.Text = this.lbCreditVersion.Text.Replace("X", version);
|
|
|
|
if (!Environment.OSVersion.VersionString.ToLower().Contains("windows"))
|
|
{
|
|
//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 < tabControl.TabPages[i].Controls.Count; j++)
|
|
if (tabControl.TabPages[i].Controls[j] is TextBox) ((TextBox)tabControl.TabPages[i].Controls[j]).MaxLength = 32000;
|
|
}
|
|
|
|
if (File.Exists(Application.StartupPath + Path.DirectorySeparatorChar + "CustomizeMiiInstaller.dll"))
|
|
this.lbCreditInstaller.Text = this.lbCreditInstaller.Text.Replace("X", getInstallerVersion());
|
|
else this.lbCreditInstaller.Text = this.lbCreditInstaller.Text.Replace(" X", string.Empty);
|
|
|
|
if (!version.ToLower().Contains("beta"))
|
|
{
|
|
MethodInvoker Update = new MethodInvoker(updateCheck);
|
|
Update.BeginInvoke(null, null);
|
|
}
|
|
|
|
byte[] t = new byte[45];
|
|
|
|
initialize();
|
|
}
|
|
|
|
private void CustomizeMii_Main_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
Environment.Exit(0);
|
|
}
|
|
|
|
private void sourceWad_Warning(object sender, MessageEventArgs e)
|
|
{
|
|
MessageBox.Show(e.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
}
|
|
|
|
private void initialize()
|
|
{
|
|
if (this.InvokeRequired)
|
|
{
|
|
this.Invoke(new MethodInvoker(initialize));
|
|
return;
|
|
}
|
|
|
|
drawCreateButton();
|
|
setToolTips();
|
|
|
|
ProgressUpdate = new EventHandler(this.updateProgress);
|
|
tmrCredits.Tick += new EventHandler(tmrCredits_Tick);
|
|
rtbInstructions.LinkClicked += new LinkClickedEventHandler(rtbInstructions_LinkClicked);
|
|
|
|
cmbNandLoader.SelectedIndex = 0;
|
|
cmbFormatBanner.SelectedIndex = 0;
|
|
cmbFormatIcon.SelectedIndex = 0;
|
|
cmbReplace.SelectedIndex = 0;
|
|
|
|
pbProgress.Value = 100;
|
|
tmrCredits.Interval = creditsScrollSpeed;
|
|
|
|
brlanChanged = false;
|
|
brlytChanged = false;
|
|
|
|
btnBrowseSource.Text = "Browse...";
|
|
btnBrowseDol.Text = "Browse...";
|
|
btnBrowseSound.Text = "Browse...";
|
|
|
|
rtbInstructions.Rtf = Properties.Resources.Instructions;
|
|
|
|
clearAll();
|
|
disableControls();
|
|
}
|
|
|
|
private void clearAll()
|
|
{
|
|
tbAllLanguages.Text = string.Empty;
|
|
tbDol.Text = string.Empty;
|
|
tbDutch.Text = string.Empty;
|
|
tbEnglish.Text = string.Empty;
|
|
tbFrench.Text = string.Empty;
|
|
tbGerman.Text = string.Empty;
|
|
tbItalian.Text = string.Empty;
|
|
tbKorean.Text = string.Empty;
|
|
tbJapanese.Text = string.Empty;
|
|
tbReplace.Text = string.Empty;
|
|
tbSound.Text = string.Empty;
|
|
tbSourceWad.Text = string.Empty;
|
|
tbSpanish.Text = string.Empty;
|
|
tbTitleID.Text = string.Empty;
|
|
tbStartupIos.Text = string.Empty;
|
|
|
|
lbCreatedValue.Text = string.Empty;
|
|
|
|
lbxBannerTpls.Items.Clear();
|
|
lbxBrlanBanner.Items.Clear();
|
|
lbxBrlanIcon.Items.Clear();
|
|
lbxBrlytBanner.Items.Clear();
|
|
lbxBrlytIcon.Items.Clear();
|
|
lbxIconTpls.Items.Clear();
|
|
|
|
replacedBanner = string.Empty;
|
|
replacedIcon = string.Empty;
|
|
replacedSound = string.Empty;
|
|
|
|
sourceWad = new WAD();
|
|
bannerBin = new U8();
|
|
newBannerBin = new U8();
|
|
iconBin = new U8();
|
|
newIconBin = new U8();
|
|
newSoundBin = new byte[0];
|
|
newDol = new byte[0];
|
|
|
|
sourceWad.Warning += new EventHandler<MessageEventArgs>(sourceWad_Warning);
|
|
|
|
cbLz77.Checked = true;
|
|
cbIconMakeTransparent.Checked = false;
|
|
cbBannerMakeTransparent.Checked = false;
|
|
|
|
bannerTransparents.Clear();
|
|
iconTransparents.Clear();
|
|
|
|
simpleForwarder.Clear();
|
|
complexForwarder.Clear();
|
|
}
|
|
|
|
private void setToolTips()
|
|
{
|
|
tTip.SetToolTip(btnCreateWad, "Create and save the WAD or send it directly to the Wii...\nBe sure the Homebrew Channel is running and connected if you want to send the WAD...");
|
|
tTip.SetToolTip(btnBrowseSource, "Browse for a WAD that is used as a Base...");
|
|
tTip.SetToolTip(btnLoadBaseWad, "Load the selected Base WAD...");
|
|
tTip.SetToolTip(btnPreviewBaseWad, "Preview the selected Base WAD, a Browserwindow will be opened...");
|
|
tTip.SetToolTip(btnSaveBaseWad, "Download and save the selected Base WAD to your HDD...");
|
|
tTip.SetToolTip(btnBrowseReplace, "Browse for a Banner / Icon / Sound to use instead of the one within the Base WAD...\nWAD's, 00000000.app's and banner.bin's / icon.bin's / sound.bin's can be loaded...");
|
|
//TTip.SetToolTip(btnClearReplace, "Clear the replaced Banner / Icon / Sound and use the one within the Base WAD...");
|
|
tTip.SetToolTip(btnBrowseDol, "Browse for a DOL file that will be inserted into the WAD\nor choose the DOL form the source WAD to switch the NAND Loader...");
|
|
tTip.SetToolTip(btnBrowseSound, "Browse for a sound that will be inserted into the WAD\nor convert a sound to BNS format...");
|
|
tTip.SetToolTip(btnAddBanner, "Add an image or TPL to the Banner...");
|
|
tTip.SetToolTip(btnAddIcon, "Add an image or TPL to the Icon...");
|
|
tTip.SetToolTip(btnDeleteBanner, "Delete the selected TPL...\nRequired TPLs can't be deleted...");
|
|
tTip.SetToolTip(btnDeleteIcon, "Delete the selected TPL...\nRequired TPLs can't be deleted...");
|
|
tTip.SetToolTip(btnReplaceBanner, "Replace the selected TPL with any image...\nThe image wil be stretched to fit the size of the TPL...");
|
|
tTip.SetToolTip(btnReplaceIcon, "Replace the selected TPL with any image...\nThe image wil be stretched to fit the size of the TPL...");
|
|
tTip.SetToolTip(btnExtractBanner, "Extract the selected TPL as an image...");
|
|
tTip.SetToolTip(btnExtractIcon, "Extract the selected TPL as an image...");
|
|
tTip.SetToolTip(btnPreviewBanner, "Preview the selected TPL...");
|
|
tTip.SetToolTip(btnPreviewIcon, "Preview the selected TPL...");
|
|
tTip.SetToolTip(btnBrlytReplace, "Replace the selected brlyt with any other...\nThis is for advanced users only!");
|
|
tTip.SetToolTip(btnBrlytExtract, "Extract the selected brlyt...");
|
|
tTip.SetToolTip(btnBrlytListTpls, "List the TPLs required by the selected brlyt...");
|
|
tTip.SetToolTip(btnBrlanAdd, "Add a brlan file...\nThis is for advanced users only!");
|
|
tTip.SetToolTip(btnBrlanDelete, "Delete the selected brlan file...\nThis is for advanced users only!");
|
|
tTip.SetToolTip(btnBrlanReplace, "Replace the selected brlan file...\nThis is for advanced users only!");
|
|
tTip.SetToolTip(btnBrlanExtract, "Extract the selected brlan file...");
|
|
tTip.SetToolTip(btnOptionsExtract, "Extract contents of the WAD...");
|
|
tTip.SetToolTip(btnForwarder, "Create a forwarder that will be inserted as a DOL...");
|
|
|
|
tTip.SetToolTip(llbTranslateChannel, "Translates the word \"Channel\" to each language...");
|
|
|
|
tTip.SetToolTip(cbLz77, "Use Lz77 compression for the banner.bin and icon.bin...\nIf the created WAD does not work, try it without compression first...");
|
|
tTip.SetToolTip(cbSecurityChecksOff, "Turn off the security checks...\nNot recommended, you may get a bricking WAD...");
|
|
}
|
|
|
|
private bool checkForForwardMii()
|
|
{
|
|
if (File.Exists(Application.StartupPath + Path.DirectorySeparatorChar + "ForwardMii.dll"))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
private void rtbInstructions_LinkClicked(object sender, LinkClickedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
Process.Start(e.LinkText);
|
|
}
|
|
catch (Exception ex) { errorBox(ex.Message); }
|
|
}
|
|
|
|
private bool checkDevKit()
|
|
{
|
|
return ForwardMii_Plugin.CheckDevKit();
|
|
}
|
|
|
|
private byte[] createForwarderSimple()
|
|
{
|
|
return simpleForwarder.ToByteArray();
|
|
}
|
|
|
|
private byte[] createForwarderComplex()
|
|
{
|
|
return complexForwarder.ToByteArray();
|
|
}
|
|
|
|
private void convertMp3ToWave(string mp3File)
|
|
{
|
|
if (File.Exists(Application.StartupPath + Path.DirectorySeparatorChar + "lame.exe"))
|
|
{
|
|
try
|
|
{
|
|
BackgroundWorker bwConvertMp3 = new BackgroundWorker();
|
|
bwConvertMp3.DoWork += new DoWorkEventHandler(bwConvertMp3_DoWork);
|
|
bwConvertMp3.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwConvertMp3_RunWorkerCompleted);
|
|
bwConvertMp3.ProgressChanged += new ProgressChangedEventHandler(bwConvertMp3_ProgressChanged);
|
|
bwConvertMp3.WorkerReportsProgress = true;
|
|
|
|
bwConvertMp3.RunWorkerAsync(mp3File);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
errorBox(ex.Message);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void drawCreateButton()
|
|
{
|
|
btnCreateWad.Text = string.Empty;
|
|
|
|
Image tmpImg = new Bitmap(btnCreateWad.Width, btnCreateWad.Height);
|
|
using (Graphics gImg = Graphics.FromImage(tmpImg))
|
|
{
|
|
gImg.Clear(Color.Transparent);
|
|
|
|
separatorBtn = btnCreateWad.Width * 0.5;
|
|
|
|
gImg.DrawLine(Pens.Gray, new Point((int)separatorBtn, 0), new Point((int)separatorBtn, btnCreateWad.Height));
|
|
|
|
Image tmpCreate = Properties.Resources.btnCreate;
|
|
Image tmpSend = Properties.Resources.btnSend;
|
|
gImg.DrawImage(resizeImage(tmpCreate, tmpCreate.Width, tmpCreate.Height), new Point(280, 0));
|
|
gImg.DrawImage(resizeImage(tmpSend, tmpSend.Width, tmpSend.Height), new Point(55, 0));
|
|
|
|
btnCreateWad.Image = tmpImg;
|
|
}
|
|
}
|
|
|
|
private bool checkInet()
|
|
{
|
|
try
|
|
{
|
|
System.Net.IPHostEntry ipHost = System.Net.Dns.GetHostEntry("www.google.com");
|
|
return true;
|
|
}
|
|
catch { return false; }
|
|
}
|
|
|
|
private void updateProgress(object sender, EventArgs e)
|
|
{
|
|
pbProgress.Value = currentProgress.progressValue;
|
|
|
|
if (!string.IsNullOrEmpty(currentProgress.progressState))
|
|
{
|
|
lbStatusText.Text = currentProgress.progressState;
|
|
currentProgress.progressState = string.Empty;
|
|
}
|
|
}
|
|
|
|
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
|
|
{
|
|
tmrCredits.Stop();
|
|
|
|
if (tabControl.SelectedTab == tabBanner)
|
|
{
|
|
lbxBannerTpls.SelectedIndex = -1;
|
|
cbBannerMakeTransparent.Checked = false;
|
|
cbBannerMakeTransparent.Enabled = false;
|
|
|
|
try { addTpls(); }
|
|
catch { }
|
|
}
|
|
else if (tabControl.SelectedTab == tabIcon)
|
|
{
|
|
lbxIconTpls.SelectedIndex = -1;
|
|
cbIconMakeTransparent.Checked = false;
|
|
cbIconMakeTransparent.Enabled = false;
|
|
|
|
try { addTpls(); }
|
|
catch { }
|
|
}
|
|
else if (tabControl.SelectedTab == tabBrlyt)
|
|
{
|
|
try { addBrlyts(); }
|
|
catch { }
|
|
}
|
|
else if (tabControl.SelectedTab == tabBrlan)
|
|
{
|
|
try { addBrlans(); }
|
|
catch { }
|
|
}
|
|
else if (tabControl.SelectedTab == tabCredits)
|
|
{
|
|
lbCreditThanks.Location = new Point(lbCreditThanks.Location.X, panCredits.Height);
|
|
tmrCredits.Start();
|
|
}
|
|
}
|
|
|
|
private void tmrCredits_Tick(object sender, EventArgs e)
|
|
{
|
|
if (lbCreditThanks.Location.Y == creditsReturnValue) lbCreditThanks.Location = new Point(lbCreditThanks.Location.X, panCredits.Height);
|
|
lbCreditThanks.Location = new Point(lbCreditThanks.Location.X, lbCreditThanks.Location.Y - 1);
|
|
}
|
|
|
|
private void lbStatusText_TextChanged(object sender, EventArgs e)
|
|
{
|
|
if (string.IsNullOrEmpty(lbStatusText.Text) && pbProgress.Value == 100)
|
|
{
|
|
if (tabControl.SelectedTab == tabBanner ||
|
|
tabControl.SelectedTab == tabIcon)
|
|
addTpls();
|
|
else if (tabControl.SelectedTab == tabBrlyt)
|
|
addBrlyts();
|
|
else if (tabControl.SelectedTab == tabBrlan)
|
|
addBrlans();
|
|
}
|
|
}
|
|
|
|
private void updateCheck()
|
|
{
|
|
if (checkInet() == true)
|
|
{
|
|
try
|
|
{
|
|
WebClient GetVersion = new WebClient();
|
|
string NewVersion = GetVersion.DownloadString("https://raw.githubusercontent.com/Brawl345/customizemii/master/version.txt");
|
|
|
|
int newVersion = Convert.ToInt32(NewVersion.Replace(".", string.Empty).Length == 2 ? (NewVersion.Replace(".", string.Empty) + "0") : NewVersion.Replace(".", string.Empty));
|
|
int thisVersion = Convert.ToInt32(version.Replace(".", string.Empty).Length == 2 ? (version.Replace(".", string.Empty) + "0") : version.Replace(".", string.Empty));
|
|
|
|
if (newVersion > thisVersion)
|
|
{
|
|
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("https://github.com/Brawl345/customizemii/releases");
|
|
}
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
}
|
|
|
|
private string getInstallerVersion()
|
|
{
|
|
return CustomizeMiiInstaller.CustomizeMiiInstaller_Plugin.GetVersion();
|
|
}
|
|
|
|
private string getForwardMiiVersion()
|
|
{
|
|
return ForwardMii_Plugin.GetVersion();
|
|
}
|
|
|
|
private void llbSite_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
llbSite.LinkVisited = true;
|
|
Process.Start("https://github.com/Brawl345/customizemii/");
|
|
}
|
|
catch (Exception ex) { errorBox(ex.Message); }
|
|
}
|
|
|
|
private void btnBrowseSource_Click(object sender, EventArgs e)
|
|
{
|
|
if (btnBrowseSource.Text.ToLower() == "clear") { initialize(); }
|
|
else loadChannel();
|
|
}
|
|
|
|
private void btnLoadBaseWad_Click(object sender, EventArgs e)
|
|
{
|
|
if (lbxBaseWads.SelectedIndex != -1)
|
|
{
|
|
if (pbProgress.Value == 100)
|
|
{
|
|
if (checkInet() == true)
|
|
{
|
|
if (tbSourceWad.Text != SourceWadUrls[lbxBaseWads.SelectedIndex])
|
|
{
|
|
tbSourceWad.Text = "https://raw.githubusercontent.com/Brawl345/customizemii/master/Base_WADs/" + SourceWadUrls[lbxBaseWads.SelectedIndex];
|
|
|
|
System.Threading.Thread dlThread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(downloadBaseWad));
|
|
dlThread.Start(tbSourceWad.Text);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
errorBox("You're not connected to the Internet!");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void downloadBaseWad(object uri)
|
|
{
|
|
try
|
|
{
|
|
WebClient client = new WebClient();
|
|
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
|
|
client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(client_DownloadDataCompleted);
|
|
|
|
currentProgress.progressState = "Downloading Base WAD...";
|
|
currentProgress.progressValue = 0;
|
|
this.Invoke(ProgressUpdate);
|
|
|
|
client.DownloadDataAsync(new Uri((string)uri), uri);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
setControlText(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_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
|
|
{
|
|
currentProgress.progressValue = 0;
|
|
currentProgress.progressState = string.Empty;
|
|
this.Invoke(ProgressUpdate);
|
|
|
|
if (e.Error != null)
|
|
{
|
|
setControlText(tbSourceWad, string.Empty);
|
|
errorBox("The requested file couldn't be downloaded: " + e.Error.Message);
|
|
}
|
|
else
|
|
{
|
|
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(e);
|
|
}
|
|
}
|
|
|
|
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 = "https://raw.githubusercontent.com/Brawl345/customizemii/master/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)
|
|
{
|
|
sourceWad.Save(sfd.FileName);
|
|
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!");
|
|
}
|
|
}
|
|
|
|
private 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 = replacedIcon;
|
|
break;
|
|
case 2:
|
|
if (replacedSound.ToLower().EndsWith(".wad") ||
|
|
replacedSound.ToLower().EndsWith(".app") ||
|
|
replacedSound.ToLower().EndsWith(".bin"))
|
|
tbReplace.Text = replacedSound;
|
|
else tbReplace.Text = string.Empty;
|
|
break;
|
|
default:
|
|
tbReplace.Text = replacedBanner;
|
|
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.ToLower() == "clear")
|
|
{
|
|
if (cmbReplace.SelectedIndex == 2) //sound
|
|
{
|
|
replacedSound = string.Empty;
|
|
setControlText(tbReplace, string.Empty);
|
|
|
|
newSoundBin = new byte[0];
|
|
}
|
|
else if (cmbReplace.SelectedIndex == 1) //icon
|
|
{
|
|
replacedIcon = string.Empty;
|
|
setControlText(tbReplace, string.Empty);
|
|
|
|
newIconBin = new U8();
|
|
|
|
iconTransparents.Clear();
|
|
|
|
addTpls();
|
|
addBrlans();
|
|
addBrlyts();
|
|
}
|
|
else //banner
|
|
{
|
|
replacedBanner = string.Empty;
|
|
setControlText(tbReplace, string.Empty);
|
|
|
|
newBannerBin = new U8();
|
|
|
|
bannerTransparents.Clear();
|
|
|
|
addTpls();
|
|
addBrlans();
|
|
addBrlyts();
|
|
}
|
|
}
|
|
else replacePart();
|
|
}
|
|
|
|
private void btnBrowseDol_Click(object sender, EventArgs e)
|
|
{
|
|
if (btnBrowseDol.Text.ToLower() == "clear")
|
|
{
|
|
setControlText(tbDol, string.Empty);
|
|
btnBrowseDol.Text = "Browse...";
|
|
newDol = new byte[0];
|
|
|
|
simpleForwarder.Clear();
|
|
complexForwarder.Clear();
|
|
}
|
|
else cmDol.Show(MousePosition);
|
|
}
|
|
|
|
private void btnBrowseSound_Click(object sender, EventArgs e)
|
|
{
|
|
if (btnBrowseSound.Text.ToLower() == "clear")
|
|
{
|
|
setControlText(tbSound, string.Empty);
|
|
btnBrowseSound.Text = "Browse...";
|
|
newSoundBin = new byte[0];
|
|
}
|
|
else cmSound.Show(MousePosition);
|
|
}
|
|
|
|
private void lbxBannerTpls_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (lbxBannerTpls.SelectedIndex != -1)
|
|
{
|
|
cbBannerMakeTransparent.Enabled = true;
|
|
cbBannerMakeTransparent.Checked = lbxBannerTpls.SelectedItem.ToString().EndsWith("(Transparent)");
|
|
|
|
if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(RGBA8"))
|
|
{ cmbFormatBanner.SelectedIndex = 0; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(RGB565"))
|
|
{ cmbFormatBanner.SelectedIndex = 1; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(RGB5A3"))
|
|
{ cmbFormatBanner.SelectedIndex = 2; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(IA8"))
|
|
{ cmbFormatBanner.SelectedIndex = 3; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(IA4"))
|
|
{ cmbFormatBanner.SelectedIndex = 4; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(I8"))
|
|
{ cmbFormatBanner.SelectedIndex = 5; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(I4"))
|
|
{ cmbFormatBanner.SelectedIndex = 6; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(CI4"))
|
|
{ cmbFormatBanner.SelectedIndex = 7; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(CI8"))
|
|
{ cmbFormatBanner.SelectedIndex = 8; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(CI14X2"))
|
|
{ cmbFormatBanner.SelectedIndex = 9; }
|
|
else if (lbxBannerTpls.SelectedItem.ToString().Substring(lbxBannerTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(CMP"))
|
|
{ cmbFormatBanner.SelectedIndex = 10; }
|
|
}
|
|
else cbBannerMakeTransparent.Enabled = false;
|
|
}
|
|
|
|
private void lbxIconTpls_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (lbxIconTpls.SelectedIndex != -1)
|
|
{
|
|
cbIconMakeTransparent.Enabled = true;
|
|
cbIconMakeTransparent.Checked = lbxIconTpls.SelectedItem.ToString().EndsWith("(Transparent)");
|
|
|
|
if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(RGBA8"))
|
|
{ cmbFormatIcon.SelectedIndex = 0; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(RGB565"))
|
|
{ cmbFormatIcon.SelectedIndex = 1; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(RGB5A3"))
|
|
{ cmbFormatIcon.SelectedIndex = 2; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(IA8"))
|
|
{ cmbFormatIcon.SelectedIndex = 3; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(IA4"))
|
|
{ cmbFormatIcon.SelectedIndex = 4; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(I8"))
|
|
{ cmbFormatIcon.SelectedIndex = 5; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(I4"))
|
|
{ cmbFormatIcon.SelectedIndex = 6; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(CI4"))
|
|
{ cmbFormatIcon.SelectedIndex = 7; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(CI8"))
|
|
{ cmbFormatIcon.SelectedIndex = 8; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(CI14X2"))
|
|
{ cmbFormatIcon.SelectedIndex = 9; }
|
|
else if (lbxIconTpls.SelectedItem.ToString().Substring(lbxIconTpls.SelectedItem.ToString().IndexOf('(')).ToUpper().Contains("(CMP"))
|
|
{ cmbFormatIcon.SelectedIndex = 10; }
|
|
}
|
|
else cbIconMakeTransparent.Enabled = false;
|
|
}
|
|
|
|
private void btnReplaceBanner_Click(object sender, EventArgs e)
|
|
{
|
|
if (lbxBannerTpls.SelectedIndex != -1)
|
|
{
|
|
int format = cmbFormatBanner.SelectedIndex;
|
|
|
|
if (format < 9)
|
|
{
|
|
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 tplName = lbxBannerTpls.SelectedItem.ToString().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 3);
|
|
TPL tmpTpl;
|
|
Image img;
|
|
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
tmpTpl = TPL.Load(bannerBin.Data[bannerBin.GetNodeIndex(tplName)]);
|
|
else tmpTpl = TPL.Load(newBannerBin.Data[newBannerBin.GetNodeIndex(tplName)]);
|
|
|
|
if (!ofd.FileName.ToLower().EndsWith(".tpl")) img = Image.FromFile(ofd.FileName);
|
|
else
|
|
{
|
|
TPL newTpl = TPL.Load(ofd.FileName);
|
|
img = newTpl.ExtractTexture();
|
|
}
|
|
|
|
if (img.Width != tmpTpl.GetTextureSize(0).Width ||
|
|
img.Height != tmpTpl.GetTextureSize(0).Height)
|
|
img = resizeImage(img, tmpTpl.GetTextureSize(0).Width, tmpTpl.GetTextureSize(0).Height);
|
|
|
|
TPL_PaletteFormat pFormat = TPL_PaletteFormat.RGB5A3;
|
|
|
|
switch (format)
|
|
{
|
|
case 6:
|
|
format = (int)TPL_TextureFormat.I4;
|
|
break;
|
|
case 5:
|
|
format = (int)TPL_TextureFormat.I8;
|
|
break;
|
|
case 4:
|
|
format = (int)TPL_TextureFormat.IA4;
|
|
break;
|
|
case 3:
|
|
format = (int)TPL_TextureFormat.IA8;
|
|
break;
|
|
case 1:
|
|
format = (int)TPL_TextureFormat.RGB565;
|
|
break;
|
|
case 2:
|
|
format = (int)TPL_TextureFormat.RGB5A3;
|
|
break;
|
|
case 7:
|
|
format = (int)TPL_TextureFormat.CI4;
|
|
|
|
CustomizeMii_PaletteFormatBox pfb = new CustomizeMii_PaletteFormatBox();
|
|
pfb.ShowDialog();
|
|
|
|
pFormat = pfb.PaletteFormat;
|
|
break;
|
|
case 8:
|
|
format = (int)TPL_TextureFormat.CI8;
|
|
|
|
CustomizeMii_PaletteFormatBox pfb2 = new CustomizeMii_PaletteFormatBox();
|
|
pfb2.ShowDialog();
|
|
|
|
pFormat = pfb2.PaletteFormat;
|
|
break;
|
|
case 9:
|
|
format = (int)TPL_TextureFormat.CI14X2;
|
|
|
|
CustomizeMii_PaletteFormatBox pfb3 = new CustomizeMii_PaletteFormatBox();
|
|
pfb3.ShowDialog();
|
|
|
|
pFormat = pfb3.PaletteFormat;
|
|
break;
|
|
default:
|
|
format = (int)TPL_TextureFormat.RGBA8;
|
|
break;
|
|
}
|
|
|
|
tmpTpl.RemoveTexture(0);
|
|
tmpTpl.AddTexture(img, (TPL_TextureFormat)format, pFormat);
|
|
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
bannerBin.ReplaceFile(bannerBin.GetNodeIndex(tplName), tmpTpl.ToByteArray());
|
|
else newBannerBin.ReplaceFile(newBannerBin.GetNodeIndex(tplName), tmpTpl.ToByteArray());
|
|
|
|
addTpls();
|
|
}
|
|
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)
|
|
{
|
|
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().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 3).Replace(".tpl", string.Empty);
|
|
|
|
if (sfd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
try
|
|
{
|
|
string tplName = lbxBannerTpls.SelectedItem.ToString().Remove(lbxBannerTpls.SelectedItem.ToString().IndexOf('(', 0) - 3);
|
|
TPL tmpTpl;
|
|
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
tmpTpl = TPL.Load(bannerBin.Data[bannerBin.GetNodeIndex(tplName)]);
|
|
else tmpTpl = TPL.Load(newBannerBin.Data[newBannerBin.GetNodeIndex(tplName)]);
|
|
|
|
if (File.Exists(sfd.FileName)) File.Delete(sfd.FileName);
|
|
if (!sfd.FileName.ToLower().EndsWith(".tpl"))
|
|
{
|
|
Image img = tmpTpl.ExtractTexture();
|
|
|
|
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 tmpTpl.Save(sfd.FileName);
|
|
}
|
|
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) - 3);
|
|
|
|
if (string.IsNullOrEmpty(replacedBanner)) pvw.BannerBin = bannerBin;
|
|
else pvw.BannerBin = newBannerBin;
|
|
if (string.IsNullOrEmpty(replacedIcon)) pvw.IconBin = iconBin;
|
|
else pvw.IconBin = newIconBin;
|
|
|
|
pvw.ShowDialog();
|
|
pvw = null;
|
|
|
|
addTpls();
|
|
}
|
|
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 < 9)
|
|
{
|
|
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 tplName = lbxIconTpls.SelectedItem.ToString().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 3);
|
|
TPL tmpTpl;
|
|
Image img;
|
|
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
tmpTpl = TPL.Load(iconBin.Data[iconBin.GetNodeIndex(tplName)]);
|
|
else tmpTpl = TPL.Load(newIconBin.Data[newIconBin.GetNodeIndex(tplName)]);
|
|
|
|
if (!ofd.FileName.ToLower().EndsWith(".tpl")) img = Image.FromFile(ofd.FileName);
|
|
else
|
|
{
|
|
TPL newTpl = TPL.Load(ofd.FileName);
|
|
img = newTpl.ExtractTexture();
|
|
}
|
|
|
|
if (img.Width != tmpTpl.GetTextureSize(0).Width ||
|
|
img.Height != tmpTpl.GetTextureSize(0).Height)
|
|
img = resizeImage(img, tmpTpl.GetTextureSize(0).Width, tmpTpl.GetTextureSize(0).Height);
|
|
|
|
TPL_PaletteFormat pFormat = TPL_PaletteFormat.RGB5A3;
|
|
|
|
switch (format)
|
|
{
|
|
case 6:
|
|
format = (int)TPL_TextureFormat.I4;
|
|
break;
|
|
case 5:
|
|
format = (int)TPL_TextureFormat.I8;
|
|
break;
|
|
case 4:
|
|
format = (int)TPL_TextureFormat.IA4;
|
|
break;
|
|
case 3:
|
|
format = (int)TPL_TextureFormat.IA8;
|
|
break;
|
|
case 1:
|
|
format = (int)TPL_TextureFormat.RGB565;
|
|
break;
|
|
case 2:
|
|
format = (int)TPL_TextureFormat.RGB5A3;
|
|
break;
|
|
case 7:
|
|
format = (int)TPL_TextureFormat.CI4;
|
|
|
|
CustomizeMii_PaletteFormatBox pfb = new CustomizeMii_PaletteFormatBox();
|
|
pfb.ShowDialog();
|
|
|
|
pFormat = pfb.PaletteFormat;
|
|
break;
|
|
case 8:
|
|
format = (int)TPL_TextureFormat.CI8;
|
|
|
|
CustomizeMii_PaletteFormatBox pfb2 = new CustomizeMii_PaletteFormatBox();
|
|
pfb2.ShowDialog();
|
|
|
|
pFormat = pfb2.PaletteFormat;
|
|
break;
|
|
case 9:
|
|
format = (int)TPL_TextureFormat.CI14X2;
|
|
|
|
CustomizeMii_PaletteFormatBox pfb3 = new CustomizeMii_PaletteFormatBox();
|
|
pfb3.ShowDialog();
|
|
|
|
pFormat = pfb3.PaletteFormat;
|
|
break;
|
|
default:
|
|
format = (int)TPL_TextureFormat.RGBA8;
|
|
break;
|
|
}
|
|
|
|
tmpTpl.RemoveTexture(0);
|
|
tmpTpl.AddTexture(img, (TPL_TextureFormat)format, pFormat);
|
|
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
iconBin.ReplaceFile(iconBin.GetNodeIndex(tplName), tmpTpl.ToByteArray());
|
|
else newIconBin.ReplaceFile(newIconBin.GetNodeIndex(tplName), tmpTpl.ToByteArray());
|
|
|
|
addTpls();
|
|
}
|
|
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)
|
|
{
|
|
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().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 3).Replace(".tpl", string.Empty);
|
|
|
|
if (sfd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
try
|
|
{
|
|
string tplName = lbxIconTpls.SelectedItem.ToString().Remove(lbxIconTpls.SelectedItem.ToString().IndexOf('(', 0) - 3);
|
|
TPL tmpTpl;
|
|
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
tmpTpl = TPL.Load(iconBin.Data[iconBin.GetNodeIndex(tplName)]);
|
|
else tmpTpl = TPL.Load(newIconBin.Data[newIconBin.GetNodeIndex(tplName)]);
|
|
|
|
if (File.Exists(sfd.FileName)) File.Delete(sfd.FileName);
|
|
if (!sfd.FileName.ToLower().EndsWith(".tpl"))
|
|
{
|
|
Image img = tmpTpl.ExtractTexture();
|
|
|
|
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 tmpTpl.Save(sfd.FileName);
|
|
}
|
|
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) - 3);
|
|
|
|
if (string.IsNullOrEmpty(replacedBanner)) pvw.BannerBin = bannerBin;
|
|
else pvw.BannerBin = newBannerBin;
|
|
if (string.IsNullOrEmpty(replacedIcon)) pvw.IconBin = iconBin;
|
|
else pvw.IconBin = newIconBin;
|
|
|
|
pvw.ShowDialog();
|
|
pvw = null;
|
|
|
|
addTpls();
|
|
}
|
|
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 + Path.DirectorySeparatorChar + "CustomizeMiiInstaller.dll"))
|
|
errorBox("CustomizeMiiInstaller.dll wasn't found!");
|
|
else
|
|
{
|
|
if (cbSecurityChecksOff.Checked == true || securityChecks() == true)
|
|
{
|
|
CustomizeMii_Transmit cmt = new CustomizeMii_Transmit();
|
|
|
|
if (cmt.ShowDialog() == DialogResult.OK)
|
|
{
|
|
try
|
|
{
|
|
WadCreationInfo wadInfo = new WadCreationInfo();
|
|
|
|
if (!int.TryParse(tbStartupIos.Text, out wadInfo.startupIos)) { errorBox("Please enter a valid startup 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.nandLoader = (WadCreationInfo.NandLoader)cmbNandLoader.SelectedIndex;
|
|
wadInfo.sendToWii = true;
|
|
wadInfo.transmitProtocol = (cmt.Protocol == 1) ? Protocol.HAXX : Protocol.JODI;
|
|
wadInfo.transmitIp = cmt.IPAddress;
|
|
wadInfo.transmitIos = int.Parse(cmt.IOS);
|
|
wadInfo.titleId = tbTitleID.Text;
|
|
wadInfo.sound = tbSound.Text;
|
|
wadInfo.dol = tbDol.Text;
|
|
wadInfo.lz77 = cbLz77.Checked;
|
|
|
|
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 (cbSecurityChecksOff.Checked == true || securityChecks() == true)
|
|
{
|
|
SaveFileDialog sfd = new SaveFileDialog();
|
|
sfd.Filter = "Wii Channels|*.wad";
|
|
|
|
string fileName;
|
|
|
|
if (!string.IsNullOrEmpty(tbAllLanguages.Text))
|
|
fileName = tbAllLanguages.Text + " - " + tbTitleID.Text.ToUpper() + ".wad";
|
|
else
|
|
fileName = tbEnglish.Text + " - " + tbTitleID.Text.ToUpper() + ".wad";
|
|
|
|
foreach (char invalidChar in Path.GetInvalidFileNameChars())
|
|
fileName = fileName.Replace(invalidChar.ToString(), string.Empty);
|
|
|
|
sfd.FileName = fileName;
|
|
|
|
if (sfd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
try
|
|
{
|
|
WadCreationInfo wadInfo = new WadCreationInfo();
|
|
|
|
if (!int.TryParse(tbStartupIos.Text, out wadInfo.startupIos)) { errorBox("Please enter a valid startup 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.lz77 = cbLz77.Checked;
|
|
|
|
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)
|
|
{
|
|
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
|
|
{
|
|
if (lbBrlanActions.Text.ToLower() == "banner")
|
|
{
|
|
for (int i = 0; i < lbxBrlanBanner.Items.Count; i++)
|
|
if (lbxBrlanBanner.Items[i].ToString().ToLower() == Path.GetFileName(ofd.FileName).ToLower())
|
|
{ errorBox("This file already exists, use the Replace button!"); return; }
|
|
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
{
|
|
bannerBin.AddFile("/arc/anim/" + Path.GetFileName(ofd.FileName), File.ReadAllBytes(ofd.FileName));
|
|
}
|
|
else
|
|
{
|
|
newBannerBin.AddFile("/arc/anim/" + Path.GetFileName(ofd.FileName), File.ReadAllBytes(ofd.FileName));
|
|
}
|
|
|
|
brlanChanged = true;
|
|
addBrlans();
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < lbxBrlanIcon.Items.Count; i++)
|
|
if (lbxBrlanIcon.Items[i].ToString().ToLower() == Path.GetFileName(ofd.FileName).ToLower())
|
|
{ errorBox("This file already exists, use the Replace button!"); return; }
|
|
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
{
|
|
iconBin.AddFile("/arc/anim/" + Path.GetFileName(ofd.FileName), File.ReadAllBytes(ofd.FileName));
|
|
}
|
|
else
|
|
{
|
|
newIconBin.AddFile("/arc/anim/" + Path.GetFileName(ofd.FileName), File.ReadAllBytes(ofd.FileName)); ;
|
|
}
|
|
|
|
brlanChanged = true;
|
|
addBrlans();
|
|
}
|
|
}
|
|
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.ToLower() == "banner")
|
|
sfd.FileName = lbxBrlytBanner.SelectedItem.ToString();
|
|
else
|
|
sfd.FileName = lbxBrlytIcon.SelectedItem.ToString();
|
|
|
|
if (sfd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
try
|
|
{
|
|
if (lbBrlytActions.Text.ToLower() == "banner")
|
|
{
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
File.WriteAllBytes(sfd.FileName, bannerBin.Data[bannerBin.GetNodeIndex(lbxBrlytBanner.SelectedItem.ToString())]);
|
|
else
|
|
File.WriteAllBytes(sfd.FileName, newBannerBin.Data[newBannerBin.GetNodeIndex(lbxBrlytBanner.SelectedItem.ToString())]);
|
|
}
|
|
else
|
|
{
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
File.WriteAllBytes(sfd.FileName, iconBin.Data[iconBin.GetNodeIndex(lbxBrlytIcon.SelectedItem.ToString())]);
|
|
else
|
|
File.WriteAllBytes(sfd.FileName, newIconBin.Data[newIconBin.GetNodeIndex(lbxBrlytIcon.SelectedItem.ToString())]);
|
|
}
|
|
}
|
|
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.ToLower() == "banner")
|
|
sfd.FileName = lbxBrlanBanner.SelectedItem.ToString();
|
|
else
|
|
sfd.FileName = lbxBrlanIcon.SelectedItem.ToString();
|
|
|
|
if (sfd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
try
|
|
{
|
|
if (lbBrlanActions.Text.ToLower() == "banner")
|
|
{
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
File.WriteAllBytes(sfd.FileName, bannerBin.Data[bannerBin.GetNodeIndex(lbxBrlanBanner.SelectedItem.ToString())]);
|
|
else
|
|
File.WriteAllBytes(sfd.FileName, newBannerBin.Data[newBannerBin.GetNodeIndex(lbxBrlanBanner.SelectedItem.ToString())]);
|
|
}
|
|
else
|
|
{
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
File.WriteAllBytes(sfd.FileName, iconBin.Data[iconBin.GetNodeIndex(lbxBrlanIcon.SelectedItem.ToString())]);
|
|
else
|
|
File.WriteAllBytes(sfd.FileName, newIconBin.Data[newIconBin.GetNodeIndex(lbxBrlanIcon.SelectedItem.ToString())]);
|
|
}
|
|
}
|
|
catch (Exception ex) { errorBox(ex.Message); }
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnBrlanDelete_Click(object sender, EventArgs e)
|
|
{
|
|
if (!string.IsNullOrEmpty(lbBrlanActions.Text))
|
|
{
|
|
try
|
|
{
|
|
if (lbBrlanActions.Text.ToLower() == "banner")
|
|
{
|
|
if (lbxBrlanBanner.Items.Count > 1)
|
|
{
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
{
|
|
bannerBin.RemoveFile("/arc/anim/" + lbxBrlanBanner.SelectedItem.ToString());
|
|
}
|
|
else
|
|
{
|
|
newBannerBin.RemoveFile("/arc/anim/" + lbxBrlanBanner.SelectedItem.ToString());
|
|
}
|
|
|
|
brlanChanged = true;
|
|
addBrlans();
|
|
}
|
|
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(replacedIcon))
|
|
{
|
|
iconBin.RemoveFile("/arc/anim/" + lbxBrlanBanner.SelectedItem.ToString());
|
|
}
|
|
else
|
|
{
|
|
newIconBin.RemoveFile("/arc/anim/" + lbxBrlanBanner.SelectedItem.ToString());
|
|
}
|
|
|
|
brlanChanged = true;
|
|
addBrlans();
|
|
}
|
|
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.ToLower() == "banner")
|
|
{
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
bannerBin.ReplaceFile(bannerBin.GetNodeIndex(lbxBrlytBanner.SelectedItem.ToString()), File.ReadAllBytes(ofd.FileName));
|
|
else
|
|
newBannerBin.ReplaceFile(newBannerBin.GetNodeIndex(lbxBrlytBanner.SelectedItem.ToString()), File.ReadAllBytes(ofd.FileName));
|
|
|
|
brlytChanged = true;
|
|
}
|
|
else
|
|
{
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
iconBin.ReplaceFile(iconBin.GetNodeIndex(lbxBrlytIcon.SelectedItem.ToString()), File.ReadAllBytes(ofd.FileName));
|
|
else
|
|
newIconBin.ReplaceFile(newIconBin.GetNodeIndex(lbxBrlytIcon.SelectedItem.ToString()), File.ReadAllBytes(ofd.FileName));
|
|
|
|
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.ToLower() == "banner")
|
|
{
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
bannerBin.ReplaceFile(bannerBin.GetNodeIndex(lbxBrlanBanner.SelectedItem.ToString()), File.ReadAllBytes(ofd.FileName));
|
|
else
|
|
newBannerBin.ReplaceFile(newBannerBin.GetNodeIndex(lbxBrlanBanner.SelectedItem.ToString()), File.ReadAllBytes(ofd.FileName));
|
|
|
|
brlanChanged = true;
|
|
}
|
|
else
|
|
{
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
iconBin.ReplaceFile(iconBin.GetNodeIndex(lbxBrlanIcon.SelectedItem.ToString()), File.ReadAllBytes(ofd.FileName));
|
|
else
|
|
newIconBin.ReplaceFile(newIconBin.GetNodeIndex(lbxBrlanIcon.SelectedItem.ToString()), File.ReadAllBytes(ofd.FileName));
|
|
|
|
brlanChanged = true;
|
|
}
|
|
}
|
|
catch (Exception ex) { errorBox(ex.Message); }
|
|
}
|
|
}
|
|
}
|
|
|
|
private void llbUpdateAvailable_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
llbUpdateAvailable.LinkVisited = true;
|
|
Process.Start("https://github.com/Brawl345/customizemii/releases");
|
|
}
|
|
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) - 3);
|
|
string[] requiredTpls = new string[0];
|
|
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
{
|
|
for (int i = 0; i < bannerBin.NumOfNodes; i++)
|
|
{
|
|
if (bannerBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlyt.GetBrlytTpls(bannerBin.Data[i])); }
|
|
else if (bannerBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlan.GetBrlanTpls(bannerBin.Data[i])); }
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newBannerBin.NumOfNodes; i++)
|
|
{
|
|
if (newBannerBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlyt.GetBrlytTpls(newBannerBin.Data[i])); }
|
|
else if (newBannerBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlan.GetBrlanTpls(newBannerBin.Data[i])); }
|
|
}
|
|
}
|
|
|
|
if (!Array.Exists(requiredTpls, thisTpl => thisTpl.ToLower() == tplName.ToLower()) || cbSecurityChecksOff.Checked)
|
|
{
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
{
|
|
bannerBin.RemoveFile("/arc/timg/" + tplName);
|
|
}
|
|
else
|
|
{
|
|
newBannerBin.RemoveFile("/arc/timg/" + tplName);
|
|
}
|
|
|
|
addTpls();
|
|
}
|
|
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--; }
|
|
|
|
if (idx < -1) break;
|
|
}
|
|
}
|
|
|
|
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) - 3);
|
|
string[] requiredTpls = new string[0];
|
|
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
{
|
|
for (int i = 0; i < iconBin.NumOfNodes; i++)
|
|
{
|
|
if (iconBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlyt.GetBrlytTpls(iconBin.Data[i])); }
|
|
else if (iconBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlan.GetBrlanTpls(iconBin.Data[i])); }
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newIconBin.NumOfNodes; i++)
|
|
{
|
|
if (newIconBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlyt.GetBrlytTpls(newIconBin.Data[i])); }
|
|
else if (newIconBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlan.GetBrlanTpls(newIconBin.Data[i])); }
|
|
}
|
|
}
|
|
|
|
if (!Array.Exists(requiredTpls, thisTpl => thisTpl.ToLower() == tplName.ToLower()) || cbSecurityChecksOff.Checked)
|
|
{
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
{
|
|
iconBin.RemoveFile("/arc/timg/" + tplName);
|
|
}
|
|
else
|
|
{
|
|
newIconBin.RemoveFile("/arc/timg/" + tplName);
|
|
}
|
|
|
|
addTpls();
|
|
}
|
|
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--; }
|
|
|
|
if (idx < -1) break;
|
|
}
|
|
}
|
|
|
|
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.ToLower() == "banner")
|
|
{
|
|
string[] requiredTpls = new string[0];
|
|
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
{
|
|
for (int i = 0; i < bannerBin.NumOfNodes; i++)
|
|
{
|
|
if (bannerBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlyt.GetBrlytTpls(bannerBin.Data[i])); }
|
|
else if (bannerBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlan.GetBrlanTpls(bannerBin.Data[i])); }
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newBannerBin.NumOfNodes; i++)
|
|
{
|
|
if (newBannerBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlyt.GetBrlytTpls(newBannerBin.Data[i])); }
|
|
else if (newBannerBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlan.GetBrlanTpls(newBannerBin.Data[i])); }
|
|
}
|
|
}
|
|
|
|
MessageBox.Show("These are the TPLs required by your banner.brlyt:\n\n" +
|
|
string.Join("\n", requiredTpls), "TPLs specified in banner.brlyt", MessageBoxButtons.OK,
|
|
MessageBoxIcon.Information);
|
|
}
|
|
else
|
|
{
|
|
string[] requiredTpls = new string[0];
|
|
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
{
|
|
for (int i = 0; i < iconBin.NumOfNodes; i++)
|
|
{
|
|
if (iconBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlyt.GetBrlytTpls(iconBin.Data[i])); }
|
|
else if (iconBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlan.GetBrlanTpls(iconBin.Data[i])); }
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newIconBin.NumOfNodes; i++)
|
|
{
|
|
if (newIconBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlyt.GetBrlytTpls(newIconBin.Data[i])); }
|
|
else if (newIconBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ requiredTpls = Shared.MergeStringArrays(requiredTpls, Brlan.GetBrlanTpls(newIconBin.Data[i])); }
|
|
}
|
|
}
|
|
|
|
MessageBox.Show("These are the TPLs required by your icon.brlyt:\n\n" +
|
|
string.Join("\n", requiredTpls), "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) - 3));
|
|
}
|
|
}
|
|
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) - 3));
|
|
}
|
|
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) - 3));
|
|
}
|
|
}
|
|
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) - 3));
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
lbxIconTpls.Focus();
|
|
}
|
|
}
|
|
|
|
private void btnForwarder_Click(object sender, EventArgs e)
|
|
{
|
|
if (checkForForwardMii() == true)
|
|
{
|
|
if (checkDevKit() == false)
|
|
forwarderDialogSimple();
|
|
else
|
|
cmForwarder.Show(MousePosition);
|
|
}
|
|
else errorBox("ForwardMii.dll wasn't found!");
|
|
}
|
|
|
|
private void cmForwarderItem_Click(object sender, EventArgs e)
|
|
{
|
|
ToolStripMenuItem cmSender = sender as ToolStripMenuItem;
|
|
|
|
if (cmSender == cmSimpleForwarder)
|
|
forwarderDialogSimple();
|
|
else
|
|
{
|
|
try { forwarderDialogComplex(); }
|
|
catch (Exception ex) { errorBox(ex.Message); }
|
|
}
|
|
}
|
|
|
|
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 + Path.DirectorySeparatorChar + "Banner";
|
|
iconPath = fbd.SelectedPath + Path.DirectorySeparatorChar + "Icon";
|
|
break;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(bannerPath))
|
|
{
|
|
if (!Directory.Exists(bannerPath)) Directory.CreateDirectory(bannerPath);
|
|
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
{
|
|
for (int i = 0; i < bannerBin.NumOfNodes; i++)
|
|
{
|
|
if (bannerBin.StringTable[i].ToLower().EndsWith(".tpl"))
|
|
{
|
|
Image img = TPL.Load(bannerBin.Data[i]).ExtractTexture();
|
|
img.Save(bannerPath + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(bannerBin.StringTable[i]) + ".png");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newBannerBin.NumOfNodes; i++)
|
|
{
|
|
if (newBannerBin.StringTable[i].ToLower().EndsWith(".tpl"))
|
|
{
|
|
Image img = TPL.Load(newBannerBin.Data[i]).ExtractTexture();
|
|
img.Save(bannerPath + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(newBannerBin.StringTable[i]) + ".png");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(iconPath))
|
|
{
|
|
if (!Directory.Exists(iconPath)) Directory.CreateDirectory(iconPath);
|
|
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
{
|
|
for (int i = 0; i < iconBin.NumOfNodes; i++)
|
|
{
|
|
if (iconBin.StringTable[i].ToLower().EndsWith(".tpl"))
|
|
{
|
|
Image img = TPL.Load(iconBin.Data[i]).ExtractTexture();
|
|
img.Save(iconPath + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(iconBin.StringTable[i]) + ".png");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newIconBin.NumOfNodes; i++)
|
|
{
|
|
if (newIconBin.StringTable[i].ToLower().EndsWith(".tpl"))
|
|
{
|
|
Image img = TPL.Load(newIconBin.Data[i]).ExtractTexture();
|
|
img.Save(iconPath + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(newIconBin.StringTable[i]) + ".png");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
infoBox("Extracted images successfully!");
|
|
}
|
|
}
|
|
catch (Exception ex) { errorBox(ex.Message); }
|
|
}
|
|
else if (cmSender.OwnerItem == tsExtractSound)
|
|
{
|
|
try
|
|
{
|
|
byte[] soundFile = new byte[0];
|
|
|
|
if (string.IsNullOrEmpty(replacedSound))
|
|
{
|
|
for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++)
|
|
{
|
|
if (sourceWad.BannerApp.StringTable[i].ToLower() == "sound.bin")
|
|
soundFile = sourceWad.BannerApp.Data[i];
|
|
}
|
|
}
|
|
else
|
|
{ soundFile = newSoundBin; }
|
|
|
|
SaveFileDialog sfd = new SaveFileDialog();
|
|
if (cmSender.Name.ToLower() == "cmextractsoundasbin") { sfd.Filter = "BIN|*.bin"; sfd.FileName = "sound.bin"; }
|
|
else if (cmSender.Name.ToLower() == "cmextractsoundasaudio")
|
|
{
|
|
if (soundFile[32] == 'R' && soundFile[33] == 'I' && soundFile[34] == 'F' && soundFile[35] == 'F')
|
|
{ sfd.Filter = "Wave|*.wav"; sfd.FileName = "sound.wav"; }
|
|
else if (soundFile[32] == 'B' && soundFile[33] == 'N' && soundFile[34] == 'S' && soundFile[35] == ' ')
|
|
{ sfd.Filter = "Wave|*.wav"; sfd.FileName = "sound.wav"; }
|
|
else if (soundFile[32] == 'F' && soundFile[33] == 'O' && soundFile[34] == 'R' && soundFile[35] == 'M')
|
|
{ sfd.Filter = "AIFF|*.aif;*.aiff"; sfd.FileName = "sound.aif"; }
|
|
else if (soundFile[32] == 'L' && soundFile[33] == 'Z' && soundFile[34] == '7' && soundFile[35] == '7')
|
|
{
|
|
if (soundFile[41] == 'R' && soundFile[42] == 'I' && soundFile[43] == 'F' && soundFile[44] == 'F')
|
|
{ sfd.Filter = "Wave|*.wav"; sfd.FileName = "sound.wav"; }
|
|
else if (soundFile[41] == 'B' && soundFile[42] == 'N' && soundFile[43] == 'S' && soundFile[44] == ' ')
|
|
{ sfd.Filter = "Wave|*.wav"; sfd.FileName = "sound.wave"; }
|
|
else if (soundFile[41] == 'F' && soundFile[42] == 'O' && soundFile[43] == 'R' && soundFile[44] == '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 (File.Exists(sfd.FileName)) File.Delete(sfd.FileName);
|
|
|
|
if (sfd.FileName.ToLower().EndsWith(".bin"))
|
|
{
|
|
File.WriteAllBytes(sfd.FileName, soundFile);
|
|
infoBox("The sound.bin was successfully extraced!");
|
|
}
|
|
else
|
|
{
|
|
soundFile = Headers.IMD5.RemoveHeader(soundFile);
|
|
|
|
if (Lz77.IsLz77Compressed(soundFile))
|
|
{ Lz77 l = new Lz77(); soundFile = l.Decompress(soundFile); }
|
|
|
|
if (soundFile[0] == 'B' && soundFile[1] == 'N' && soundFile[2] == 'S' && soundFile[3] == ' ')
|
|
{
|
|
Wave w = BNS.BnsToWave(soundFile);
|
|
w.Save(sfd.FileName);
|
|
w.Dispose();
|
|
}
|
|
else
|
|
File.WriteAllBytes(sfd.FileName, soundFile);
|
|
|
|
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
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
{
|
|
for (int i = 0; i < bannerBin.NumOfNodes; i++)
|
|
{
|
|
if (bannerBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ File.WriteAllBytes(fbd.SelectedPath + Path.DirectorySeparatorChar + bannerBin.StringTable[i], bannerBin.Data[i]); }
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newBannerBin.NumOfNodes; i++)
|
|
{
|
|
if (newBannerBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ File.WriteAllBytes(fbd.SelectedPath + Path.DirectorySeparatorChar + newBannerBin.StringTable[i], newBannerBin.Data[i]); }
|
|
}
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
{
|
|
for (int i = 0; i < iconBin.NumOfNodes; i++)
|
|
{
|
|
if (iconBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ File.WriteAllBytes(fbd.SelectedPath + Path.DirectorySeparatorChar + iconBin.StringTable[i], iconBin.Data[i]); }
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newIconBin.NumOfNodes; i++)
|
|
{
|
|
if (newIconBin.StringTable[i].ToLower().EndsWith(".brlyt"))
|
|
{ File.WriteAllBytes(fbd.SelectedPath + Path.DirectorySeparatorChar + newIconBin.StringTable[i], newIconBin.Data[i]); }
|
|
}
|
|
}
|
|
}
|
|
|
|
if (cmSender == cmExtractBothBrl || cmSender == cmExtractBrlan)
|
|
{
|
|
//Extract brlans
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
{
|
|
for (int i = 0; i < bannerBin.NumOfNodes; i++)
|
|
{
|
|
if (bannerBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ File.WriteAllBytes(fbd.SelectedPath + Path.DirectorySeparatorChar + bannerBin.StringTable[i], bannerBin.Data[i]); }
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newBannerBin.NumOfNodes; i++)
|
|
{
|
|
if (newBannerBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ File.WriteAllBytes(fbd.SelectedPath + Path.DirectorySeparatorChar + newBannerBin.StringTable[i], newBannerBin.Data[i]); }
|
|
}
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
{
|
|
for (int i = 0; i < iconBin.NumOfNodes; i++)
|
|
{
|
|
if (iconBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ File.WriteAllBytes(fbd.SelectedPath + Path.DirectorySeparatorChar + iconBin.StringTable[i], iconBin.Data[i]); }
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < newIconBin.NumOfNodes; i++)
|
|
{
|
|
if (newIconBin.StringTable[i].ToLower().EndsWith(".brlan"))
|
|
{ File.WriteAllBytes(fbd.SelectedPath + Path.DirectorySeparatorChar + newIconBin.StringTable[i], newIconBin.Data[i]); }
|
|
}
|
|
}
|
|
}
|
|
|
|
infoBox("Extracted files successfully!");
|
|
}
|
|
}
|
|
catch (Exception ex) { errorBox(ex.Message); }
|
|
}
|
|
else //DOL
|
|
{
|
|
try
|
|
{
|
|
if (sourceWad.NumOfContents == 3)
|
|
{
|
|
int appIndex = 0;
|
|
if (sourceWad.BootIndex == 1) appIndex = 2;
|
|
else if (sourceWad.BootIndex == 2) appIndex = 1;
|
|
|
|
if (appIndex > 0)
|
|
{
|
|
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)
|
|
{
|
|
if (File.Exists(sfd.FileName)) File.Delete(sfd.FileName);
|
|
File.WriteAllBytes(sfd.FileName, sourceWad.Contents[appIndex]);
|
|
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 + Path.DirectorySeparatorChar + "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
|
|
{
|
|
replacedSound = ofd.FileName;
|
|
setControlText(tbSound, ofd.FileName);
|
|
btnBrowseSound.Text = "Clear";
|
|
|
|
newSoundBin = Headers.IMD5.AddHeader(File.ReadAllBytes(ofd.FileName));
|
|
|
|
if (cmbReplace.SelectedIndex == 2) setControlText(tbReplace, string.Empty);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void cmConvertToBns_Click(object sender, EventArgs e)
|
|
{
|
|
if (pbProgress.Value == 100)
|
|
{
|
|
CustomizeMii_BnsConvert bnsConvert = new CustomizeMii_BnsConvert(File.Exists(Application.StartupPath + Path.DirectorySeparatorChar + "lame.exe"));
|
|
|
|
for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++)
|
|
{
|
|
if (sourceWad.BannerApp.StringTable[i].ToLower() == "sound.bin")
|
|
bnsConvert.SourceSound = Headers.IMD5.RemoveHeader(sourceWad.BannerApp.Data[i]);
|
|
}
|
|
|
|
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.loopType = BnsConversionInfo.LoopType.FromWave; }
|
|
else if (bnsConvert.LoopManually)
|
|
{ bnsInfo.loopStartSample = bnsConvert.LoopStartSample; bnsInfo.loopType = BnsConversionInfo.LoopType.Manual; }
|
|
else bnsInfo.loopType = 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)
|
|
{
|
|
string unpackDir = string.Format("{0} - {1}", sourceWad.ChannelTitles[1], sourceWad.UpperTitleID);
|
|
|
|
FolderBrowserDialog fbd = new FolderBrowserDialog();
|
|
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)
|
|
{
|
|
if (!Directory.Exists(fbd.SelectedPath + Path.DirectorySeparatorChar + unpackDir)) Directory.CreateDirectory(fbd.SelectedPath + Path.DirectorySeparatorChar + unpackDir);
|
|
sourceWad.Unpack(fbd.SelectedPath + Path.DirectorySeparatorChar + unpackDir, false);
|
|
|
|
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
|
|
{
|
|
WAD tmpWad = WAD.Load(ofd.FileName);
|
|
|
|
if (tmpWad.NumOfContents == 3)
|
|
{
|
|
int appIndex = 0;
|
|
if (tmpWad.BootIndex == 1) appIndex = 2;
|
|
else if (tmpWad.BootIndex == 2) appIndex = 1;
|
|
|
|
if (appIndex > 0)
|
|
{
|
|
newDol = tmpWad.Contents[appIndex];
|
|
setControlText(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)
|
|
{
|
|
setControlText(tbDol, string.Empty);
|
|
btnBrowseDol.Text = "Browse...";
|
|
errorBox(ex.Message);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
newDol = File.ReadAllBytes(ofd.FileName);
|
|
setControlText(tbDol, ofd.FileName);
|
|
btnBrowseDol.Text = "Clear";
|
|
}
|
|
}
|
|
}
|
|
|
|
private void cmDolFromSource_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (sourceWad.NumOfContents == 3)
|
|
{
|
|
int appIndex = 0;
|
|
if (sourceWad.BootIndex == 1) appIndex = 2;
|
|
else if (sourceWad.BootIndex == 2) appIndex = 1;
|
|
|
|
if (appIndex > 0)
|
|
{
|
|
newDol = sourceWad.Contents[appIndex];
|
|
setControlText(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)
|
|
{
|
|
setControlText(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);
|
|
}
|
|
|
|
private void lbxBannerTpls_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
if (e.Button == MouseButtons.Right)
|
|
{
|
|
lbxBannerTpls.SelectedIndex = lbxBannerTpls.IndexFromPoint(e.X, e.Y);
|
|
cmTpls.Tag = "banner";
|
|
cmTpls.Show(MousePosition);
|
|
}
|
|
}
|
|
|
|
private void lbxIconTpls_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
if (e.Button == MouseButtons.Right)
|
|
{
|
|
lbxIconTpls.SelectedIndex = lbxIconTpls.IndexFromPoint(e.X, e.Y);
|
|
cmTpls.Tag = "icon";
|
|
cmTpls.Show(MousePosition);
|
|
}
|
|
}
|
|
|
|
private void cmRename_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
ListBox lbx = (((ToolStripMenuItem)sender).Owner.Tag.ToString().ToLower().Contains("banner")) ? lbxBannerTpls : lbxIconTpls;
|
|
|
|
string oldNameFull = lbx.SelectedItem.ToString();
|
|
string oldName = lbx.SelectedItem.ToString().Remove(lbx.SelectedItem.ToString().IndexOf('(') - 3);
|
|
CustomizeMii_InputBox ib = new CustomizeMii_InputBox();
|
|
ib.Description = "Please enter a new name:";
|
|
ib.Input = oldName;
|
|
ib.CommonKeyMode = false;
|
|
ib.tbInput.MaxLength = 127;
|
|
ib.btnExit.Text = "Close";
|
|
|
|
if (ib.ShowDialog() == DialogResult.OK && oldName != ib.Input && !string.IsNullOrEmpty(ib.Input))
|
|
{
|
|
string newName = ib.Input;
|
|
if (!newName.ToLower().EndsWith(".tpl")) newName += ".tpl";
|
|
|
|
foreach (char thisChar in Path.GetInvalidFileNameChars())
|
|
if (newName.Contains(thisChar.ToString()))
|
|
throw new Exception(string.Format("Invalid path char \"{0}\" found in new name!", thisChar));
|
|
|
|
if (lbx == lbxBannerTpls)
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
bannerBin.RenameNode(oldName, newName);
|
|
else
|
|
newBannerBin.RenameNode(oldName, newName);
|
|
else
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
iconBin.RenameNode(oldName, newName);
|
|
else
|
|
newIconBin.RenameNode(oldName, newName);
|
|
|
|
addTpls();
|
|
|
|
try { lbx.SelectedItem = oldNameFull.Replace(oldName, newName); }
|
|
catch { }
|
|
}
|
|
}
|
|
catch (Exception ex) { errorBox(ex.Message); }
|
|
}
|
|
|
|
private void cmResize_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
ListBox lbx = (((ToolStripMenuItem)sender).Owner.Tag.ToString().ToLower().Contains("banner")) ? lbxBannerTpls : lbxIconTpls;
|
|
|
|
int selectedIndex = lbx.SelectedIndex;
|
|
string tplName = lbx.SelectedItem.ToString().Remove(lbx.SelectedItem.ToString().IndexOf('(') - 3);
|
|
|
|
Size oldSize;
|
|
|
|
if (lbx == lbxBannerTpls)
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
{ oldSize = TPL.Load(bannerBin.Data[bannerBin.GetNodeIndex(tplName)]).GetTextureSize(0); }
|
|
else
|
|
{ oldSize = TPL.Load(newBannerBin.Data[newBannerBin.GetNodeIndex(tplName)]).GetTextureSize(0); }
|
|
else
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
{ oldSize = TPL.Load(iconBin.Data[iconBin.GetNodeIndex(tplName)]).GetTextureSize(0); }
|
|
else
|
|
{ oldSize = TPL.Load(newIconBin.Data[newIconBin.GetNodeIndex(tplName)]).GetTextureSize(0); }
|
|
|
|
CustomizeMii_InputBox ib = new CustomizeMii_InputBox();
|
|
ib.Description = "Please enter a new size:";
|
|
ib.tbInput.Size = new Size(ib.btnExit.Width, ib.tbInput.Height);
|
|
ib.tbInput2.Visible = true;
|
|
ib.CommonKeyMode = false;
|
|
ib.tbInput.MaxLength = 127;
|
|
ib.btnExit.Text = "Close";
|
|
ib.Input = oldSize.Width.ToString();
|
|
ib.Input2 = oldSize.Height.ToString();
|
|
|
|
if (ib.ShowDialog() == DialogResult.OK)
|
|
{
|
|
Size newSize = new Size(int.Parse(ib.Input), int.Parse(ib.Input2));
|
|
if (newSize == oldSize) return;
|
|
|
|
TPL tmpTpl;
|
|
|
|
if (lbx == lbxBannerTpls)
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
tmpTpl = TPL.Load(bannerBin.Data[bannerBin.GetNodeIndex(tplName)]);
|
|
else
|
|
tmpTpl = TPL.Load(newBannerBin.Data[newBannerBin.GetNodeIndex(tplName)]);
|
|
else
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
tmpTpl = TPL.Load(iconBin.Data[iconBin.GetNodeIndex(tplName)]);
|
|
else
|
|
tmpTpl = TPL.Load(newIconBin.Data[newIconBin.GetNodeIndex(tplName)]);
|
|
|
|
TPL_TextureFormat tplFormat = tmpTpl.GetTextureFormat(0);
|
|
Image newImg = resizeImage(tmpTpl.ExtractTexture(0), newSize.Width, newSize.Height);
|
|
|
|
tmpTpl.RemoveTexture(0);
|
|
tmpTpl.AddTexture(newImg, tplFormat);
|
|
|
|
if (lbx == lbxBannerTpls)
|
|
if (string.IsNullOrEmpty(replacedBanner))
|
|
bannerBin.ReplaceFile(bannerBin.GetNodeIndex(tplName), tmpTpl.ToByteArray());
|
|
else
|
|
newBannerBin.ReplaceFile(newBannerBin.GetNodeIndex(tplName), tmpTpl.ToByteArray());
|
|
else
|
|
if (string.IsNullOrEmpty(replacedIcon))
|
|
iconBin.ReplaceFile(iconBin.GetNodeIndex(tplName), tmpTpl.ToByteArray());
|
|
else
|
|
newIconBin.ReplaceFile(newIconBin.GetNodeIndex(tplName), tmpTpl.ToByteArray());
|
|
|
|
addTpls();
|
|
|
|
try { lbx.SelectedIndex = selectedIndex; }
|
|
catch { }
|
|
}
|
|
}
|
|
catch (Exception ex) { errorBox(ex.Message); }
|
|
}
|
|
|
|
private void cmMakeSilent_Click(object sender, EventArgs e)
|
|
{
|
|
Wave w = new Wave(1, 8, 500, new byte[] { 0x80, 0x80, 0x80, 0x80, 0x80 });
|
|
newSoundBin = Headers.IMD5.AddHeader(w.ToByteArray());
|
|
w.Dispose();
|
|
|
|
replacedSound = "Silence";
|
|
setControlText(tbSound, "Silence");
|
|
btnBrowseSound.Text = "Clear";
|
|
|
|
if (cmbReplace.SelectedIndex == 2) setControlText(tbReplace, string.Empty);
|
|
}
|
|
|
|
private void lbxBaseWads_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void tabCredits_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|