Esempio n. 1
0
        public void LoadGeneralsMaps()
        {
            var rootFolder   = InstalledFilesTestData.GetInstallationDirectory(SageGame.CncGenerals);
            var installation = new GameInstallation(new GeneralsDefinition(), rootFolder);
            var fileSystem   = installation.CreateFileSystem();

            var maps = fileSystem.GetFiles("maps").Where(x => x.FilePath.EndsWith(".map")).ToList();

            Platform.Start();

            using (var window = new GameWindow("OpenSAGE test runner", 100, 100, 800, 600, GraphicsBackend.Direct3D11))
            {
                using (var game = GameFactory.CreateGame(installation, fileSystem, GamePanel.FromGameWindow(window)))
                {
                    foreach (var map in maps)
                    {
                        _testOutputHelper.WriteLine($"Loading {map.FilePath}...");

                        var scene = game.ContentManager.Load <Scene3D>(map.FilePath);
                        Assert.NotNull(scene);

                        game.ContentManager.Unload();
                    }
                }
            }

            Platform.Stop();
        }
Esempio n. 2
0
        public void CanRoundtripMaps()
        {
            InstalledFilesTestData.ReadFiles(".map", _output, entry =>
            {
                // These maps have false positive differences, so ignore them.
                switch (entry.FilePath)
                {
                // Differences in passability data, because the original file appears to have
                // un-initialized (random) values for partial passability bytes beyond the map width.
                case @"Maps\USA07-TaskForces\USA07-TaskForces.map":
                    return;

                // Uses unknown ZL5 compression.
                case @"maps\Woodcrest Circle\Woodcrest Circle.map":
                    return;
                }

                using (var entryStream = entry.Open())
                {
                    TestUtility.DoRoundtripTest(
                        () => MapFile.Decompress(entryStream),
                        stream => MapFile.FromStream(stream),
                        (mapFile, stream) => mapFile.WriteTo(stream));
                }
            });
        }
Esempio n. 3
0
        public void LoadGeneralsMaps()
        {
            var rootFolder   = InstalledFilesTestData.GetInstallationDirectory(SageGame.CncGenerals);
            var installation = new GameInstallation(new GeneralsDefinition(), rootFolder);

            Platform.Start();

            using (var game = new Game(installation, GraphicsBackend.Direct3D11))
            {
                var maps = game.ContentManager.FileSystem.GetFiles("maps").Where(x => x.FilePath.EndsWith(".map")).ToList();

                foreach (var map in maps)
                {
                    _testOutputHelper.WriteLine($"Loading {map.FilePath}...");

                    game.AssetStore.PushScope();

                    throw new System.NotImplementedException();

                    // TODO: Need to update to use new way of starting game.
                    //using (var scene = game.LoadMap(map.FilePath))
                    //{
                    //    Assert.NotNull(scene);
                    //}

                    game.AssetStore.PopScope();
                }
            }

            Platform.Stop();
        }
Esempio n. 4
0
        public void CanReadManifestFiles()
        {
            InstalledFilesTestData.ReadFiles(".manifest", _output, entry =>
            {
                var gameStream = new GameStream(entry);

                Assert.NotNull(gameStream);
            });
        }
Esempio n. 5
0
        public void CanReadTgaTextures()
        {
            InstalledFilesTestData.ReadFiles(".tga", _output, entry =>
            {
                var tgaFile = TgaFile.FromFileSystemEntry(entry);

                Assert.True(tgaFile.Header.ImagePixelSize == 24 || tgaFile.Header.ImagePixelSize == 32);
            });
        }
Esempio n. 6
0
        public void CanReadAptFiles()
        {
            InstalledFilesTestData.ReadFiles(".apt", _output, entry =>
            {
                var aptFile = AptFile.FromFileSystemEntry(entry);

                Assert.NotNull(aptFile);
            });
        }
Esempio n. 7
0
        public void CanReadDdsTextures()
        {
            InstalledFilesTestData.ReadFiles(".dds", _output, entry =>
            {
                var ddsFile = DdsFile.FromFileSystemEntry(entry);

                Assert.True(ddsFile.MipMaps.Length > 1);
            });
        }
Esempio n. 8
0
        public void CheckEntryCount()
        {
            var fileSystem = new FileSystem(InstalledFilesTestData.GetInstallationDirectory(SageGame.BattleForMiddleEarthII));
            var entry      = fileSystem.GetFile(@"MainMenu.apt");

            var data = AptFile.FromFileSystemEntry(entry);

            Assert.NotNull(data);
        }
Esempio n. 9
0
        public void CanReadCsfFiles()
        {
            InstalledFilesTestData.ReadFiles(".csf", _output, entry =>
            {
                var csfFile = CsfFile.FromFileSystemEntry(entry);

                Assert.NotNull(csfFile);
            });
        }
Esempio n. 10
0
        public void CanReadWndFiles()
        {
            InstalledFilesTestData.ReadFiles(".wnd", _output, entry =>
            {
                var wndFile = WndFile.FromFileSystemEntry(entry);

                Assert.NotNull(wndFile);
            });
        }
Esempio n. 11
0
        public SaveFileTests()
        {
            var rootFolder   = InstalledFilesTestData.GetInstallationDirectory(SageGame.CncGenerals);
            var installation = new GameInstallation(new GeneralsDefinition(), rootFolder);

            Platform.Start();

            _game = new Game(installation, GraphicsBackend.Direct3D11);
        }
Esempio n. 12
0
        public GameFixture()
        {
            var rootFolder   = InstalledFilesTestData.GetInstallationDirectory(SageGame.CncGenerals);
            var installation = new GameInstallation(new GeneralsDefinition(), rootFolder);

            Platform.Start();

            Game = new Game(installation);
        }
Esempio n. 13
0
        public void CanReadConstFiles()
        {
            InstalledFilesTestData.ReadFiles(".const", _output, entry =>
            {
                var constFile = ConstantData.FromFileSystemEntry(entry);

                Assert.NotNull(constFile);
            });
        }
Esempio n. 14
0
        public void CanReadAniCursors()
        {
            InstalledFilesTestData.ReadFiles(".cur", _output, entry =>
            {
                var curFile = CurFile.FromFileSystemEntry(entry);

                Assert.NotNull(curFile);
                Assert.True(curFile.Image.Width > 0);
            });
        }
Esempio n. 15
0
 public void CanRoundtripWakFiles()
 {
     InstalledFilesTestData.ReadFiles(".wak", _output, entry =>
     {
         TestUtility.DoRoundtripTest(
             entry.Open,
             stream => WakFile.Parse(stream),
             (wakFile, stream) => wakFile.WriteTo(stream));
     });
 }
Esempio n. 16
0
        public void CanReadIniFiles()
        {
            // TODO: Finish INI parsing for BFME and subsequent games.
            var gameDefinitions = new[]
            {
                GameDefinition.FromGame(SageGame.CncGenerals),
                GameDefinition.FromGame(SageGame.CncGeneralsZeroHour)
            };

            InstalledFilesTestData.ReadFiles(".ini", _output, gameDefinitions, entry =>
            {
                switch (Path.GetFileName(entry.FilePath).ToLowerInvariant())
                {
                case "buttonsets.ini":             // Doesn't seem to be used?
                case "scripts.ini":                // Only needed by World Builder?
                case "commandmapdebug.ini":        // Only applies to DEBUG and INTERNAL builds
                case "fxparticlesystemcustom.ini": // Don't know if this is used, it uses Emitter property not used elsewhere
                case "lightpoints.ini":            // Don't know if this is used.
                    return;
                }

                var dataContext = new IniDataContext(entry.FileSystem);

                // BFME I and II need to have GameData.ini loaded before any other INI files,
                // because GameData.ini contains global macro definitions.
                if (entry.FilePath.ToLowerInvariant() != @"data\ini\gamedata.ini")
                {
                    dataContext.LoadIniFile(@"Data\INI\GameData.ini");
                }

                dataContext.LoadIniFile(entry);

                Assert.NotNull(dataContext.CommandMaps);

                foreach (var objectDefinition in dataContext.Objects)
                {
                    foreach (var draw in objectDefinition.Draws)
                    {
                        switch (draw)
                        {
                        case W3dModelDrawModuleData md:
                            //if (md.DefaultConditionState != null)
                            //{
                            //    Assert.True(md.DefaultConditionState.Animations.Count <= 1);
                            //}
                            //foreach (var conditionState in md.ConditionStates)
                            //{
                            //    Assert.True(conditionState.Animations.Count <= 1);
                            //}
                            break;
                        }
                    }
                }
            });
        }
Esempio n. 17
0
        public void CanReadAniCursors()
        {
            InstalledFilesTestData.ReadFiles(".ani", _output, entry =>
            {
                var aniFile = AniFile.FromFileSystemEntry(entry);

                Assert.NotNull(aniFile);

                Assert.True(aniFile.ArtistName == null || aniFile.ArtistName == "PRobb");
            });
        }
Esempio n. 18
0
        public void LoadW3dFromBigFile()
        {
            var bigFilePath = Path.Combine(InstalledFilesTestData.GetInstallationDirectory(SageGame.CncGeneralsZeroHour), "W3DZH.big");

            using (var bigArchive = new BigArchive(bigFilePath))
            {
                var entry = bigArchive.GetEntry(@"Art\W3D\ABBarracks_AC.W3D");

                var w3dFile = W3dFile.FromFileSystemEntry(new FileSystemEntry(null, entry.FullName, entry.Length, entry.Open));
                Assert.Equal(3, w3dFile.Meshes.Count);
            }
        }
Esempio n. 19
0
 public void CanRoundtripBases()
 {
     InstalledFilesTestData.ReadFiles(".bse", _output, entry =>
     {
         using (var entryStream = entry.Open())
         {
             TestUtility.DoRoundtripTest(
                 () => MapFile.Decompress(entryStream),
                 stream => MapFile.FromStream(stream),
                 (mapFile, stream) => mapFile.WriteTo(stream));
         }
     });
 }
Esempio n. 20
0
 public void CanRoundtripScbFiles()
 {
     InstalledFilesTestData.ReadFiles(".scb", _output, entry =>
     {
         using (var fileStream = entry.Open())
         {
             TestUtility.DoRoundtripTest(
                 () => MapFile.Decompress(fileStream),
                 stream => ScbFile.FromStream(stream),
                 (scbFile, stream) => scbFile.WriteTo(stream));
         }
     });
 }
Esempio n. 21
0
        public void CanReadAptFiles()
        {
            InstalledFilesTestData.ReadFiles(".apt", _output, entry =>
            {
                if (entry.FilePath.Contains("MOD SDK"))
                {
                    return;
                }

                var aptFile = AptFile.FromFileSystemEntry(entry);

                Assert.NotNull(aptFile);
            });
        }
Esempio n. 22
0
        public void CanRoundtripMaps()
        {
            InstalledFilesTestData.ReadFiles(".map", _output, entry =>
            {
                // These maps have false positive differences, so ignore differences.
                bool skipRoundtripEqualityTest = false;
                switch (entry.FilePath)
                {
                // Differences in passability data, because the original files have unusual
                // values for partial passability bytes beyond the map width.
                case @"maps\usa07-taskforces\usa07-taskforces.map":
                case @"maps\map evil shelobslair\map evil shelobslair.map":                                         // BFME
                case @"maps\map good shelobslair\map good shelobslair.map":                                         // BFME
                case @"data\maps\official\map_sp_aliens_1_1_london\map_sp_aliens_1_1_london.map":                   // CNC3
                case @"data\maps\official\map_sp_gdi_2_4_nuke_facility\map_sp_gdi_2_4_nuke_facility.map":           // CNC3
                case @"data\maps\official\map_sp_gdi_4_4_berne\map_sp_gdi_4_4_berne.map":                           // CNC3
                case @"data\maps\official\map_sp_nod_2_3_coastal_brazil\map_sp_nod_2_3_coastal_brazil.map":         // CNC3
                case @"data\maps\official\map_sp_nod_5_5_the_tower\map_sp_nod_5_5_the_tower.map":                   // CNC3
                case @"data\maps\official\map_mp_4_black1\map_mp_4_black1.map":                                     // CNC3
                case @"data\maps\official\metagameworld\metagameworld.map":                                         // CNC3
                case @"data\maps\official\metagameworldact1\metagameworldact1.map":                                 // CNC3
                case @"data\maps\official\metagameworldact2\metagameworldact2.map":                                 // CNC3
                case @"data\maps\official\metagameworldact3\metagameworldact3.map":                                 // CNC3
                case @"data\maps\official\map_mp_4_ssmith2-remix\map_mp_4_ssmith2-remix.map":                       // RA3
                case @"data\maps\official\camp_j09_amsterdam_bass\camp_j09_amsterdam_bass.map":                     // RA3
                case @"data\maps\official\tutorial_protocols_smith\tutorial_protocols_smith.map":                   // RA3
                case @"data\maps\official\camp_ep01_a01_igaprefecture_davis\camp_ep01_a01_igaprefecture_davis.map": // RA3 Uprising
                case @"data\maps\official\camp_ep01_j03_vladivostok_smith\camp_ep01_j03_vladivostok_smith.map":     // RA3 Uprising
                case @"data\maps\official\camp_ep01_s03_yucatan_stewart\camp_ep01_s03_yucatan_stewart.map":         // RA3 Uprising
                case @"data\maps\official\map_mp_3_feasel1\map_mp_3_feasel1.map":                                   // RA3 Uprising
                case @"data\maps\official\tutorial_protocols_smith_360\tutorial_protocols_smith_360.map":           // RA3 Uprising
                case @"data\maps\official\camp_gdi_2_1_stewart\camp_gdi_2_1_stewart.map":                           // C&C4
                case @"data\maps\official\camp_gdi_2_4_smith\camp_gdi_2_4_smith.map":                               // C&C4
                case @"data\maps\official\camp_gdi_3_2_smith\camp_gdi_3_2_smith.map":                               // C&C4
                case @"data\maps\official\map_mp_10_capitalcity_smith_1\map_mp_10_capitalcity_smith_1.map":         // C&C4
                case @"data\maps\official\map_mp_10_panamerica_ombao_4\map_mp_10_panamerica_ombao_4.map":           // C&C4
                    skipRoundtripEqualityTest = true;
                    break;
                }

                using (var entryStream = entry.Open())
                {
                    TestUtility.DoRoundtripTest(
                        () => MapFile.Decompress(entryStream),
                        stream => MapFile.FromStream(stream),
                        (mapFile, stream) => mapFile.WriteTo(stream),
                        skipRoundtripEqualityTest);
                }
            });
        }
Esempio n. 23
0
        public void CheckEntryCount()
        {
            var bigFilePath = Path.Combine(InstalledFilesTestData.GetInstallationDirectory(SageGame.Bfme2), "apt/MainMenu.big");

            using (var bigArchive = new BigArchive(bigFilePath))
            {
                var entry = bigArchive.GetEntry(@"MainMenu.const");

                var data = ConstantData.FromFileSystemEntry(new FileSystemEntry(null, entry.FullName, entry.Length, entry.Open));
                Assert.NotNull(data);

                //requires unmodified main menu
                Assert.Equal(412, data.Entries.Count);
            }
        }
Esempio n. 24
0
        public void CanReadBinkVideos()
        {
            InstalledFilesTestData.ReadFiles(".bik", _output, entry =>
            {
                using (var binkFile = BinkFile.FromFileSystemEntry(entry))
                {
                    Assert.NotNull(binkFile);

                    for (var i = 0; i < binkFile.Header.NumFrames; i++)
                    {
                        var frame = binkFile.ReadFrame();
                    }
                }
            });
        }
Esempio n. 25
0
        public void CanReadTgaTextures()
        {
            InstalledFilesTestData.ReadFiles(".tga", _output, entry =>
            {
                switch (Path.GetFileName(entry.FilePath))
                {
                case "map ang rhudaur.tga":
                    return;     // unreferenced
                }

                var tgaFile = TgaFile.FromFileSystemEntry(entry);

                var imagePixelSize = tgaFile.Header.ImagePixelSize;
                Assert.True(imagePixelSize == 8 || imagePixelSize == 16 || imagePixelSize == 24 || imagePixelSize == 32);
            });
        }
Esempio n. 26
0
        public void CanReadIniFiles()
        {
            var tasks = new List <Task>();

            InstalledFilesTestData.ReadFiles(".ini", _output, entry =>
            {
                if (Path.GetFileName(entry.FilePath) == "ButtonSets.ini")
                {
                    return; // This file doesn't seem to be used?
                }
                if (Path.GetFileName(entry.FilePath).ToLowerInvariant() == "scripts.ini")
                {
                    return; // Only needed by World Builder?
                }
                if (Path.GetFileName(entry.FilePath).ToLowerInvariant() != "particlesystem.ini")
                {
                    return;
                }

                tasks.Add(Task.Run(() =>
                {
                    var dataContext = new IniDataContext(entry.FileSystem);
                    dataContext.LoadIniFile(entry);

                    Assert.NotNull(dataContext.CommandMaps);

                    foreach (var objectDefinition in dataContext.Objects)
                    {
                        foreach (var draw in objectDefinition.Draws)
                        {
                            switch (draw)
                            {
                            case W3dModelDrawModuleData md:
                                //if (md.DefaultConditionState != null)
                                //{
                                //    Assert.True(md.DefaultConditionState.Animations.Count <= 1);
                                //}
                                //foreach (var conditionState in md.ConditionStates)
                                //{
                                //    Assert.True(conditionState.Animations.Count <= 1);
                                //}
                                break;
                            }
                        }
                    }
                }));
            });
Esempio n. 27
0
        public void LoadW3dFromBigFile()
        {
            var bigFilePath = Path.Combine(InstalledFilesTestData.GetInstallationDirectory(SageGame.CncGeneralsZeroHour), "W3DZH.big");

            using (var bigArchive = new BigArchive(bigFilePath))
            {
                var entry = bigArchive.GetEntry(@"Art\W3D\ABBarracks_AC.W3D");

                W3dFile w3dFile;
                using (var entryStream = entry.Open())
                {
                    w3dFile = W3dFile.FromStream(entryStream, entry.FullName);
                }

                Assert.Equal(3, w3dFile.GetMeshes().Count);
            }
        }
Esempio n. 28
0
        public void CanReadIniFiles()
        {
            // TODO: Finish INI parsing for BFME2 and subsequent games.
            var gameDefinitions = new[]
            {
                GameDefinition.FromGame(SageGame.CncGenerals),
                GameDefinition.FromGame(SageGame.CncGeneralsZeroHour),
                GameDefinition.FromGame(SageGame.Bfme),
                //GameDefinition.FromGame(SageGame.Bfme2),
            };

            foreach (var gameDefinition in gameDefinitions)
            {
                InstalledFilesTestData.ReadFiles(".ini", _output, new List <IGameDefinition> {
                    gameDefinition
                }, entry =>
                {
                    switch (Path.GetFileName(entry.FilePath).ToLowerInvariant())
                    {
                    case "buttonsets.ini":             // Doesn't seem to be used?
                    case "scripts.ini":                // Only needed by World Builder?
                    case "commandmapdebug.ini":        // Only applies to DEBUG and INTERNAL builds
                    case "fxparticlesystemcustom.ini": // Don't know if this is used, it uses Emitter property not used elsewhere
                    case "lightpoints.ini":            // Don't know if this is used.

                    //BFME
                    case "optionregistry.ini":   // Don't know if this is used
                    case "localization.ini":     // Don't know if we need this
                        return;
                    }

                    var dataContext = new IniDataContext(entry.FileSystem, gameDefinition.Game);

                    // BFME I and II need to have GameData.ini loaded before any other INI files,
                    // because GameData.ini contains global macro definitions.
                    if (entry.FilePath.ToLowerInvariant() != @"data\ini\gamedata.ini")
                    {
                        dataContext.LoadIniFile(@"Data\INI\GameData.ini");
                    }

                    dataContext.LoadIniFile(entry);
                });
            }
        }
Esempio n. 29
0
        public void CanReadAniCursors()
        {
            InstalledFilesTestData.ReadFiles(".ani", _output, entry =>
            {
                switch (entry.FilePath)
                {
                // BFME cursors - don't know how to parse them yet.
                case @"data\cursors\Beam.ani":
                case @"data\cursors\magnify.ani":
                case @"data\cursors\sccmagic.ani":
                    return;
                }

                var aniFile = AniFile.FromFileSystemEntry(entry);

                Assert.NotNull(aniFile);

                Assert.True(aniFile.ArtistName == null || aniFile.ArtistName == "PRobb");
            });
        }
Esempio n. 30
0
        public void CanRoundtripMaps()
        {
            InstalledFilesTestData.ReadFiles(".map", _output, entry =>
            {
                // These maps have false positive differences, so ignore differences.
                bool skipRoundtripEqualityTest = false;
                switch (entry.FilePath)
                {
                // Differences in passability data, because the original files have unusual
                // values for partial passability bytes beyond the map width.
                case @"Maps\USA07-TaskForces\USA07-TaskForces.map":
                case @"maps\map evil shelobslair\map evil shelobslair.map":                                 // BFME
                case @"maps\map good shelobslair\map good shelobslair.map":                                 // BFME
                case @"data\maps\official\map_sp_aliens_1_1_london\map_sp_aliens_1_1_london.map":           // CNC3
                case @"data\maps\official\map_sp_gdi_2_4_nuke_facility\map_sp_gdi_2_4_nuke_facility.map":   // CNC3
                case @"data\maps\official\map_sp_gdi_4_4_berne\map_sp_gdi_4_4_berne.map":                   // CNC3
                case @"data\maps\official\map_sp_nod_2_3_coastal_brazil\map_sp_nod_2_3_coastal_brazil.map": // CNC3
                case @"data\maps\official\map_sp_nod_5_5_the_tower\map_sp_nod_5_5_the_tower.map":           // CNC3
                case @"data\maps\official\map_mp_4_black1\map_mp_4_black1.map":                             // CNC3
                case @"data\maps\official\metagameworld\metagameworld.map":                                 // CNC3
                case @"data\maps\official\metagameworldact1\metagameworldact1.map":                         // CNC3
                case @"data\maps\official\metagameworldact2\metagameworldact2.map":                         // CNC3
                case @"data\maps\official\metagameworldact3\metagameworldact3.map":                         // CNC3
                    skipRoundtripEqualityTest = true;
                    break;
                }

                using (var entryStream = entry.Open())
                {
                    TestUtility.DoRoundtripTest(
                        () => MapFile.Decompress(entryStream),
                        stream => MapFile.FromStream(stream),
                        (mapFile, stream) => mapFile.WriteTo(stream),
                        skipRoundtripEqualityTest);
                }
            });
        }