Skip to content

Commit

Permalink
Merge pull request #1245 from VladiStep/fasterRunGameOption
Browse files Browse the repository at this point in the history
  • Loading branch information
Grossley authored Mar 30, 2023
2 parents 7d03396 + 6ae68da commit af09670
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 13 deletions.
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

0 comments on commit af09670

Please sign in to comment.