public static void SaveWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, Stream stream, bool leaveOpen = false) { var mpqFiles = mpqArchiveBuilder.ToArray(); var campaignInfoFile = mpqFiles.SingleOrDefault(file => file.Name == CampaignInfoHashedFileName); if (campaignInfoFile is not null) { using var reader = new BinaryReader(campaignInfoFile.MpqStream, new UTF8Encoding(false, true), true); var campaignInfo = reader.ReadCampaignInfo(); campaignInfoFile.MpqStream.Position = 0; mpqArchiveBuilder.SaveWithPreArchiveData(stream, campaignInfo, leaveOpen); } else { var mapInfoFile = mpqFiles.SingleOrDefault(file => file.Name == MapInfoHashedFileName); if (mapInfoFile is not null) { using var reader = new BinaryReader(mapInfoFile.MpqStream, new UTF8Encoding(false, true), true); var mapInfo = reader.ReadMapInfo(); mapInfoFile.MpqStream.Position = 0; mpqArchiveBuilder.SaveWithPreArchiveData(stream, mapInfo, leaveOpen); } else { throw new FileNotFoundException($"Unable to find {CampaignInfo.FileName} or {MapInfo.FileName} file to use as source for pre-archive data."); } } }
public static void SaveWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, string fileName, MpqArchiveCreateOptions createOptions, MapInfo mapInfo) { using (var stream = FileProvider.CreateFileAndFolder(fileName)) { mapInfo.WriteArchiveHeaderToStream(stream); mpqArchiveBuilder.SaveTo(stream, createOptions); } }
public static void SaveWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, string fileName, CampaignInfo campaignInfo) { using (var stream = FileProvider.CreateFileAndFolder(fileName)) { campaignInfo.WriteArchiveHeaderToStream(stream); mpqArchiveBuilder.SaveTo(stream); } }
public static void SaveMapWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, string fileName, MapInfo mapInfo, MapTriggerStrings?mapTriggerStrings, Encoding encoding) { using (var stream = FileProvider.CreateFileAndFolder(fileName)) { mapInfo.WriteArchiveHeaderToStream(stream, mapTriggerStrings, encoding); mpqArchiveBuilder.SaveTo(stream); } }
public static void SaveCampaignWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, string fileName, MpqArchiveCreateOptions createOptions, CampaignInfo campaignInfo, CampaignTriggerStrings?campaignTriggerStrings, Encoding encoding) { using (var stream = FileProvider.CreateFileAndFolder(fileName)) { campaignInfo.WriteArchiveHeaderToStream(stream, campaignTriggerStrings, encoding); mpqArchiveBuilder.SaveTo(stream, createOptions); } }
public static void SaveWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, string fileName, MpqArchiveCreateOptions createOptions) { var mpqFiles = mpqArchiveBuilder.ToArray(); var campaignInfoFile = mpqFiles.SingleOrDefault(file => file.Name == CampaignInfoHashedFileName); if (campaignInfoFile is not null) { using var reader = new BinaryReader(campaignInfoFile.MpqStream, _defaultEncoding, true); var campaignInfo = reader.ReadCampaignInfo(); campaignInfoFile.MpqStream.Position = 0; var campaignTriggerStringsFile = mpqFiles.SingleOrDefault(file => file.Name == CampaignTriggerStringsHashedFileName); if (campaignTriggerStringsFile is not null) { using var triggerStringsReader = new StreamReader(campaignTriggerStringsFile.MpqStream, _defaultEncoding, leaveOpen: true); var campaignTriggerStrings = triggerStringsReader.ReadCampaignTriggerStrings(); campaignTriggerStringsFile.MpqStream.Position = 0; mpqArchiveBuilder.SaveCampaignWithPreArchiveData(fileName, createOptions, campaignInfo, campaignTriggerStrings); } else { mpqArchiveBuilder.SaveCampaignWithPreArchiveData(fileName, createOptions, campaignInfo); } } else { var mapInfoFile = mpqFiles.SingleOrDefault(file => file.Name == MapInfoHashedFileName); if (mapInfoFile is not null) { using var reader = new BinaryReader(mapInfoFile.MpqStream, _defaultEncoding, true); var mapInfo = reader.ReadMapInfo(); mapInfoFile.MpqStream.Position = 0; var mapTriggerStringsFile = mpqFiles.SingleOrDefault(file => file.Name == MapTriggerStringsHashedFileName); if (mapTriggerStringsFile is not null) { using var triggerStringsReader = new StreamReader(mapTriggerStringsFile.MpqStream, _defaultEncoding, leaveOpen: true); var mapTriggerStrings = triggerStringsReader.ReadMapTriggerStrings(); mapTriggerStringsFile.MpqStream.Position = 0; mpqArchiveBuilder.SaveMapWithPreArchiveData(fileName, createOptions, mapInfo, mapTriggerStrings); } else { mpqArchiveBuilder.SaveMapWithPreArchiveData(fileName, createOptions, mapInfo); } } else { throw new FileNotFoundException($"Unable to find {CampaignInfo.FileName} or {MapInfo.FileName} file to use as source for pre-archive data."); } } }
protected virtual MpqArchiveBuilder CreateArchiveBuilder() { var archiveBuilder = new MpqArchiveBuilder(); void AddFilesToArchiveBuilder(params MpqFile?[] files) { foreach (var file in files) { if (file is not null) { archiveBuilder !.AddFile(file); } } } AddFilesToArchiveBuilder( _map.GetDoodadsFile(_encoding), _map.GetScriptFile(_encoding), _map.GetPreviewIconsFile(_encoding), _map.GetShadowMapFile(_encoding), _map.GetAbilityObjectDataFile(_encoding), _map.GetDestructableObjectDataFile(_encoding), _map.GetCamerasFile(_encoding), _map.GetDoodadObjectDataFile(_encoding), _map.GetEnvironmentFile(_encoding), _map.GetBuffObjectDataFile(_encoding), _map.GetInfoFile(_encoding), _map.GetUpgradeObjectDataFile(_encoding), _map.GetRegionsFile(_encoding), _map.GetSoundsFile(_encoding), _map.GetItemObjectDataFile(_encoding), _map.GetUnitObjectDataFile(_encoding), _map.GetCustomTextTriggersFile(_encoding), _map.GetPathingMapFile(_encoding), _map.GetTriggersFile(_encoding), _map.GetTriggerStringsFile(_encoding), _map.GetUnitsFile(_encoding)); AddFilesToArchiveBuilder(_files.ToArray()); return(archiveBuilder); }
public static void SaveWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, Stream stream, MpqArchiveCreateOptions createOptions, MapInfo mapInfo, bool leaveOpen = false) { mapInfo.WriteArchiveHeaderToStream(stream); mpqArchiveBuilder.SaveTo(stream, createOptions, leaveOpen); }
public static void SaveWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, Stream stream, CampaignInfo campaignInfo, bool leaveOpen = false) { campaignInfo.WriteArchiveHeaderToStream(stream); mpqArchiveBuilder.SaveTo(stream, leaveOpen); }
private static void SaveArchiveBackgroundWork(object?sender, DoWorkEventArgs e) { var archiveBuilder = new MpqArchiveBuilder(_archive); var progress = new SaveArchiveProgress(); progress.Saving = false; for (var i = 0; i < _fileList.Items.Count; i++) { var tag = _fileList.Items[i].GetTag(); if (tag.Parent is not null) { continue; } if (tag.Status == MapFileStatus.Removed) { if (tag.TryGetHashedFileName(out var hashedFileName)) { archiveBuilder.RemoveFile(hashedFileName); } else { archiveBuilder.RemoveFile(_archive, tag.MpqEntry); } } else if (tag.Children is not null) { if (tag.Children.All(child => child.Status == MapFileStatus.Removed)) { throw new InvalidOperationException("Parent tag should have been removed since all child tags are removed, but was " + tag.Status); } else if (tag.Children.Any(child => child.IsModified || child.Status == MapFileStatus.Removed)) { // Assume at most one nested archive (for campaign archives), so no recursion. using var subArchive = MpqArchive.Open(_archive.OpenFile(tag.FileName)); foreach (var child in tag.Children) { if (child.FileName != null) { subArchive.AddFileName(child.FileName); } } var subArchiveBuilder = new MpqArchiveBuilder(subArchive); foreach (var child in tag.Children) { if (child.Status == MapFileStatus.Removed) { if (child.TryGetHashedFileName(out var hashedFileName)) { subArchiveBuilder.RemoveFile(hashedFileName); } else { subArchiveBuilder.RemoveFile(subArchive, child.MpqEntry); } } else if (child.TryGetModifiedMpqFile(out var subArchiveAdaptedFile)) { subArchiveBuilder.AddFile(subArchiveAdaptedFile); _saveArchiveWorker.ReportProgress(0, progress); } else { _saveArchiveWorker.ReportProgress(0, progress); } } var adaptedSubArchiveStream = new MemoryStream(); subArchiveBuilder.SaveWithPreArchiveData(adaptedSubArchiveStream, true); adaptedSubArchiveStream.Position = 0; var adaptedFile = MpqFile.New(adaptedSubArchiveStream, tag.FileName, false); adaptedFile.TargetFlags = tag.MpqEntry.Flags; archiveBuilder.AddFile(adaptedFile); _saveArchiveWorker.ReportProgress(0, progress); } else { _saveArchiveWorker.ReportProgress(tag.Children.Length, progress); } } else if (tag.TryGetModifiedMpqFile(out var adaptedFile)) { archiveBuilder.AddFile(adaptedFile); _saveArchiveWorker.ReportProgress(0, progress); } else { _saveArchiveWorker.ReportProgress(0, progress); } } progress.Saving = true; _saveArchiveWorker.ReportProgress(0, progress); using (var fileStream = File.Create((string)e.Argument)) { archiveBuilder.SaveWithPreArchiveData(fileStream); } }
public void TranspileAndSaveTest(string inputFile, string outputFile, ScriptLanguage targetLanguage) { var targetFileName = targetLanguage switch { ScriptLanguage.Jass => "war3map.j", ScriptLanguage.Lua => "war3map.lua", _ => throw new InvalidEnumArgumentException(nameof(targetLanguage), (int)targetLanguage, typeof(ScriptLanguage)), }; using var mapArchive = MpqArchive.Open(inputFile, true); var map = Map.Open(mapArchive); var sourceLanguage = map.Info.ScriptLanguage; var mpqArchiveBuilder = new MpqArchiveBuilder(mapArchive); using var mapInfoStream = new MemoryStream(); using var mapInfoWriter = new BinaryWriter(mapInfoStream); var mapInfo = map.Info; mapInfo.ScriptLanguage = targetLanguage; if (mapInfo.FormatVersion < MapInfoFormatVersion.Lua) { mapInfo.FormatVersion = MapInfoFormatVersion.Lua; if (mapInfo.GameVersion is null) { mapInfo.GameVersion = GamePatchVersionProvider.GetGameVersion(War3Net.Build.Common.GamePatch.v1_31_1); } } mapInfoWriter.Write(mapInfo); mapInfoStream.Position = 0; mpqArchiveBuilder.AddFile(MpqFile.New(mapInfoStream, MapInfo.FileName)); if (sourceLanguage == ScriptLanguage.Jass) { if (targetLanguage != ScriptLanguage.Lua) { throw new NotSupportedException($"Unable to transpile from {sourceLanguage} to {targetLanguage}."); } mpqArchiveBuilder.RemoveFile("war3map.j"); mpqArchiveBuilder.RemoveFile(@"Scripts\war3map.j"); using var reader = new StreamReader(@"C:\Users\Stan\Google Drive\PHP Projects\Files\common.j"); var commonJ = JassSyntaxFactory.ParseCompilationUnit(reader.ReadToEnd()); using var reader2 = new StreamReader(@"C:\Users\Stan\Google Drive\PHP Projects\Files\blizzard.j"); var blizzardJ = JassSyntaxFactory.ParseCompilationUnit(reader2.ReadToEnd()); var transpiler = new JassToLuaTranspiler(); transpiler.RegisterJassFile(commonJ); transpiler.RegisterJassFile(blizzardJ); var script = mapArchive.OpenFile("war3map.j"); using var reader3 = new StreamReader(script); var luaCompilationUnit = transpiler.Transpile(JassSyntaxFactory.ParseCompilationUnit(reader3.ReadToEnd())); script.Close(); var tempFileName = Path.GetTempFileName(); try { using (var writer = new StreamWriter(tempFileName)) { var luaRenderOptions = new LuaSyntaxGenerator.SettingInfo { // Indent = 4, // IsCommentsDisabled = true, }; var luaRenderer = new LuaRenderer(luaRenderOptions, writer); luaRenderer.RenderCompilationUnit(luaCompilationUnit); } using var fileStream = File.OpenRead(tempFileName); mpqArchiveBuilder.AddFile(MpqFile.New(fileStream, targetFileName)); var mpqArchiveCreateOptions = new MpqArchiveCreateOptions { AttributesCreateMode = MpqFileCreateMode.Prune, }; mpqArchiveBuilder.SaveTo(outputFile, mpqArchiveCreateOptions); } finally { File.Delete(tempFileName); } } else if (sourceLanguage == ScriptLanguage.Lua) { throw new NotSupportedException($"Unable to transpile from {sourceLanguage} to {targetLanguage}."); } else { throw new NotSupportedException($"Unable to transpile from {sourceLanguage} to {targetLanguage}."); } }
public static void SaveMapWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, Stream stream, MpqArchiveCreateOptions createOptions, MapInfo mapInfo, MapTriggerStrings?mapTriggerStrings, Encoding encoding, bool leaveOpen = false) { mapInfo.WriteArchiveHeaderToStream(stream, mapTriggerStrings, encoding); mpqArchiveBuilder.SaveTo(stream, createOptions, leaveOpen); }
public static void SaveMapWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, Stream stream, MapInfo mapInfo, Encoding encoding, bool leaveOpen = false) { mapInfo.WriteArchiveHeaderToStream(stream, encoding); mpqArchiveBuilder.SaveTo(stream, leaveOpen); }
public static void SaveMapWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, Stream stream, MapInfo mapInfo, MapTriggerStrings?mapTriggerStrings, bool leaveOpen = false) { mapInfo.WriteArchiveHeaderToStream(stream, mapTriggerStrings); mpqArchiveBuilder.SaveTo(stream, leaveOpen); }
public static void SaveCampaignWithPreArchiveData(this MpqArchiveBuilder mpqArchiveBuilder, Stream stream, MpqArchiveCreateOptions createOptions, CampaignInfo campaignInfo, CampaignTriggerStrings?campaignTriggerStrings, Encoding encoding, bool leaveOpen = false) { campaignInfo.WriteArchiveHeaderToStream(stream, campaignTriggerStrings, encoding); mpqArchiveBuilder.SaveTo(stream, createOptions, leaveOpen); }
public static void TranspileAndSave(string inputFile, string outputFile, string?commonJPath, string?blizzardJPath, ScriptLanguage targetLanguage, BackgroundWorker?worker) { var targetFileName = targetLanguage switch { ScriptLanguage.Jass => "war3map.j", ScriptLanguage.Lua => "war3map.lua", _ => throw new InvalidEnumArgumentException(nameof(targetLanguage), (int)targetLanguage, typeof(ScriptLanguage)), }; using var mapArchive = MpqArchive.Open(inputFile, true); var map = Map.Open(mapArchive); var sourceLanguage = map.Info.ScriptLanguage; var mpqArchiveBuilder = new MpqArchiveBuilder(mapArchive); using var mapInfoStream = new MemoryStream(); using var mapInfoWriter = new BinaryWriter(mapInfoStream); var mapInfo = map.Info; mapInfo.ScriptLanguage = targetLanguage; if (mapInfo.FormatVersion < MapInfoFormatVersion.Lua) { mapInfo.FormatVersion = MapInfoFormatVersion.Lua; if (mapInfo.GameVersion is null) { mapInfo.GameVersion = GamePatchVersionProvider.GetGameVersion(GamePatch.v1_31_1); } } mapInfoWriter.Write(mapInfo); mapInfoStream.Position = 0; mpqArchiveBuilder.AddFile(MpqFile.New(mapInfoStream, MapInfo.FileName)); if (sourceLanguage == ScriptLanguage.Jass) { if (targetLanguage != ScriptLanguage.Lua) { throw new NotSupportedException($"Unable to transpile from {sourceLanguage} to {targetLanguage}."); } mpqArchiveBuilder.RemoveFile("war3map.j"); mpqArchiveBuilder.RemoveFile(@"Scripts\war3map.j"); var jassHelperFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Warcraft III", "JassHelper"); if (string.IsNullOrEmpty(commonJPath)) { if (Directory.Exists(jassHelperFolder)) { commonJPath = Path.Combine(jassHelperFolder, "common.j"); if (string.IsNullOrEmpty(blizzardJPath)) { blizzardJPath = Path.Combine(jassHelperFolder, "Blizzard.j"); } } else { throw new DirectoryNotFoundException("Unable to automatically find common.j and Blizzard.j folder."); } } var mapHasCustomBlizzardJ = mapArchive.FileExists(@"Scripts\Blizzard.j"); if (string.IsNullOrEmpty(blizzardJPath) && !mapHasCustomBlizzardJ) { if (Directory.Exists(jassHelperFolder)) { blizzardJPath = Path.Combine(jassHelperFolder, "Blizzard.j"); } else { throw new DirectoryNotFoundException("Unable to automatically find common.j and Blizzard.j folder."); } } var estimatedWorkToTranspile = map.Script.Length + 700000; var estimatedWorkToRegisterCommonAndBlizzard = 35000000 / estimatedWorkToTranspile; if (estimatedWorkToRegisterCommonAndBlizzard == 0) { estimatedWorkToRegisterCommonAndBlizzard = 1; } var transpiler = new JassToLuaTranspiler(); transpiler.RegisterJassFile(JassSyntaxFactory.ParseCompilationUnit(File.ReadAllText(commonJPath))); worker?.ReportProgress(estimatedWorkToRegisterCommonAndBlizzard); if (mapHasCustomBlizzardJ) { throw new NotImplementedException("Custom Blizzard.j files are currently not supported."); } else { transpiler.RegisterJassFile(JassSyntaxFactory.ParseCompilationUnit(File.ReadAllText(blizzardJPath))); worker?.ReportProgress(estimatedWorkToRegisterCommonAndBlizzard * 2); } var luaCompilationUnit = transpiler.Transpile(JassSyntaxFactory.ParseCompilationUnit(map.Script)); using var stream = new MemoryStream(); using (var writer = new StreamWriter(stream, leaveOpen: true)) { var luaRenderOptions = new LuaSyntaxGenerator.SettingInfo { // Indent = 4, // IsCommentsDisabled = true, }; var luaRenderer = new LuaRenderer(luaRenderOptions, writer); luaRenderer.RenderCompilationUnit(luaCompilationUnit); writer.Flush(); } stream.Position = 0; mpqArchiveBuilder.AddFile(MpqFile.New(stream, targetFileName)); worker?.ReportProgress(100); var mpqArchiveCreateOptions = new MpqArchiveCreateOptions { }; mpqArchiveBuilder.SaveTo(outputFile, mpqArchiveCreateOptions); } else if (sourceLanguage == ScriptLanguage.Lua) { mpqArchiveBuilder.RemoveFile("war3map.lua"); mpqArchiveBuilder.RemoveFile(@"Scripts\war3map.lua"); throw new NotSupportedException($"Unable to transpile from {sourceLanguage} to {targetLanguage}."); } else { throw new NotSupportedException($"Unable to transpile from {sourceLanguage} to {targetLanguage}."); } }