359 lines
14 KiB
C#
359 lines
14 KiB
C#
using GMTools;
|
|
using Ionic.Zip;
|
|
using System;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Net.Cache;
|
|
using System.Threading;
|
|
using System.Windows.Forms;
|
|
|
|
namespace GayMaker_Studio
|
|
{
|
|
|
|
public partial class VersionManager : Form
|
|
{
|
|
//private const int NUMBER_OF_CDN_URLS = 4; //Uncomment for GMS2
|
|
private const int NUMBER_OF_CDN_URLS = 2;
|
|
|
|
private string currentDownload = "";
|
|
|
|
private void CopyDir(string source, string target)
|
|
{
|
|
|
|
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
|
|
{
|
|
File.Copy(sysEntry, targetPath, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
private string getUrlFileName(string url)
|
|
{
|
|
string filename = Path.GetFileName(new Uri(url).LocalPath);
|
|
if (!Path.HasExtension(filename))
|
|
filename = Path.ChangeExtension(filename, ".zip");
|
|
return filename;
|
|
}
|
|
|
|
public VersionManager()
|
|
{
|
|
//Bypass Windows DPI Scaling
|
|
Font = new Font(Font.Name, 8.25f * 96f / CreateGraphics().DpiX, Font.Style, Font.Unit, Font.GdiCharSet, Font.GdiVerticalFont);
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void VersionManager_Load(object sender, EventArgs e)
|
|
{
|
|
this.Owner = Program.GMS;
|
|
for (int cdnIndex = 1; cdnIndex <= NUMBER_OF_CDN_URLS; cdnIndex++)
|
|
{
|
|
Thread downloadThread = new Thread(() =>
|
|
{
|
|
CDN.UseCDN(CDNUrls.FromIndex(cdnIndex));
|
|
});
|
|
|
|
downloadThread.Start();
|
|
|
|
while (downloadThread.IsAlive)
|
|
Application.DoEvents();
|
|
|
|
|
|
foreach (String Version in CDN.GetVersions("ps4"))
|
|
{
|
|
if (Version != "1.4.9999" || DownloadList.Items.Contains(Version))
|
|
DownloadList.Items.Add(Version);
|
|
}
|
|
}
|
|
|
|
foreach (String dir in Directory.GetDirectories(@"versions"))
|
|
{
|
|
DownloadedList.Items.Add(Path.GetFileName(dir));
|
|
DownloadList.Items.Remove(Path.GetFileName(dir));
|
|
}
|
|
}
|
|
|
|
private void startDownload(string URL, string path)
|
|
{
|
|
currentDownload = getUrlFileName(URL);
|
|
DownloadProgress.Value = 0;
|
|
DownloadProgress.Style = ProgressBarStyle.Continuous;
|
|
|
|
|
|
WebClient wc = new WebClient();
|
|
wc.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
|
|
wc.Dispose();
|
|
|
|
WebClient client = new WebClient();
|
|
client.Headers.Add("pragma", "no-cache");
|
|
|
|
|
|
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
|
|
client.DownloadFileAsync(new Uri(URL), path);
|
|
|
|
while (client.IsBusy)
|
|
Application.DoEvents();
|
|
|
|
StatusText.Text = "Waiting...";
|
|
DownloadProgress.Value = 0;
|
|
DownloadProgress.Style = ProgressBarStyle.Continuous;
|
|
}
|
|
|
|
private void extractFile(string zipfile, string path, string password = "")
|
|
{
|
|
|
|
DownloadProgress.Style = ProgressBarStyle.Marquee;
|
|
Thread extractThread = new Thread(() =>
|
|
{
|
|
|
|
if (Directory.Exists(path))
|
|
{
|
|
while (true)
|
|
{
|
|
try
|
|
{
|
|
Directory.Delete(path, true);
|
|
}
|
|
catch (Exception) { };
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
Thread.CurrentThread.IsBackground = true;
|
|
Invoke((Action)delegate { StatusText.Text = "Extracting: " + Path.GetFileName(zipfile); });
|
|
|
|
|
|
using (ZipFile archive = new ZipFile(zipfile))
|
|
{
|
|
archive.Password = password;
|
|
archive.Encryption = EncryptionAlgorithm.PkzipWeak;
|
|
archive.ExtractAll(path);
|
|
}
|
|
|
|
});
|
|
|
|
extractThread.Start();
|
|
|
|
while (extractThread.IsAlive)
|
|
Application.DoEvents();
|
|
|
|
StatusText.Text = "Waiting...";
|
|
DownloadProgress.Value = 0;
|
|
DownloadProgress.Style = ProgressBarStyle.Continuous;
|
|
|
|
|
|
File.Delete(zipfile);
|
|
}
|
|
|
|
|
|
private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
|
|
{
|
|
DownloadProgress.Value = e.ProgressPercentage;
|
|
StatusText.Text = "Downloading: "+ currentDownload + " " + e.ProgressPercentage + "% (" + e.BytesReceived + "b / " + e.TotalBytesToReceive + "b)";
|
|
}
|
|
|
|
private void DownloadButton_Click(object sender, EventArgs e)
|
|
{
|
|
if (DownloadList.SelectedIndex <= -1) { return; }
|
|
DownloadList.Enabled = false;
|
|
DownloadButton.Enabled = false;
|
|
ControlBox = false;
|
|
|
|
string version = DownloadList.SelectedItem.ToString();
|
|
|
|
for (int cdnIndex = 1; cdnIndex <= NUMBER_OF_CDN_URLS; cdnIndex++)
|
|
{
|
|
Thread downloadThread = new Thread(() =>
|
|
{
|
|
CDN.UseCDN(CDNUrls.FromIndex(cdnIndex));
|
|
});
|
|
|
|
downloadThread.Start();
|
|
|
|
while (downloadThread.IsAlive)
|
|
Application.DoEvents();
|
|
|
|
string ps4Url = CDN.GetModuleForVersion(version, "ps4");
|
|
if (ps4Url != "NF")
|
|
{
|
|
string ps4Filename = getUrlFileName(ps4Url);
|
|
string ps4Password = CDN.GetPassword(ps4Filename);
|
|
|
|
string gamemakerUrl = CDN.GetModuleForVersion(version, "original");
|
|
string gamemakerFilename = getUrlFileName(gamemakerUrl);
|
|
string gamemakerPassword = CDN.GetPassword(gamemakerFilename);
|
|
|
|
startDownload(ps4Url, ps4Filename);
|
|
extractFile(ps4Filename, @"_ps4", ps4Password);
|
|
|
|
startDownload(gamemakerUrl, gamemakerFilename);
|
|
extractFile(gamemakerFilename, @"_gamemaker", gamemakerPassword);
|
|
|
|
DownloadProgress.Style = ProgressBarStyle.Marquee;
|
|
StatusText.Text = "Copying Files...";
|
|
Application.DoEvents();
|
|
|
|
Thread copyThread = new Thread(() =>
|
|
{
|
|
|
|
Directory.CreateDirectory(@"versions\\" + version + "\\Runner");
|
|
Directory.CreateDirectory(@"versions\\" + version + "\\Shaders");
|
|
|
|
if (version.StartsWith("1."))
|
|
{
|
|
try
|
|
{
|
|
File.Copy(@"_gamemaker\\GMAssetCompiler.exe", @"versions\\" + version + "\\GMAssetCompiler.exe", true);
|
|
File.Copy(@"_gamemaker\\ffmpeg.exe", @"versions\\" + version + "\\ffmpeg.exe", true);
|
|
|
|
File.Copy(@"_gamemaker\\BouncyCastle.Crypto.dll", @"versions\\" + version + "\\BouncyCastle.Crypto.dll", true);
|
|
File.Copy(@"_gamemaker\\spine-csharp.dll", @"versions\\" + version + "\\spine-csharp.dll", true);
|
|
File.Copy(@"_gamemaker\\SharpCompress.dll", @"versions\\" + version + "\\SharpCompress.dll", true);
|
|
File.Copy(@"_gamemaker\\Ionic.Zip.Reduced.dll", @"versions\\" + version + "\\Ionic.Zip.Reduced.dll", true);
|
|
File.Copy(@"_gamemaker\\Newtonsoft.Json.dll", @"versions\\" + version + "\\Newtonsoft.Json.dll", true);
|
|
}
|
|
catch (Exception) { };
|
|
}
|
|
else if(version.StartsWith("2."))
|
|
{
|
|
try
|
|
{
|
|
File.Copy(@"_gamemaker\\bin\\GMAssetCompiler.exe", @"versions\\" + version + "\\GMAssetCompiler.exe", true);
|
|
File.Copy(@"_gamemaker\\bin\\ffmpeg.exe", @"versions\\" + version + "\\ffmpeg.exe", true);
|
|
File.Copy(@"_gamemaker\\bin\\Newtonsoft.Json.dll", @"versions\\" + version + "\\Newtonsoft.Json.dll", true);
|
|
|
|
File.Copy(@"_gamemaker\\bin\\BouncyCastle.Crypto.dll", @"versions\\" + version + "\\BouncyCastle.Crypto.dll", true);
|
|
File.Copy(@"_gamemaker\\bin\\spine-csharp.dll", @"versions\\" + version + "\\spine-csharp.dll", true);
|
|
File.Copy(@"_gamemaker\\bin\\SharpCompress.dll", @"versions\\" + version + "\\SharpCompress.dll", true);
|
|
File.Copy(@"_gamemaker\\bin\\Ionic.Zip.Reduced.dll", @"versions\\" + version + "\\Ionic.Zip.Reduced.dll", true);
|
|
}
|
|
catch (Exception) { };
|
|
}
|
|
|
|
|
|
CopyDir(@"Runner", @"versions\\" + version + "\\Runner");
|
|
|
|
if(version.StartsWith("1."))
|
|
{
|
|
CopyDir(@"_gamemaker\\Shaders", @"versions\\" + version + "\\Shaders");
|
|
}
|
|
else if(version.StartsWith("2."))
|
|
{
|
|
CopyDir(@"_gamemaker\\bin\Shaders", @"versions\\" + version + "\\Shaders");
|
|
CopyDir(@"_gamemaker\\BaseProject", @"versions\\" + version + "\\BaseProject");
|
|
CopyDir(@"_ps4\\BaseProject", @"versions\\" + version + "\\BaseProject");
|
|
}
|
|
|
|
|
|
File.Delete(@"versions\\" + version + "\\Runner\\eboot.bin");
|
|
|
|
try
|
|
{
|
|
|
|
File.Copy(@"_ps4\\PS4\\PSSL_PShaderCommon.shader", @"versions\\" + version + "\\Shaders\\PSSL_PShaderCommon.shade", true);
|
|
File.Copy(@"_ps4\\PS4\\PSSL_VShaderCommon.shader", @"versions\\" + version + "\\Shaders\\PSSL_VShaderCommon.shader", true);
|
|
File.Copy(@"_ps4\\PS4\\HLSL_to_PSSL.h", @"versions\\" + version + "\\Shaders\\HLSL_to_PSSL.h", true);
|
|
|
|
}
|
|
catch (Exception){ };
|
|
|
|
});
|
|
copyThread.Start();
|
|
|
|
while (copyThread.IsAlive)
|
|
Application.DoEvents();
|
|
|
|
if(version.StartsWith("2.") || version == "1.4.9999")
|
|
{
|
|
DownloadProgress.Style = ProgressBarStyle.Marquee;
|
|
StatusText.Text = "Applying SceVerDown Magic (by dots_tb)...";
|
|
Application.DoEvents();
|
|
|
|
ELF.Tools.SceVerDown(@"_ps4\\PS4\\PS4Runner.elf", 0x05008001);
|
|
}
|
|
|
|
DownloadProgress.Style = ProgressBarStyle.Marquee;
|
|
StatusText.Text = "Running Make FSELF (by flat_z)...";
|
|
Application.DoEvents();
|
|
|
|
ELF.Tools.MakeFself(@"_ps4\\PS4\\PS4Runner.elf", @"versions\\" + version + "\\Runner\\eboot.bin");
|
|
|
|
DownloadProgress.Style = ProgressBarStyle.Marquee;
|
|
StatusText.Text = "Deleting Unused Files...";
|
|
Application.DoEvents();
|
|
|
|
Thread deleteThread = new Thread(() =>
|
|
{
|
|
while(true)
|
|
{
|
|
try
|
|
{
|
|
Directory.Delete(@"_ps4", true);
|
|
Directory.Delete(@"_gamemaker", true);
|
|
}
|
|
catch (Exception) { };
|
|
break;
|
|
}
|
|
});
|
|
|
|
deleteThread.Start();
|
|
|
|
while (deleteThread.IsAlive)
|
|
Application.DoEvents();
|
|
|
|
DownloadProgress.Style = ProgressBarStyle.Continuous;
|
|
DownloadProgress.Value = 0;
|
|
StatusText.Text = "Waiting...";
|
|
|
|
DownloadedList.Items.Add(version);
|
|
DownloadList.Items.Remove(version);
|
|
|
|
DownloadList.Enabled = true;
|
|
DownloadButton.Enabled = true;
|
|
ControlBox = true;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DeleteVersion_Click(object sender, EventArgs e)
|
|
{
|
|
if (DownloadedList.SelectedIndex == -1) { return; }
|
|
string toRemove = DownloadedList.SelectedItem.ToString();
|
|
if (toRemove == "1.4.9999")
|
|
{
|
|
MessageBox.Show("Cannot delete builtin 1.4.9999 version!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
else
|
|
{
|
|
if (Directory.Exists(@"versions\\" + toRemove))
|
|
{
|
|
while (true)
|
|
{
|
|
try
|
|
{
|
|
Directory.Delete(@"versions\\" + toRemove, true);
|
|
}
|
|
catch (Exception) { };
|
|
break;
|
|
}
|
|
}
|
|
|
|
DownloadedList.Items.Remove(toRemove);
|
|
DownloadList.Items.Add(toRemove);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|