public static string MakeDataFile(string[] fileNames, int splitSize, string baseFileName, bool makeFileNameAssumptions)
{
Environment.CurrentDirectory = Factory.AGSEditor.CurrentGame.DirectoryPath;
ourlib.DataFilenames.Clear();
ourlib.Files.Clear();
ourlib.Files.Capacity = fileNames.Length;
int currentDataFile = 0;
long sizeSoFar = 0;
bool doSplitting = false;
for (int i = 0; i < fileNames.Length; ++i)
{
if (splitSize > 0)
{
if (string.Compare(fileNames[i], NativeConstants.SPRSET_NAME, true) == 0)
{
// the sprite file's appearance signifies it's time to start splitting
doSplitting = true;
currentDataFile++;
sizeSoFar = 0;
}
else if ((sizeSoFar > splitSize) && (doSplitting) && (currentDataFile < (NativeConstants.MAXMULTIFILES - 1)))
{
currentDataFile++;
sizeSoFar = 0;
}
}
long thisFileSize = 0;
using (Stream tf = File.OpenRead(fileNames[i]))
{
thisFileSize = tf.Length;
}
sizeSoFar += thisFileSize;
string fileNameSrc = Path.GetFileName(fileNames[i]);
if (fileNameSrc.Length >= NativeConstants.MAX_FILENAME_LENGTH)
{
return "Filename too long: " + fileNames[i];
}
ourlib.Files.Add(new MultiFileLibNew.MultiFile(fileNameSrc, (byte)currentDataFile, thisFileSize));
}
ourlib.DataFilenames.Capacity = currentDataFile + 1;
long startOffset = 0;
long mainHeaderOffset = 0;
string outputFileName;
string firstDataFileFullPath = null;
string outputDir = Path.Combine(AGSEditor.OUTPUT_DIRECTORY, AGSEditor.DATA_OUTPUT_DIRECTORY);
if (makeFileNameAssumptions)
{
Directory.CreateDirectory(outputDir);
}
// First, set up ourlib.data_filenames array with all the filenames
// so that write_clib_header will write the correct amount of data
for (int i = 0, cap = ourlib.DataFilenames.Capacity; i < cap; ++i)
{
if (makeFileNameAssumptions)
{
ourlib.DataFilenames.Add(baseFileName + "." +
(i == 0 ? "ags" : i.ToString("D3")));
}
else
{
ourlib.DataFilenames.Add(Path.GetFileName(baseFileName));
}
}
// adjust the file paths if necessary, so that write_clib_header will
// write the correct amount of data
string tomake;
for (int i = 0; i < ourlib.Files.Count; ++i)
{
using (Stream stream = FindFileInPath(out tomake, ourlib.Files[i].Filename))
{
if (stream != null)
{
stream.Close();
if (!makeFileNameAssumptions) ourlib.Files[i].Filename = tomake;
}
}
}
// now, create the actual files
for (int i = 0; i < ourlib.DataFilenames.Count; ++i)
{
if (makeFileNameAssumptions)
{
outputFileName = Path.Combine(outputDir, ourlib.DataFilenames[i]);
}
else
{
outputFileName = baseFileName;
}
if (i == 0) firstDataFileFullPath = outputFileName;
using (Stream wout = TryFileOpen(outputFileName,
(makeFileNameAssumptions ? FileMode.Create : FileMode.Append), FileAccess.Write))
{
if (wout == null) return "ERROR: unable to open file '" + outputFileName + "' for writing";
BinaryWriter writer = new BinaryWriter(wout);
startOffset = writer.BaseStream.Length;
writer.Write("CLIB\x1A".ToCharArray());
writer.Write((byte)21);
writer.Write((byte)i);
if (i == 0)
{
mainHeaderOffset = writer.BaseStream.Position;
WriteCLIBHeader(writer);
}
string buffer;
for (int j = 0; j < ourlib.Files.Count; ++j)
{
if (ourlib.Files[j].Datafile == i)
{
ourlib.Files[j].Offset = (writer.BaseStream.Position - startOffset);
using (Stream stream = FindFileInPath(out buffer, ourlib.Files[j].Filename))
{
if (stream == null)
{
try
{
File.Delete(outputFileName);
}
catch
{
}
return "Unable to find file '" + ourlib.Files[j].Filename + "' for compilation in directory '" + Directory.GetCurrentDirectory() + "'. Do not remove files during the compilation process.";
}
if (CopyFileAcross(stream, writer.BaseStream, ourlib.Files[j].Length) < 1)
{
return "Error writing file '" + ourlib.Files[j].Filename + "': possibly disk full";
}
}
}
}
if (startOffset > 0)
{
writer.Write((int)startOffset);
writer.Write(NativeConstants.CLIB_END_SIGNATURE.ToCharArray());
}
}
}
using (Stream wout = TryFileOpen(firstDataFileFullPath, FileMode.Open, FileAccess.Write))
{
wout.Seek(mainHeaderOffset, SeekOrigin.Begin);
WriteCLIBHeader(new BinaryWriter(wout));
}
return null;
}