using LibOrbisPkg.GP4; using LibOrbisPkg.PKG; using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Net; using System.Net.Cache; using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; using System.Xml; namespace GayMaker_Studio { public partial class GayMakerStudio : Form { public String CurrentVerison = "1.2.1"; bool HasShaders = false; public GayMakerStudio() { //Bypass Windows DPI Scaling Font = new Font(Font.Name, 8.25f * 96f / CreateGraphics().DpiX, Font.Style, Font.Unit, Font.GdiCharSet, Font.GdiVerticalFont); InitializeComponent(); } public String GetProjectPath() //For GlobalGameSettings { return projectPath.Text; } private bool isValidContentId(string contentId) { if(contentId.Length == 36) if (Char.IsLetter(contentId[0])) if (Char.IsUpper(contentId[0])) if (Char.IsLetter(contentId[1])) if (Char.IsUpper(contentId[1])) if (Char.IsNumber(contentId[2])) if (Char.IsNumber(contentId[3])) if (Char.IsNumber(contentId[4])) if (Char.IsNumber(contentId[5])) if (contentId[6] == '-') if (Char.IsLetter(contentId[7])) if (Char.IsUpper(contentId[7])) if (Char.IsLetter(contentId[8])) if (Char.IsUpper(contentId[8])) if (Char.IsLetter(contentId[9])) if (Char.IsUpper(contentId[9])) if (Char.IsLetter(contentId[10])) if (Char.IsUpper(contentId[10])) if (Char.IsNumber(contentId[11])) if (Char.IsNumber(contentId[12])) if (Char.IsNumber(contentId[13])) if (Char.IsNumber(contentId[14])) if (Char.IsNumber(contentId[15])) if (contentId[16] == '_') if (Char.IsNumber(contentId[17])) if (Char.IsNumber(contentId[18])) if (contentId[19] == '-') if ((Char.IsNumber(contentId[20])) || (Char.IsLetter(contentId[20]) && Char.IsUpper(contentId[20]))) if ((Char.IsNumber(contentId[21])) || (Char.IsLetter(contentId[21]) && Char.IsUpper(contentId[21]))) if ((Char.IsNumber(contentId[22])) || (Char.IsLetter(contentId[22]) && Char.IsUpper(contentId[22]))) if ((Char.IsNumber(contentId[23])) || (Char.IsLetter(contentId[23]) && Char.IsUpper(contentId[23]))) if ((Char.IsNumber(contentId[24])) || (Char.IsLetter(contentId[24]) && Char.IsUpper(contentId[24]))) if ((Char.IsNumber(contentId[25])) || (Char.IsLetter(contentId[25]) && Char.IsUpper(contentId[25]))) if ((Char.IsNumber(contentId[26])) || (Char.IsLetter(contentId[26]) && Char.IsUpper(contentId[26]))) if ((Char.IsNumber(contentId[27])) || (Char.IsLetter(contentId[27]) && Char.IsUpper(contentId[27]))) if ((Char.IsNumber(contentId[28])) || (Char.IsLetter(contentId[28]) && Char.IsUpper(contentId[28]))) if ((Char.IsNumber(contentId[29])) || (Char.IsLetter(contentId[29]) && Char.IsUpper(contentId[29]))) if ((Char.IsNumber(contentId[30])) || (Char.IsLetter(contentId[30]) && Char.IsUpper(contentId[30]))) if ((Char.IsNumber(contentId[31])) || (Char.IsLetter(contentId[31]) && Char.IsUpper(contentId[31]))) if ((Char.IsNumber(contentId[32])) || (Char.IsLetter(contentId[32]) && Char.IsUpper(contentId[32]))) if ((Char.IsNumber(contentId[33])) || (Char.IsLetter(contentId[33]) && Char.IsUpper(contentId[33]))) if ((Char.IsNumber(contentId[34])) || (Char.IsLetter(contentId[34]) && Char.IsUpper(contentId[34]))) if ((Char.IsNumber(contentId[35])) || (Char.IsLetter(contentId[35]) && Char.IsUpper(contentId[35]))) return true; return false; } private bool canMakePkg() { if (File.Exists(projectPath.Text)) if (isValidContentId(contentID.Text)) return true; return false; } private void reloadIcons() { IconPreview.BackgroundImage.Dispose(); IconPreview2.BackgroundImage.Dispose(); StartupPreview.BackgroundImage.Dispose(); Image IBG = new Bitmap(iconPath.Text); IconPreview.BackgroundImage = IBG; IconPreview2.BackgroundImage = IBG; Image PBG = new Bitmap(picPath.Text); StartupPreview.BackgroundImage = PBG; } private void GayMakerStudio_FormClosing(object sender, FormClosingEventArgs e) { try { Microsoft.Win32.RegistryKey key; key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\GayMakerStudio"); key.SetValue("project", projectPath.Text); key.SetValue("icon0", iconPath.Text); key.SetValue("pic1", picPath.Text); key.SetValue("title", titleName.Text); key.SetValue("contentID", contentID.Text); key.SetValue("version", VersionSelect.SelectedIndex); key.Close(); } catch (Exception) { MessageBox.Show("Failed to save settings to registry.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void CheckForUpdates() { WebClient wc = new WebClient(); wc.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); String UpdateString = wc.DownloadString("https://raw.githubusercontent.com/KuromeSan/GayMaker-Studio/master/latest.md"); String[] Data = UpdateString.Split('~'); if (Data[0] != CurrentVerison) { DialogResult yesOrNo = MessageBox.Show("An update to GayMaker: Studio was found, Version: " + Data[0] + "\nWant to download it?\n\nThis system software update improves system performance.", "UPDATE FOUND!", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (yesOrNo == DialogResult.Yes) { DownloadingUpdate updateForm = new DownloadingUpdate(); this.Hide(); updateForm.ShowDialog(); this.Close(); this.Dispose(); } } } private void GayMakerStudio_Load(object sender, EventArgs e) { this.Text += CurrentVerison; ReloadVersions(); String OldEXEPath = Path.ChangeExtension(Assembly.GetExecutingAssembly().Location,".old"); if(File.Exists(OldEXEPath)) { File.Delete(OldEXEPath); } try { CheckForUpdates(); } catch (Exception) { }; try { Microsoft.Win32.RegistryKey key; key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\GayMakerStudio"); projectPath.Text = key.GetValue("project").ToString(); iconPath.Text = key.GetValue("icon0").ToString(); picPath.Text = key.GetValue("pic1").ToString(); titleName.Text = key.GetValue("title").ToString(); contentID.Text = key.GetValue("contentID").ToString(); int VerIndex = 0; int.TryParse(key.GetValue("version").ToString(), out VerIndex); VersionSelect.SelectedIndex = VerIndex; homeScreen.Checked = true; startupScreen.Checked = false; homePreview.Visible = true; StartupPreview.Visible = false; key.Close(); reloadIcons(); } catch (Exception) { }; if (!File.Exists(iconPath.Text)) { iconPath.Text = "img\\icon0.png"; } if (!File.Exists(picPath.Text)) { picPath.Text = "img\\pic1.png"; } if (!File.Exists(projectPath.Text)) { projectPath.Text = "(none)"; } else { GlobalGameSettings.Enabled = true; } CreatePKG.Enabled = canMakePkg(); } private void titleName_TextChanged(object sender, EventArgs e) { homeScreen.Checked = true; Title.Text = titleName.Text; } private void homeScreen_CheckedChanged(object sender, EventArgs e) { homePreview.Visible = true; StartupPreview.Visible = false; } private void startupScreen_CheckedChanged(object sender, EventArgs e) { homePreview.Visible = false ; StartupPreview.Visible = true; } private void contentID_TextChanged(object sender, EventArgs e) { if(isValidContentId(contentID.Text)) { titleID.Text = contentID.Text.Substring(7, 9); } else { titleID.Text = "(INVALID)"; } CreatePKG.Enabled = canMakePkg(); } private void browseProject_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = "GameMaker Studio Project Files|*.project.gmx;*.yyp|GameMaker Studio 1.x Project Files|*.project.gmx|GameMaker Studio 2.x Project Files|*.yyp"; openFileDialog1.Title = "Select a GameMaker Studio Project File"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { titleName.Text = "GameMaker: Studio"; iconPath.Text = "img\\icon0.png"; picPath.Text = "img\\pic1.png"; contentID.Text = "IV0000-GMSP00001_00-GAMEMAKERSTUDIO0"; projectPath.Text = openFileDialog1.FileName; CreatePKG.Enabled = true; GlobalGameSettings.Enabled = true; reloadIcons(); } } private void browseIcon_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = "Portable Network Graphics|*.PNG"; openFileDialog1.Title = "Select a PNG File"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { Image img = new Bitmap(openFileDialog1.FileName); if (img.Height == 512 && img.Width == 512) { IconPreview.BackgroundImage.Dispose(); IconPreview2.BackgroundImage.Dispose(); IconPreview.BackgroundImage = img; IconPreview2.BackgroundImage = img; homeScreen.Checked = true; iconPath.Text = openFileDialog1.FileName; } else { img.Dispose(); //fix issue #2 MessageBox.Show("Image is not 512x512!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void browsePic_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = "Portable Network Graphics|*.PNG"; openFileDialog1.Title = "Select a PNG File"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { Image img = new Bitmap(openFileDialog1.FileName); if (img.Height == 1080 && img.Width == 1920) { StartupPreview.BackgroundImage.Dispose(); StartupPreview.BackgroundImage = img; startupScreen.Checked = true; picPath.Text = openFileDialog1.FileName; } else { img.Dispose(); //fix issue #2 MessageBox.Show("Image is not 1920x1080 !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void IconPreview_Click(object sender, EventArgs e) { startupScreen.Checked = true; } private void GlobalGameSettings_MouseEnter(object sender, EventArgs e) { GlobalGameSettings.ForeColor = Color.Blue; GlobalGameSettings.Font = new Font(label1.Font.Name, label1.Font.SizeInPoints, FontStyle.Underline); this.Cursor = Cursors.Hand; } private void GlobalGameSettings_MouseLeave(object sender, EventArgs e) { GlobalGameSettings.ForeColor = Color.Black; GlobalGameSettings.Font = new Font(label1.Font.Name, label1.Font.SizeInPoints, FontStyle.Regular); this.Cursor = Cursors.Arrow; } private void GlobalGameSettings_DoubleClick(object sender, EventArgs e) { GameSettings GlobalGames = new GameSettings(); GlobalGames.ShowDialog(); } private void CopyDir(string source, string target) { GmacOut.AppendText("Copying Directory:\n \"" + source + "\"\n-> \"" + target + "\"\n"); if (!Directory.Exists(target)) Directory.CreateDirectory(target); string[] sysEntries = Directory.GetFileSystemEntries(source); foreach (string sysEntry in sysEntries) { string fileName = Path.GetFileName(sysEntry); string targetPath = Path.Combine(target, fileName); if (Directory.Exists(sysEntry)) CopyDir(sysEntry, targetPath); else { GmacOut.AppendText("Copying \"" + fileName + "\"\n"); File.Copy(sysEntry, targetPath, true); } } } private void Make24Bit(string Src, string Dst) { GmacOut.AppendText("Making " + Src + " 24 bit color depth!"); Bitmap orig = new Bitmap(Src); if ((orig.PixelFormat != PixelFormat.Format24bppRgb)) { Bitmap clone = orig.Clone(new Rectangle(0, 0, orig.Width, orig.Height), PixelFormat.Format24bppRgb); clone.Save(@Dst); clone.Dispose(); GmacOut.AppendText(" Done!\n"); } else { GmacOut.AppendText(" No need!\n"); File.Copy(Src, Dst); } orig.Dispose(); } private bool CompileProject(string Src, string Dst) { string GMVer = VersionSelect.SelectedItem.ToString(); String TexturePageSize = "1028"; String SHEnabled = "False"; if (GMVer.StartsWith("1.")) { XmlDocument DefaultConfig = new XmlDocument(); DefaultConfig.Load(Path.GetDirectoryName(projectPath.Text) + "\\Configs\\Default.config.gmx"); TexturePageSize = DefaultConfig.GetElementsByTagName("option_ps4_texture_page")[0].InnerText; SHEnabled = DefaultConfig.GetElementsByTagName("option_shortcircuit")[0].InnerText; } string versionBit = GMVer.Split('.')[2]; if(GMVer.StartsWith("2.")) { GmacOut.AppendText("Creating license.plist...\n"); String LicenseFile = GMLicense.LicenseFormat.CreateLicense("ps4", GMLicense.Keys.GetPrivateKey()); if (!Directory.Exists(Dst+"\\GameMakerLicense")) { Directory.CreateDirectory(Dst + "\\GameMakerLicense"); } File.WriteAllText(Dst + "\\GameMakerLicense\\licence.plist",LicenseFile); GmacOut.AppendText("Written license file to: " + Dst + "\\GameMakerLicense\\license.plist\n"); } string args; if (HasShaders && GMVer.StartsWith("1.")) { args = "/c /m=ps4 /config=\"Default\" /tgt=4294967296 /obob=True /obpp=False /obru=True /obes=False /i=3 /j=4 /cvm /tp=" + TexturePageSize + " /mv=1 /iv=0 /rv=0 /bv=" + versionBit + " /sh="+ SHEnabled+" /ps4sdk=\"" + Directory.GetCurrentDirectory() + "\\ps4sdk\" /gn=\"" + titleName.Text + "\" /o=\"" + Dst + "\" \"" + Src + "\""; } else if(GMVer.StartsWith("1.")) { args = "/c /m=ps4 /config=\"Default\" /tgt=4294967296 /obob=True /obpp=False /obru=True /obes=False /i=3 /j=4 /cvm /tp=" + TexturePageSize + " /mv=1 /iv=0 /rv=0 /bv=" + versionBit + " /sh=" + SHEnabled + " /gn=\"" + titleName.Text + "\" /o=\"" + Dst + "\" \"" + Src + "\""; } else if(HasShaders && GMVer.StartsWith("2.")) { args = "/c /zpex /zpuf=\""+Dst + "\\GameMakerLicense\" /baseproject=\"" +Directory.GetCurrentDirectory()+"\\versions\\"+GMVer+ "\\BaseProject\\BaseProject.yyp\" /m=PS4 /config=\"default\" /tgt=4294967296 /obob=True /obpp=False /obru=True /obes=False /i=3 /j=4 /cvm /mv=1 /iv=0 /rv=0 /bv=0 /sh=False /ps4sdk=\"" + Directory.GetCurrentDirectory() + "\\ps4sdk\" /gn=\"" + titleName.Text + "\" /o=\"" + Dst + "\" \"" + Src + "\""; } else { args = "/c /zpex /zpuf=\"" + Dst + "\\GameMakerLicense\" /baseproject=\"" + Directory.GetCurrentDirectory() + "\\versions\\" + GMVer + "\\BaseProject\\BaseProject.yyp\" /m=PS4 /config=\"default\" /tgt=4294967296 /obob=True /obpp=False /obru=True /obes=False /i=3 /j=4 /cvm /mv=1 /iv=0 /rv=0 /bv=0 /sh=False /gn=\"" + titleName.Text + "\" /o=\"" + Dst + "\" \"" + Src + "\""; } GmacOut.AppendText("-- GMASSETCOMPILER BEGIN --\n"); GmacOut.AppendText("GMAssetCompiler.exe " + args + "\n"); Process gmac = new Process(); if (GMVer == "1.4.9999") { gmac.StartInfo.FileName = "GMAssetCompiler.exe"; } else { gmac.StartInfo.FileName = "versions\\" + GMVer + "\\GMAssetCompiler.exe"; gmac.StartInfo.WorkingDirectory = "versions\\" + GMVer; } gmac.StartInfo.Arguments = args; gmac.StartInfo.UseShellExecute = false; gmac.StartInfo.CreateNoWindow = true; gmac.StartInfo.RedirectStandardOutput = true; gmac.StartInfo.RedirectStandardError = true; gmac.ErrorDataReceived += new DataReceivedEventHandler(gmacWrite); gmac.OutputDataReceived += new DataReceivedEventHandler(gmacWrite); GMAC.GetPermissionToExecute(); gmac.Start(); gmac.BeginOutputReadLine(); gmac.BeginErrorReadLine(); while (!gmac.HasExited) { Application.DoEvents(); } if (gmac.ExitCode != 0) { MessageBox.Show("GMAssetCompiler.exe Error Code: " + gmac.ExitCode.ToString(), "GMAC Error", MessageBoxButtons.OK, MessageBoxIcon.Error); Directory.Delete(Dst, true); return false; } gmac.Dispose(); GmacOut.AppendText("-- GMASSETCOMPILER FINISHED! --\n"); if (GMVer.StartsWith("2.")) { GmacOut.AppendText("Removing license.plist..."); File.Delete(Dst + "\\GameMakerLicense\\license.plist"); Directory.Delete(Dst + "\\GameMakerLicense", true); GmacOut.AppendText("OK!\n"); } GmacOut.AppendText("Renaming to game.win..."); foreach (String file in Directory.GetFiles(Dst)) { if (file.EndsWith(".win")) { File.Move(file, Dst + "\\game.win"); } if (file.EndsWith(".yydebug")) { File.Delete(file); } } GmacOut.AppendText("OK!\n"); return true; } void gmacWrite(object sender, DataReceivedEventArgs e) { Trace.WriteLine(e.Data); this.BeginInvoke(new MethodInvoker(() => { GmacOut.AppendText(e.Data + "\n"); })); } private void AddFile(Gp4Project proj, string targetPath, string origPath) { var f = origPath; var fileEntry = new Gp4File { OrigPath = f, TargetPath = targetPath + Path.GetFileName(origPath) }; proj.files.Items.Add(fileEntry); } private void AddFileTree(Gp4Project proj, Dir parent, string path) { var newDir = proj.AddDir(parent, Path.GetFileName(path)); foreach (var d in Directory.EnumerateDirectories(path)) { AddFileTree(proj, newDir, d); } var targetPath = newDir.Path; foreach (var f in Directory.EnumerateFiles(path)) { AddFile(proj, targetPath, f); } } private void CreatePKG_Click(object sender, EventArgs e) { string GMVer = VersionSelect.SelectedItem.ToString(); if(Path.GetExtension(projectPath.Text).ToLower() == ".yyp" && GMVer.StartsWith("1.")) { MessageBox.Show("Cannot build GMS2 Project using GMS1.4", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else if(Path.GetExtension(projectPath.Text).ToLower() == ".gmx" && GMVer.StartsWith("2.")) { MessageBox.Show("Cannot build GMS1.4 Project using GMS2", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } string tempdir = ""; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "PS4 Packages|*.PKG"; saveFileDialog1.Title = "Save PKG File"; saveFileDialog1.FileName = contentID.Text; CreatePKG.Enabled = false; if(GMVer.StartsWith("1.")) HasShaders = File.ReadAllText(projectPath.Text).Contains(""); //Too lazy to parse XML properly. else if(GMVer.StartsWith("2.")) HasShaders = File.ReadAllText(projectPath.Text).Contains("GMShader"); //Too lazy to parse XML properly. if (HasShaders) { if (!Directory.Exists(@"ps4sdk")) { DialogResult msgResult = MessageBox.Show("It's been detected that you are using Shaders in your GM Project\nHowever no copy of the PS4 Shader Compiler (orbis-wave-psslc.exe) was found.\nBrowse to orbis-wave-psslc.exe?", "Shader Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation); if (msgResult == DialogResult.Yes) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "orbis-wave-psslc.exe|orbis-wave-psslc.exe"; openFileDialog.Title = "Browse to PS4 Shader Compiler."; if (openFileDialog.ShowDialog() == DialogResult.OK) { if (!Directory.Exists(@"ps4sdk")) { GmacOut.AppendText("Creating PS4SDK Directory Structure\n"); Directory.CreateDirectory("ps4sdk"); Directory.CreateDirectory("ps4sdk/host_tools"); Directory.CreateDirectory("ps4sdk/host_tools/bin"); } File.Copy(openFileDialog.FileName, @"ps4sdk/host_tools/bin/orbis-wave-psslc.exe"); } else { CreatePKG.Enabled = true; return; } } else { CreatePKG.Enabled = true; return; } } } if (saveFileDialog1.ShowDialog() == DialogResult.OK) { tempdir = Path.GetDirectoryName(saveFileDialog1.FileName) + "\\_temp"; if (Directory.Exists(tempdir)) { Directory.Delete(tempdir, true); } Directory.CreateDirectory(tempdir); if (GMVer == "1.4.9999") { CopyDir(@"Runner", tempdir); } else { CopyDir("versions\\" + GMVer + "\\Runner", tempdir); } Make24Bit(iconPath.Text, tempdir + "\\sce_sys\\icon0.png"); Make24Bit(picPath.Text, tempdir + "\\sce_sys\\pic1.png"); if (!CompileProject(projectPath.Text, tempdir + "\\games")) { Directory.Delete(tempdir, true); CreatePKG.Enabled = true; return; } } else { CreatePKG.Enabled = true; return; } FileStream fd = File.Open(tempdir + "\\sce_sys\\param.sfo", FileMode.OpenOrCreate, FileAccess.ReadWrite); GmacOut.AppendText("Writing " + titleName.Text + " to TITLE of param.sfo\n"); fd.Seek(0x350, SeekOrigin.Begin); foreach (Byte by in ASCIIEncoding.ASCII.GetBytes(titleName.Text)) { fd.WriteByte(by); } GmacOut.AppendText("Writing " + titleID.Text + " to TITLE_ID of param.sfo\n"); fd.Seek(0x3D0, SeekOrigin.Begin); foreach (Byte by in ASCIIEncoding.ASCII.GetBytes(titleID.Text)) { fd.WriteByte(by); } GmacOut.AppendText("Writing " + contentID.Text + " to CONTENT_ID of param.sfo!\n"); fd.Seek(0x284, SeekOrigin.Begin); foreach (Byte by in ASCIIEncoding.ASCII.GetBytes(contentID.Text)) { fd.WriteByte(by); } fd.Close(); GmacOut.AppendText("Creating GP4 ..."); Gp4Project proj = Gp4Project.Create(VolumeType.pkg_ps4_app); Dir root = null; foreach (var file in Directory.GetFileSystemEntries(tempdir)) { if (File.Exists(file)) { AddFile(proj, "", file); } else if (Directory.Exists(file)) { AddFileTree(proj, root, file); } } proj.volume.Package.ContentId = contentID.Text; proj.volume.Package.Passcode = "00000000000000000000000000000000"; GmacOut.AppendText("OK!\n"); if (File.Exists(saveFileDialog1.FileName)) { File.Delete(saveFileDialog1.FileName); } GmacOut.AppendText("Building PKG ..."); Thread thr = new Thread(() => { PkgBuilder pkg = new PkgBuilder(PkgProperties.FromGp4(proj, "")); pkg.Write(saveFileDialog1.FileName); }); thr.Start(); while (thr.IsAlive) { Application.DoEvents(); } GmacOut.AppendText("OK!\n"); GmacOut.AppendText("Deleting " + tempdir + " ..."); Directory.Delete(tempdir, true); GmacOut.AppendText("OK!\n"); GmacOut.AppendText("Done!\n"); CreatePKG.Enabled = true; MessageBox.Show("PKG Created!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); } public void ReloadVersions() { VersionSelect.Items.Clear(); VersionSelect.Items.Add("1.4.9999"); try { foreach (String version in Directory.GetDirectories(@"versions")) { VersionSelect.Items.Add(Path.GetFileName(version)); } } catch (Exception) { }; VersionSelect.Items.Add("Manager"); VersionSelect.SelectedIndex = 0; } private void VersionSelect_SelectedIndexChanged(object sender, EventArgs e) { //1.4.9999 comes built in if(VersionSelect.Text.StartsWith("1.")) { GameSettings.Enabled = true; } else { GlobalGameSettings.Enabled = false; } if (VersionSelect.SelectedItem.ToString() == "Manager") { VersionSelect.SelectedIndex -= 1; this.Enabled = false; VersionManager VM = new VersionManager(); VM.Show(); VM.FormClosing += VM_FormClosing; } } private void VM_FormClosing(object sender, FormClosingEventArgs e) { this.Enabled = true; ReloadVersions(); this.Focus(); } } }