internal static void RunStreamRWTest( string filePath, Type type, string writeMethodName) { var readMethod = typeof(StreamReaderExtensions).GetMethod($"Read{type.Name}"); Assert.IsNotNull(readMethod, $"Could not find extension method to read {type.Name}."); var writeMethod = typeof(StreamWriterExtensions).GetMethod(writeMethodName, new[] { typeof(StreamWriter), type }); Assert.IsNotNull(writeMethod, $"Could not find extension method to write {type.Name}."); using var expectedStream = MpqFile.OpenRead(filePath); using var reader = new StreamReader(expectedStream, new UTF8Encoding(false, true)); var parsedFile = readMethod !.Invoke(null, new[] { reader }); Assert.AreEqual(type, parsedFile !.GetType()); using var actualStream = new MemoryStream(); using var writer = new StreamWriter(actualStream, reader.CurrentEncoding); writeMethod !.Invoke(null, new[] { writer, parsedFile }); writer.Flush(); StreamAssert.AreEqualText(expectedStream, actualStream, true); }
private static IEnumerable <object[]> GetMapTriggersDataSpecificFormatVersion(MapTriggersFormatVersion?formatVersion) { foreach (var testData in GetMapTriggersData()) { using var original = MpqFile.OpenRead((string)testData[0]); using var reader = new BinaryReader(original); if (original.Length >= 8) { if (reader.ReadInt32() == MapTriggers.FileFormatSignature) { var actualVersion = (MapTriggersFormatVersion?)reader.ReadInt32(); if (!Enum.IsDefined(typeof(MapTriggersFormatVersion), actualVersion)) { actualVersion = null; } if (formatVersion == actualVersion) { yield return(testData); } } } } }
private void TestParseObjectDataInternal(string objectDataFilePath, bool fromCampaign) { using var original = MpqFile.OpenRead(objectDataFilePath); using var recreated = new MemoryStream(); using var objectDataReader = new BinaryReader(original); var objectData = objectDataReader.ReadObjectData(fromCampaign); using var objectDataWriter = new BinaryWriter(recreated); objectDataWriter.Write(objectData); StreamAssert.AreEqual(original, recreated, true, true); }
public void TestFileProviderGetFile(string path, bool expected) { if (expected) { using var file = MpqFile.OpenRead(path); Assert.IsNotNull(file); } else { Assert.ThrowsException <FileNotFoundException>(() => { using var file = MpqFile.OpenRead(path); }); } }
internal static void RunBinaryRWTest( string filePath, Type type, string?readMethodName = null, object[]?additionalReadParameters = null, object[]?additionalWriteParameters = null) { var expectedReadTypes = new[] { typeof(BinaryReader) }; if (additionalReadParameters is not null) { expectedReadTypes = expectedReadTypes.Concat(additionalReadParameters.Select(p => p.GetType())).ToArray(); } var readMethod = typeof(BinaryReaderExtensions).GetMethod(readMethodName ?? $"Read{type.Name}", expectedReadTypes); Assert.IsNotNull(readMethod, $"Could not find extension method to read {type.Name}."); var expectedWriteTypes = new[] { typeof(BinaryWriter), type }; if (additionalWriteParameters is not null) { expectedWriteTypes = expectedWriteTypes.Concat(additionalWriteParameters.Select(p => p.GetType())).ToArray(); } var writeMethod = typeof(BinaryWriterExtensions).GetMethod(nameof(BinaryWriter.Write), expectedWriteTypes); Assert.IsNotNull(writeMethod, $"Could not find extension method to write {type.Name}."); using var expectedStream = MpqFile.OpenRead(filePath); using var reader = new BinaryReader(expectedStream); var parsedFile = readMethod !.Invoke(null, new object?[] { reader }.Concat(additionalReadParameters ?? Array.Empty <object?[]>()).ToArray()); Assert.AreEqual(type, parsedFile !.GetType()); using var actualStream = new MemoryStream(); using var writer = new BinaryWriter(actualStream); writeMethod !.Invoke(null, new object?[] { writer, parsedFile }.Concat(additionalWriteParameters ?? Array.Empty <object?[]>()).ToArray()); writer.Flush(); StreamAssert.AreEqual(expectedStream, actualStream, true); }
private Map(MpqArchive mapArchive) { using var infoStream = MpqFile.OpenRead(mapArchive, MapInfo.FileName); using var infoReader = new BinaryReader(infoStream); Info = infoReader.ReadMapInfo(); using var environmentStream = MpqFile.OpenRead(mapArchive, MapEnvironment.FileName); using var environmentReader = new BinaryReader(environmentStream); Environment = environmentReader.ReadMapEnvironment(); var extension = Info.ScriptLanguage switch { ScriptLanguage.Jass => ".j", ScriptLanguage.Lua => ".lua", _ => throw new InvalidEnumArgumentException(nameof(Info.ScriptLanguage), (int)Info.ScriptLanguage, typeof(ScriptLanguage)), }; if (MpqFile.Exists(mapArchive, $"war3map{extension}")) { using var scriptStream = MpqFile.OpenRead(mapArchive, $"war3map{extension}"); using var scriptReader = new StreamReader(scriptStream); Script = scriptReader.ReadToEnd(); } else if (MpqFile.Exists(mapArchive, $@"scripts\war3map{extension}")) { using var scriptStream = MpqFile.OpenRead(mapArchive, $@"scripts\war3map{extension}"); using var scriptReader = new StreamReader(scriptStream); Script = scriptReader.ReadToEnd(); } else { throw new FileNotFoundException($"Cannot find {Info.ScriptLanguage} map script."); } if (MpqFile.Exists(mapArchive, MapSounds.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapSounds.FileName); using var reader = new BinaryReader(fileStream); Sounds = reader.ReadMapSounds(); } if (MpqFile.Exists(mapArchive, MapCameras.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapCameras.FileName); using var reader = new BinaryReader(fileStream); Cameras = reader.ReadMapCameras(); } if (MpqFile.Exists(mapArchive, MapPathingMap.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapPathingMap.FileName); using var reader = new BinaryReader(fileStream); PathingMap = reader.ReadMapPathingMap(); } if (MpqFile.Exists(mapArchive, MapPreviewIcons.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapPreviewIcons.FileName); using var reader = new BinaryReader(fileStream); PreviewIcons = reader.ReadMapPreviewIcons(); } if (MpqFile.Exists(mapArchive, MapRegions.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapRegions.FileName); using var reader = new BinaryReader(fileStream); Regions = reader.ReadMapRegions(); } if (MpqFile.Exists(mapArchive, MapShadowMap.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapShadowMap.FileName); using var reader = new BinaryReader(fileStream); ShadowMap = reader.ReadMapShadowMap(); } if (MpqFile.Exists(mapArchive, MapImportedFiles.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapImportedFiles.FileName); using var reader = new BinaryReader(fileStream); ImportedFiles = reader.ReadMapImportedFiles(); } if (MpqFile.Exists(mapArchive, MapAbilityObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapAbilityObjectData.FileName); using var reader = new BinaryReader(fileStream); AbilityObjectData = reader.ReadAbilityObjectData(false); } if (MpqFile.Exists(mapArchive, MapBuffObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapBuffObjectData.FileName); using var reader = new BinaryReader(fileStream); BuffObjectData = reader.ReadBuffObjectData(false); } if (MpqFile.Exists(mapArchive, MapDestructableObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapDestructableObjectData.FileName); using var reader = new BinaryReader(fileStream); DestructableObjectData = reader.ReadDestructableObjectData(false); } if (MpqFile.Exists(mapArchive, MapDoodadObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapDoodadObjectData.FileName); using var reader = new BinaryReader(fileStream); DoodadObjectData = reader.ReadDoodadObjectData(false); } if (MpqFile.Exists(mapArchive, MapItemObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapItemObjectData.FileName); using var reader = new BinaryReader(fileStream); ItemObjectData = reader.ReadItemObjectData(false); } if (MpqFile.Exists(mapArchive, MapUnitObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapUnitObjectData.FileName); using var reader = new BinaryReader(fileStream); UnitObjectData = reader.ReadUnitObjectData(false); } if (MpqFile.Exists(mapArchive, MapUpgradeObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapUpgradeObjectData.FileName); using var reader = new BinaryReader(fileStream); UpgradeObjectData = reader.ReadUpgradeObjectData(false); } if (MpqFile.Exists(mapArchive, MapCustomTextTriggers.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapCustomTextTriggers.FileName); using var reader = new BinaryReader(fileStream); CustomTextTriggers = reader.ReadMapCustomTextTriggers(Encoding.UTF8); } if (MpqFile.Exists(mapArchive, MapTriggers.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapTriggers.FileName); using var reader = new BinaryReader(fileStream); Triggers = reader.ReadMapTriggers(TriggerData.Default); } if (MpqFile.Exists(mapArchive, MapTriggerStrings.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapTriggerStrings.FileName); using var reader = new StreamReader(fileStream); TriggerStrings = reader.ReadTriggerStrings(false); } if (MpqFile.Exists(mapArchive, MapDoodads.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapDoodads.FileName); using var reader = new BinaryReader(fileStream); Doodads = reader.ReadMapDoodads(); } if (MpqFile.Exists(mapArchive, MapUnits.FileName)) { using var fileStream = MpqFile.OpenRead(mapArchive, MapUnits.FileName); using var reader = new BinaryReader(fileStream); Units = reader.ReadMapUnits(); } }
private Campaign(MpqArchive campaignArchive) { using var infoStream = MpqFile.OpenRead(campaignArchive, CampaignInfo.FileName); using var infoReader = new BinaryReader(infoStream); Info = infoReader.ReadCampaignInfo(); if (MpqFile.Exists(campaignArchive, CampaignImportedFiles.FileName)) { using var fileStream = MpqFile.OpenRead(campaignArchive, CampaignImportedFiles.FileName); using var reader = new BinaryReader(fileStream); ImportedFiles = reader.ReadCampaignImportedFiles(); } if (MpqFile.Exists(campaignArchive, CampaignAbilityObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(campaignArchive, CampaignAbilityObjectData.FileName); using var reader = new BinaryReader(fileStream); AbilityObjectData = reader.ReadCampaignAbilityObjectData(); } if (MpqFile.Exists(campaignArchive, CampaignBuffObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(campaignArchive, CampaignBuffObjectData.FileName); using var reader = new BinaryReader(fileStream); BuffObjectData = reader.ReadCampaignBuffObjectData(); } if (MpqFile.Exists(campaignArchive, CampaignDestructableObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(campaignArchive, CampaignDestructableObjectData.FileName); using var reader = new BinaryReader(fileStream); DestructableObjectData = reader.ReadCampaignDestructableObjectData(); } if (MpqFile.Exists(campaignArchive, CampaignDoodadObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(campaignArchive, CampaignDoodadObjectData.FileName); using var reader = new BinaryReader(fileStream); DoodadObjectData = reader.ReadCampaignDoodadObjectData(); } if (MpqFile.Exists(campaignArchive, CampaignItemObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(campaignArchive, CampaignItemObjectData.FileName); using var reader = new BinaryReader(fileStream); ItemObjectData = reader.ReadCampaignItemObjectData(); } if (MpqFile.Exists(campaignArchive, CampaignUnitObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(campaignArchive, CampaignUnitObjectData.FileName); using var reader = new BinaryReader(fileStream); UnitObjectData = reader.ReadCampaignUnitObjectData(); } if (MpqFile.Exists(campaignArchive, CampaignUpgradeObjectData.FileName)) { using var fileStream = MpqFile.OpenRead(campaignArchive, CampaignUpgradeObjectData.FileName); using var reader = new BinaryReader(fileStream); UpgradeObjectData = reader.ReadCampaignUpgradeObjectData(); } if (MpqFile.Exists(campaignArchive, CampaignTriggerStrings.FileName)) { using var fileStream = MpqFile.OpenRead(campaignArchive, CampaignTriggerStrings.FileName); using var reader = new StreamReader(fileStream); TriggerStrings = reader.ReadCampaignTriggerStrings(); } }