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(); }
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)); } }); }
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(); }
public void CanReadManifestFiles() { InstalledFilesTestData.ReadFiles(".manifest", _output, entry => { var gameStream = new GameStream(entry); Assert.NotNull(gameStream); }); }
public void CanReadTgaTextures() { InstalledFilesTestData.ReadFiles(".tga", _output, entry => { var tgaFile = TgaFile.FromFileSystemEntry(entry); Assert.True(tgaFile.Header.ImagePixelSize == 24 || tgaFile.Header.ImagePixelSize == 32); }); }
public void CanReadAptFiles() { InstalledFilesTestData.ReadFiles(".apt", _output, entry => { var aptFile = AptFile.FromFileSystemEntry(entry); Assert.NotNull(aptFile); }); }
public void CanReadDdsTextures() { InstalledFilesTestData.ReadFiles(".dds", _output, entry => { var ddsFile = DdsFile.FromFileSystemEntry(entry); Assert.True(ddsFile.MipMaps.Length > 1); }); }
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); }
public void CanReadCsfFiles() { InstalledFilesTestData.ReadFiles(".csf", _output, entry => { var csfFile = CsfFile.FromFileSystemEntry(entry); Assert.NotNull(csfFile); }); }
public void CanReadWndFiles() { InstalledFilesTestData.ReadFiles(".wnd", _output, entry => { var wndFile = WndFile.FromFileSystemEntry(entry); Assert.NotNull(wndFile); }); }
public SaveFileTests() { var rootFolder = InstalledFilesTestData.GetInstallationDirectory(SageGame.CncGenerals); var installation = new GameInstallation(new GeneralsDefinition(), rootFolder); Platform.Start(); _game = new Game(installation, GraphicsBackend.Direct3D11); }
public GameFixture() { var rootFolder = InstalledFilesTestData.GetInstallationDirectory(SageGame.CncGenerals); var installation = new GameInstallation(new GeneralsDefinition(), rootFolder); Platform.Start(); Game = new Game(installation); }
public void CanReadConstFiles() { InstalledFilesTestData.ReadFiles(".const", _output, entry => { var constFile = ConstantData.FromFileSystemEntry(entry); Assert.NotNull(constFile); }); }
public void CanReadAniCursors() { InstalledFilesTestData.ReadFiles(".cur", _output, entry => { var curFile = CurFile.FromFileSystemEntry(entry); Assert.NotNull(curFile); Assert.True(curFile.Image.Width > 0); }); }
public void CanRoundtripWakFiles() { InstalledFilesTestData.ReadFiles(".wak", _output, entry => { TestUtility.DoRoundtripTest( entry.Open, stream => WakFile.Parse(stream), (wakFile, stream) => wakFile.WriteTo(stream)); }); }
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; } } } }); }
public void CanReadAniCursors() { InstalledFilesTestData.ReadFiles(".ani", _output, entry => { var aniFile = AniFile.FromFileSystemEntry(entry); Assert.NotNull(aniFile); Assert.True(aniFile.ArtistName == null || aniFile.ArtistName == "PRobb"); }); }
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); } }
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)); } }); }
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)); } }); }
public void CanReadAptFiles() { InstalledFilesTestData.ReadFiles(".apt", _output, entry => { if (entry.FilePath.Contains("MOD SDK")) { return; } var aptFile = AptFile.FromFileSystemEntry(entry); Assert.NotNull(aptFile); }); }
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); } }); }
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); } }
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(); } } }); }
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); }); }
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; } } } })); });
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); } }
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); }); } }
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"); }); }
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); } }); }