public override bool Build(CompileMessages errors, bool forceRebuild)
{
if (!base.Build(errors, forceRebuild))
{
return(false);
}
string compiledDir = AGSEditor.OUTPUT_DIRECTORY;
string baseGameFileName = Factory.AGSEditor.BaseGameFileName;
string newExeName = GetCompiledPath(baseGameFileName + ".exe");
string sourceEXE = Path.Combine(Factory.AGSEditor.EditorDirectory, AGSEditor.ENGINE_EXE_FILE_NAME);
File.Copy(sourceEXE, newExeName, true);
UpdateWindowsEXE(newExeName, errors);
CreateCompiledSetupProgram();
Environment.CurrentDirectory = Factory.AGSEditor.CurrentGame.DirectoryPath;
foreach (string fileName in Utilities.GetDirectoryFileList(compiledDir, "*"))
{
if (fileName.EndsWith(".ags"))
{
using (FileStream ostream = File.Open(GetCompiledPath(baseGameFileName + ".exe"), FileMode.Append,
FileAccess.Write))
{
int startPosition = (int)ostream.Position;
using (FileStream istream = File.Open(fileName, FileMode.Open, FileAccess.Read))
{
const int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
for (int count = istream.Read(buffer, 0, bufferSize); count > 0;
count = istream.Read(buffer, 0, bufferSize))
{
ostream.Write(buffer, 0, count);
}
}
// write the offset into the EXE where the first data file resides
ostream.Write(BitConverter.GetBytes(startPosition), 0, 4);
// write the CLIB end signature so the engine knows this is a valid EXE
ostream.Write(Encoding.UTF8.GetBytes(NativeConstants.CLIB_END_SIGNATURE.ToCharArray()), 0,
NativeConstants.CLIB_END_SIGNATURE.Length);
}
}
else if (!fileName.EndsWith(AGSEditor.CONFIG_FILE_NAME))
{
Utilities.CreateHardLink(GetCompiledPath(Path.GetFileName(fileName)), fileName, true);
}
}
// Update config file with current game parameters
Factory.AGSEditor.WriteConfigFile(GetCompiledPath());
// Copy Windows plugins
CopyPlugins(errors);
return(true);
}