Skip to content

Commit

Permalink
Added support for packing VScripts referenced by other VScripts
Browse files Browse the repository at this point in the history
  • Loading branch information
Exactol committed Jan 8, 2023
1 parent ec80cb6 commit d7f1828
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 2 deletions.
43 changes: 43 additions & 0 deletions CompilePalX/Compilers/BSPPack/AssetUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Text;
using System.Text.RegularExpressions;
using CompilePalX;
using CompilePalX.Compiling;

namespace CompilePalX.Compilers.BSPPack
{
Expand Down Expand Up @@ -552,6 +553,47 @@ public static void findBspPakDependencies(BSP bsp, string tempdir)
foreach (string material in AssetUtils.findVmtTextures(new FileInfo(file).FullName))
bsp.TextureList.Add(material);
}
}

/// <summary>
/// Finds referenced vscripts
/// </summary>
/// <param name="fullpath">Full path to VScript file</param>
/// <returns>List of VSript references</returns>
public static List<string> FindVSCriptRefs(string fullpath)
{
List<string> includedScripts = new List<string>();
var script = File.ReadAllLines(fullpath);
var commentRegex = new Regex(@"^\/\/");
var functionParametersRegex = new Regex("\\((.*?)\\)");

// currently only squirrel parsing is supported
foreach (var line in script.Where(s => !commentRegex.IsMatch(s)))
{
// statements can also be separated with semicolons
var statements = line.Split(";").Where(s => !string.IsNullOrWhiteSpace(s));
foreach (var statement in statements)
{
if (!statement.Contains("IncludeScript") && !statement.Contains("DoIncludeScript"))
{
continue;
}

Match m = functionParametersRegex.Match(statement);
if (!m.Success)
{
CompilePalLogger.LogLineDebug($"Failed to parse function arguments {statement} in file: {fullpath}");
continue;
}
// capture group 0 is always full match, 1 is capture
var functionParameters = m.Groups[1].Value.Split(",");

// only want 1st param (filename)
includedScripts.Add(Path.Combine("scripts", "vscripts", functionParameters[0].Replace("\"", "").Trim()));
}
}

return includedScripts;

}

Expand Down Expand Up @@ -851,5 +893,6 @@ private static string readNullTerminatedString(FileStream fs, BinaryReader reade

return Encoding.ASCII.GetString(verString.ToArray()).Trim('\0');
}

}
}
21 changes: 19 additions & 2 deletions CompilePalX/Compilers/BSPPack/PakFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,7 @@ public PakFile(BSP bsp, List<string> sourceDirectories, List<string> includeFile
if (AddInternalFile(sound, FindExternalFile(sound)))
sndcount++;
foreach (string vscript in bsp.vscriptList)
if (AddInternalFile(vscript, FindExternalFile(vscript)))
vscriptcount++;
AddVScript(vscript);
foreach (KeyValuePair<string, string> teamSelectionBackground in bsp.PanoramaMapBackgrounds)
if (AddInternalFile(teamSelectionBackground.Key, teamSelectionBackground.Value))
PanoramaMapBackgroundCount++;
Expand Down Expand Up @@ -362,6 +361,24 @@ public void AddParticle(string internalPath)
}
}

/// <summary>
/// Adds VScript file and finds it's dependencies
/// </summary>
/// <param name="internalPath"></param>
public void AddVScript(string internalPath)
{
string externalPath = FindExternalFile(internalPath);
if (!AddInternalFile(internalPath, externalPath))
{
CompilePalLogger.LogCompileError($"Failed to find VScript file {internalPath}\n", new Error($"Failed to find VScript file", ErrorSeverity.Error));
return;
}
vscriptcount++;

foreach (string vscript in AssetUtils.FindVSCriptRefs(externalPath))
AddVScript(vscript);
}

private string FindExternalFile(string internalPath)
{
// Attempts to find the file from the internalPath
Expand Down

0 comments on commit d7f1828

Please sign in to comment.