Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved "Run game" file context menu option(s). #1245

Merged
merged 1 commit into from
Mar 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion UndertaleModLib/Models/UndertaleGeneralInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -427,10 +427,30 @@ public void Serialize(UndertaleWriter writer)
/// <inheritdoc />
public void Unserialize(UndertaleReader reader)
{
Func<UndertaleString> readFileNameDelegate;
if (reader.ReadOnlyGEN8)
readFileNameDelegate = () =>
{
UndertaleString res = reader.ReadUndertaleString();
if (res.Content is not null)
return res;

reader.SwitchReaderType(false);
long returnTo = reader.Position;
reader.Position = reader.GetOffsetMapRev()[res];
reader.ReadUndertaleObject<UndertaleString>();
reader.Position = returnTo;
reader.SwitchReaderType(true);

return res;
};
else
readFileNameDelegate = reader.ReadUndertaleString;

IsDebuggerDisabled = reader.ReadByte() != 0;
BytecodeVersion = reader.ReadByte();
Unknown = reader.ReadUInt16();
FileName = reader.ReadUndertaleString();
FileName = readFileNameDelegate();
Config = reader.ReadUndertaleString();
LastObj = reader.ReadUInt32();
LastTile = reader.ReadUInt32();
Expand All @@ -443,6 +463,9 @@ public void Unserialize(UndertaleReader reader)
Release = reader.ReadUInt32();
Build = reader.ReadUInt32();

if (reader.ReadOnlyGEN8)
return;

var detectedVer = TestForCommonGMSVersions(reader, (Major, Minor, Release, Build));
(Major, Minor, Release, Build) = detectedVer;

Expand Down
3 changes: 3 additions & 0 deletions UndertaleModLib/UndertaleChunks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@ internal override void UnserializeChunk(UndertaleReader reader)

Chunks.Add(chunk.Name, chunk);
ChunksTypeDict.Add(chunk.GetType(), chunk);

if (reader.ReadOnlyGEN8 && chunk.Name == "GEN8")
return;
}
}
}
Expand Down
17 changes: 13 additions & 4 deletions UndertaleModLib/UndertaleIO.cs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ public class UndertaleReader : AdaptiveBinaryReader
private WarningHandlerDelegate WarningHandler;
private MessageHandlerDelegate MessageHandler;

public bool ReadOnlyGEN8 { get; set; }

/// <summary>
/// The detected absolute path of the data file, if a FileStream is passed in, or null otherwise (by default).
/// Can also be manually changed.
Expand All @@ -173,10 +175,12 @@ public class UndertaleReader : AdaptiveBinaryReader
public string Directory { get; set; } = null;

public UndertaleReader(Stream input,
WarningHandlerDelegate warningHandler = null, MessageHandlerDelegate messageHandler = null) : base(input)
WarningHandlerDelegate warningHandler = null, MessageHandlerDelegate messageHandler = null,
bool onlyGeneralInfo = false) : base(input)
{
WarningHandler = warningHandler;
MessageHandler = messageHandler;
ReadOnlyGEN8 = onlyGeneralInfo;
if (input is FileStream fs)
{
FilePath = fs.Name;
Expand Down Expand Up @@ -241,7 +245,8 @@ public UndertaleData ReadUndertaleData()
{
try
{
poolSize = data.FORM.UnserializeObjectCount(this);
if (!ReadOnlyGEN8)
poolSize = data.FORM.UnserializeObjectCount(this);
}
catch (Exception e)
{
Expand Down Expand Up @@ -606,6 +611,9 @@ public UndertaleString ReadUndertaleString()

public void ThrowIfUnreadObjects()
{
if (ReadOnlyGEN8)
return;

if (unreadObjects.Count > 0)
{
throw new IOException("Found pointer targets that were never read:\n" + String.Join("\n", unreadObjects.Take(10).Select((x) => "0x" + x.ToString("X8") + " (" + objectPool[x].GetType().Name + ")")) + (unreadObjects.Count > 10 ? "\n(and more, " + unreadObjects.Count + " total)" : ""));
Expand Down Expand Up @@ -897,9 +905,10 @@ public static class UndertaleIO
public static bool IsDictionaryCleared { get; set; } = true;

public static UndertaleData Read(Stream stream, UndertaleReader.WarningHandlerDelegate warningHandler = null,
UndertaleReader.MessageHandlerDelegate messageHandler = null)
UndertaleReader.MessageHandlerDelegate messageHandler = null,
bool onlyGeneralInfo = false)
{
UndertaleReader reader = new UndertaleReader(stream, warningHandler, messageHandler);
UndertaleReader reader = new UndertaleReader(stream, warningHandler, messageHandler, onlyGeneralInfo);
var data = reader.ReadUndertaleData();
reader.ThrowIfUnreadObjects();
return data;
Expand Down
34 changes: 26 additions & 8 deletions UndertaleModTool/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -361,12 +361,20 @@ private async void Window_Loaded(object sender, RoutedEventArgs e)
}

var args = Environment.GetCommandLineArgs();
bool isLaunch = false;
bool isSpecialLaunch = false;
if (args.Length > 1)
{
if (args.Length > 2)
{
isLaunch = args[2] == "launch";
isSpecialLaunch = args[2] == "special_launch";
}

string arg = args[1];
if (File.Exists(arg))
{
await LoadFile(arg, true);
await LoadFile(arg, true, isLaunch || isSpecialLaunch);
}
else if (arg == "deleteTempFolder") // if was launched from UndertaleModToolUpdater
{
Expand Down Expand Up @@ -416,10 +424,8 @@ private async void Window_Loaded(object sender, RoutedEventArgs e)
}
});
}
}
if (args.Length > 2)
{
if (args[2] == "special_launch")

if (isSpecialLaunch)
{
RuntimePicker picker = new RuntimePicker();
picker.Owner = this;
Expand All @@ -429,7 +435,7 @@ private async void Window_Loaded(object sender, RoutedEventArgs e)
Process.Start(runtime.Path, "-game \"" + FilePath + "\"");
Environment.Exit(0);
}
else if (args[2] == "launch")
else if (isLaunch)
{
string gameExeName = Data?.GeneralInfo?.FileName?.Content;
if (gameExeName == null || FilePath == null)
Expand Down Expand Up @@ -902,7 +908,7 @@ private void DisposeGameData()
GC.Collect();
}
}
private async Task LoadFile(string filename, bool preventClose = false)
private async Task LoadFile(string filename, bool preventClose = false, bool onlyGeneralInfo = false)
{
LoaderDialog dialog = new LoaderDialog("Loading", "Loading, please wait...");
dialog.PreventClose = preventClose;
Expand Down Expand Up @@ -936,7 +942,7 @@ private async Task LoadFile(string filename, bool preventClose = false)
}, message =>
{
FileMessageEvent?.Invoke(message);
});
}, onlyGeneralInfo);
}

UndertaleEmbeddedTexture.TexData.ClearSharedStream();
Expand All @@ -946,6 +952,18 @@ private async Task LoadFile(string filename, bool preventClose = false)
this.ShowError("An error occured while trying to load:\n" + e.Message, "Load error");
}

if (onlyGeneralInfo)
{
Dispatcher.Invoke(() =>
{
dialog.Hide();
Data = data;
FilePath = filename;
});

return;
}

Dispatcher.Invoke(async () =>
{
if (data != null)
Expand Down