コード例 #1
0
        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);
        }
コード例 #2
0
        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);
                        }
                    }
                }
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 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);
         });
     }
 }
コード例 #5
0
        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);
        }
コード例 #6
0
        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();
            }
        }
コード例 #7
0
        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();
            }
        }