Ejemplo n.º 1
0
        void bwCreateWad_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bwCreateWad   = sender as BackgroundWorker;
            Stopwatch        creationTimer = new Stopwatch();

            creationTimer.Start();

            try
            {
                WadCreationInfo wadInfo = (WadCreationInfo)e.Argument;


                disableControls();

                //Check Startup IOS
                if (wadInfo.startupIos < 0 || wadInfo.startupIos > 255)
                {
                    throw new Exception("Startup IOS must be between 0 and 255!");
                }

                wadInfo.success      = false;
                wadInfo.sendWadReady = false;
                wadCreationInfo      = wadInfo;

                //Make TPLs transparent
                makeBannerTplsTransparent();
                makeIconTplsTransparent();

                //Pack icon.bin
                bwCreateWad.ReportProgress(0, "Packing icon.bin...");
                if (string.IsNullOrEmpty(replacedIcon))
                {
                    iconBin.AddHeaderImd5();
                    iconBin.Lz77Compress = wadInfo.lz77;

                    for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++)
                    {
                        if (sourceWad.BannerApp.StringTable[i].ToLower() == "icon.bin")
                        {
                            sourceWad.BannerApp.ReplaceFile(i, iconBin.ToByteArray()); break;
                        }
                    }
                }
                else
                {
                    newIconBin.AddHeaderImd5();
                    newIconBin.Lz77Compress = wadInfo.lz77;

                    for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++)
                    {
                        if (sourceWad.BannerApp.StringTable[i].ToLower() == "icon.bin")
                        {
                            sourceWad.BannerApp.ReplaceFile(i, newIconBin.ToByteArray()); break;
                        }
                    }
                }

                //Pack banner.bin
                bwCreateWad.ReportProgress(20, "Packing banner.bin...");
                if (string.IsNullOrEmpty(replacedBanner))
                {
                    bannerBin.AddHeaderImd5();
                    bannerBin.Lz77Compress = wadInfo.lz77;

                    for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++)
                    {
                        if (sourceWad.BannerApp.StringTable[i].ToLower() == "banner.bin")
                        {
                            sourceWad.BannerApp.ReplaceFile(i, bannerBin.ToByteArray()); break;
                        }
                    }
                }
                else
                {
                    newBannerBin.AddHeaderImd5();
                    bannerBin.Lz77Compress = wadInfo.lz77;

                    for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++)
                    {
                        if (sourceWad.BannerApp.StringTable[i].ToLower() == "banner.bin")
                        {
                            sourceWad.BannerApp.ReplaceFile(i, newBannerBin.ToByteArray()); break;
                        }
                    }
                }

                //Pack sound.bin
                bwCreateWad.ReportProgress(40, "Packing sound.bin...");
                if (!string.IsNullOrEmpty(replacedSound) || !string.IsNullOrEmpty(wadInfo.sound))
                {
                    for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++)
                    {
                        if (sourceWad.BannerApp.StringTable[i].ToLower() == "sound.bin")
                        {
                            sourceWad.BannerApp.ReplaceFile(i, newSoundBin); break;
                        }
                    }
                }

                //Insert new dol
                if (!string.IsNullOrEmpty(wadInfo.dol))
                {
                    bwCreateWad.ReportProgress(50, "Inserting DOL...");
                    sourceWad.RemoveAllContents();

                    if (wadInfo.nandLoader == WadCreationInfo.NandLoader.comex)
                    {
                        sourceWad.AddContent(Properties.Resources.comex, 1, 1, ContentType.Normal);

                        if (wadInfo.dol.StartsWith("Simple Forwarder:"))
                        {
                            sourceWad.AddContent(createForwarderSimple(), 2, 2, ContentType.Normal);
                        }
                        else if (wadInfo.dol.StartsWith("Complex Forwarder"))
                        {
                            bwCreateWad.ReportProgress(55, "Compiling Forwarder...");
                            sourceWad.AddContent(createForwarderComplex(), 2, 2, ContentType.Normal);
                        }
                        else
                        {
                            sourceWad.AddContent(newDol, 2, 2, ContentType.Normal);
                        }

                        sourceWad.BootIndex = 1;
                    }
                    else
                    {
                        sourceWad.AddContent(Properties.Resources.Waninkoko, 2, 2, ContentType.Normal);

                        if (wadInfo.dol.StartsWith("Simple Forwarder:"))
                        {
                            sourceWad.AddContent(createForwarderSimple(), 1, 1, ContentType.Normal);
                        }
                        else if (wadInfo.dol.StartsWith("Complex Forwarder"))
                        {
                            bwCreateWad.ReportProgress(55, "Compiling Forwarder...");
                            sourceWad.AddContent(createForwarderComplex(), 1, 1, ContentType.Normal);
                        }
                        else
                        {
                            sourceWad.AddContent(newDol, 1, 1, ContentType.Normal);
                        }

                        sourceWad.BootIndex = 2;
                    }
                }

                //Change channel information
                for (int i = 0; i < wadInfo.titles.Length; i++)
                {
                    if (string.IsNullOrEmpty(wadInfo.titles[i]))
                    {
                        wadInfo.titles[i] = wadInfo.allLangTitle;
                    }
                }

                bwCreateWad.ReportProgress(75, "Updating Channel Information...");
                sourceWad.ChangeStartupIOS(wadInfo.startupIos);
                sourceWad.ChangeChannelTitles(wadInfo.titles);
                if (!string.IsNullOrEmpty(wadInfo.titleId))
                {
                    sourceWad.ChangeTitleID(LowerTitleID.Channel, wadInfo.titleId);
                }

                sourceWad.FakeSign = true;
                sourceWad.ChangeTitleKey("GottaGetSomeBeer");

                //Pack WAD
                bwCreateWad.ReportProgress(80, "Packing WAD...");
                if (!wadInfo.sendToWii)
                {
                    sourceWad.Save(wadInfo.outFile);
                }
                else
                {
                    wadInfo.wadFile = sourceWad.ToByteArray();
                }

                bwCreateWad.ReportProgress(100, " ");
                creationTimer.Stop();

                if (!wadInfo.sendToWii)
                {
                    FileInfo fi       = new FileInfo(wadInfo.outFile);
                    double   fileSize = Math.Round(fi.Length * 0.0009765625 * 0.0009765625, 2);

                    infoBox(string.Format("Successfully created custom channel!\nTime elapsed: {0} ms\nFilesize: {1} MB\nApprox. Blocks: {2}", creationTimer.ElapsedMilliseconds, fileSize, sourceWad.NandBlocks));
                }
                else
                {
                    wadInfo.sendWadReady = true;
                }

                wadCreationInfo         = wadInfo;
                wadCreationInfo.success = true;
            }
            catch (Exception ex)
            {
                wadCreationInfo.sendWadReady = false;
                creationTimer.Stop();

                enableControls();
                errorBox(ex.Message);
            }
        }