Fixed the game folder method returning the library file Checking the game's exe when starting Added support for the preview branch of the game Added support for preview versions of modstags/v1.1.0
@@ -54,7 +54,7 @@ If you encounter an issue while the game is patched, report it to us. If you thi | |||
modlist.Items.Clear(); | |||
UpdateButton(installbtn, false); | |||
modinfobox.Text = defaultInfo; | |||
if (string.IsNullOrWhiteSpace(Settings.Default.GamePath)) | |||
if (string.IsNullOrWhiteSpace(Settings.Default.GamePath) || GetExe() == null) | |||
{ | |||
Settings.Default.GamePath = GetGameFolder(); | |||
if (string.IsNullOrWhiteSpace(Settings.Default.GamePath)) | |||
@@ -114,9 +114,9 @@ If you encounter an issue while the game is patched, report it to us. If you thi | |||
if(up) | |||
{ | |||
modinfobox.Select(0, "New version available!".Length); | |||
modinfobox.SelectionColor = Color.Aqua; | |||
modinfobox.DeselectAll(); | |||
modinfobox.SelectionColor = modinfobox.ForeColor; | |||
//modinfobox.SelectionColor = Color.Aqua; | |||
//modinfobox.DeselectAll(); | |||
//modinfobox.SelectionColor = modinfobox.ForeColor; | |||
} | |||
} | |||
else | |||
@@ -170,7 +170,7 @@ If you encounter an issue while the game is patched, report it to us. If you thi | |||
{ | |||
if (Environment.OSVersion.Platform == PlatformID.Win32NT) | |||
{ | |||
Process.Start("explorer.exe", "/select,"+Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"Low\Freejam\Gamecraft\Player.log"); | |||
Process.Start("explorer.exe", $@"/select,{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}Low\Freejam\{GetExe().Replace(".exe", "")}\Player.log"); | |||
} | |||
} | |||
@@ -16,7 +16,7 @@ namespace GCMM | |||
public async Task InstallMod(ModInfo mod) | |||
{ | |||
if (mod.DownloadURL == null) return; | |||
if (!File.Exists(GamePath(@"\Gamecraft.exe"))) | |||
if (GetExe() == null) | |||
{ | |||
MessageBox.Show("Gamecraft not found. Set the correct path in Settings."); | |||
return; | |||
@@ -36,6 +36,7 @@ namespace GCMM | |||
public async void GetAvailableMods() | |||
{ | |||
bool preview = GetExe()?.Contains("Preview") ?? false; | |||
using (var client = GetClient()) | |||
{ | |||
string str = await client.DownloadStringTaskAsync("https://exmods.org/mods/modlist.tsv"); | |||
@@ -48,21 +49,39 @@ namespace GCMM | |||
Author = sp[0].Trim(), | |||
Name = sp[1].Trim() | |||
}; | |||
if (await FetchModInfo(mod)) //If it's actually a mod | |||
if (await FetchModInfo(mod, preview)) //If it's actually a mod | |||
AddUpdateModInList(mod); | |||
} | |||
} | |||
} | |||
public async Task<bool> FetchModInfo(ModInfo mod) | |||
public async Task<bool> FetchModInfo(ModInfo mod, bool preview) | |||
{ | |||
string repoURL = "/api/v1/repos/" + mod.Author + "/" + mod.Name + "/releases"; | |||
using (var client = GetClient()) | |||
{ | |||
var arr = JArray.Parse(await client.DownloadStringTaskAsync(repoURL)); | |||
var release = arr.FirstOrDefault(rel => !(bool)rel["prerelease"] && !(bool)rel["draft"]); | |||
var release = arr.FirstOrDefault(rel => | |||
{ | |||
if ((bool) rel["prerelease"] || (bool) rel["draft"]) | |||
return false; | |||
var vs = rel["tag_name"].ToString(); | |||
int ind = vs.IndexOf('-'); | |||
if (ind != -1) | |||
{ | |||
if (vs.Substring(ind + 1).Equals("preview", StringComparison.InvariantCultureIgnoreCase) | |||
&& !preview) | |||
return false; | |||
} | |||
return true; | |||
}); | |||
if (release == null) | |||
return false; | |||
var verstr = release["tag_name"].ToString().Replace("v", ""); | |||
int index = verstr.IndexOf('-'); | |||
if (index != -1) | |||
verstr = verstr.Substring(0, index); | |||
JToken asset; | |||
if (release["assets"].Count() == 1) | |||
asset = release["assets"].First; | |||
@@ -72,9 +91,11 @@ namespace GCMM | |||
string name = token["name"].ToString(); | |||
return name == mod.Name + ".dll" || name == mod.Name + ".zip"; | |||
}); | |||
mod.DownloadURL = asset?["browser_download_url"]?.ToString(); | |||
mod.LastUpdated = (DateTime)release["published_at"]; | |||
var ver = release["tag_name"].ToString().Replace("v", "").Split('.').Select(str => int.Parse(str)).ToArray(); | |||
var ver = verstr.Split('.').Select(str => int.Parse(str)).ToArray(); | |||
int getver(byte i) => ver.Length > i ? ver[i] : 0; //By default it sets values not present to -1, but we need them to be 0 | |||
mod.LatestVersion = new Version(getver(0), getver(1), getver(2), getver(3)); | |||
mod.UpdateDetails = release["name"] + "\n\n" + release["body"].ToString(); | |||
@@ -77,7 +77,7 @@ namespace GCMM | |||
} | |||
if (!status.Value ^ unpatched.Checked) | |||
{ //TODO: Wine | |||
var psi = new ProcessStartInfo(GamePath(@"\IPA.exe"), "Gamecraft.exe " | |||
var psi = new ProcessStartInfo(GamePath(@"\IPA.exe"), GetExe() + " " | |||
+ (unpatched.Checked ? "--revert " : "") + "--nowait") | |||
{ | |||
UseShellExecute = false, | |||
@@ -38,7 +38,7 @@ namespace GCMM | |||
libs = @"C:\Program Files (x86)\Steam\steamapps\libraryfolders.vdf"; | |||
else | |||
return null; | |||
foreach (var line in File.ReadAllLines(libs).Concat(new[] { @"C:\Program Files (x86)\Steam\" })) | |||
foreach (var line in File.ReadAllLines(libs).Concat(new[] {@"C:\Program Files (x86)\Steam\"})) | |||
{ | |||
var regex = new Regex("\\t\"\\d+\"\\t\\t\"(.+)\""); | |||
var match = regex.Match(line); | |||
@@ -46,18 +46,18 @@ namespace GCMM | |||
continue; | |||
string library = match.Groups[1].Value.Replace("\\\\", "\\"); | |||
library += @"\steamapps\common\"; | |||
if (File.Exists(library + @"Gamecraft\Gamecraft.exe")) | |||
if (GetExe(library + "Gamecraft") != null) | |||
return library + "Gamecraft"; | |||
if (File.Exists(library + @"RobocraftX\Gamecraft.exe")) | |||
if (GetExe(library + "RobocraftX") != null) | |||
return library + "RobocraftX"; | |||
} | |||
return libs; | |||
return null; | |||
} | |||
public string SelectGameFolder() | |||
{ | |||
var ofd = new OpenFileDialog(); | |||
ofd.Filter = "Gamecraft executable|Gamecraft.exe"; | |||
ofd.Filter = "Gamecraft executable|Gamecraft.exe|Gamecraft Preview executable|GamecraftPreview.exe"; | |||
ofd.Title = "Game location"; | |||
ofd.InitialDirectory = @"C:\Program Files (x86)\Steam\steamapps\common\"; //TODO | |||
ofd.CheckFileExists = true; | |||
@@ -125,9 +125,24 @@ namespace GCMM | |||
modlist_SelectedIndexChanged(modlist, null); | |||
} | |||
public string GamePath(string path) | |||
/// <summary> | |||
/// Path must start with \ | |||
/// </summary> | |||
/// <param name="path"></param> | |||
/// <param name="gamepath"></param> | |||
/// <returns></returns> | |||
public string GamePath(string path, string gamepath = null) | |||
{ | |||
return ((gamepath ?? Settings.Default.GamePath) + path).Replace('\\', Path.DirectorySeparatorChar); | |||
} | |||
public string GetExe(string path = null) | |||
{ | |||
return (Settings.Default.GamePath + path).Replace('\\', Path.DirectorySeparatorChar); | |||
if (File.Exists(GamePath("\\Gamecraft.exe", path))) | |||
return "Gamecraft.exe"; | |||
if (File.Exists(GamePath("\\GamecraftPreview.exe", path))) | |||
return "GamecraftPreview.exe"; | |||
return null; | |||
} | |||
} | |||
} |