public IModelDirectory <GloModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var gloverSteamDirectory = SteamUtils.GetGameDirectory("Glover", assert);

            if (gloverSteamDirectory == null)
            {
                return(null);
            }

            var rootModelDirectory    = new ModelDirectory <GloModelFileBundle>("glover");
            var parentObjectDirectory = rootModelDirectory.AddSubdir("data")
                                        .AddSubdir("objects");

            var gloverFileHierarchy     = new FileHierarchy(gloverSteamDirectory);
            var topLevelObjectDirectory =
                gloverFileHierarchy.Root.TryToGetSubdir("data/objects");

            foreach (var objectDirectory in topLevelObjectDirectory.Subdirs)
            {
                this.AddObjectDirectory(
                    parentObjectDirectory.AddSubdir(objectDirectory.Name),
                    gloverFileHierarchy, objectDirectory);
            }
            return(rootModelDirectory);
        }
예제 #2
0
        public IModelDirectory <IHaloWarsModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var haloWarsSteamDirectory =
                SteamUtils.GetGameDirectory("HaloWarsDE", assert);

            if (haloWarsSteamDirectory == null)
            {
                return(null);
            }

            var scratchDirectory = DirectoryConstants.ROMS_DIRECTORY
                                   .GetSubdir("halo_wars", true);

            var context = new HWContext(haloWarsSteamDirectory.FullName,
                                        scratchDirectory.FullName);

            // Expand all compressed/encrypted game files. This also handles the .xmb -> .xml conversion
            context.ExpandAllEraFiles();

            var fileHierarchy = new FileHierarchy(scratchDirectory);

            var rootNode = new ModelDirectory <IHaloWarsModelFileBundle>("halo_wars");

            var mapDirectories =
                fileHierarchy.Root
                .TryToGetSubdir("scenario/skirmish/design")
                .Subdirs;

            foreach (var srcMapDirectory in mapDirectories)
            {
                var xtdFile = srcMapDirectory.FilesWithExtension(".xtd").Single();
                var xttFile = srcMapDirectory.FilesWithExtension(".xtt").Single();
                rootNode.AddFileBundleRelative(
                    new XtdModelFileBundle(xtdFile, xttFile, context));
            }

            var artDirectory   = fileHierarchy.Root.TryToGetSubdir("art");
            var artSubdirQueue = new FinQueue <IFileHierarchyDirectory>(artDirectory);

            // TODO: Switch to DFS instead, it's more intuitive as a user
            while (artSubdirQueue.TryDequeue(out var artSubdir))
            {
                // TODO: Skip a file if it's already been extracted
                // TODO: Parse UGX files instead, as long as they specify their own animations
                var visFiles = artSubdir.FilesWithExtension(".vis");
                foreach (var visFile in visFiles)
                {
                    rootNode.AddFileBundleRelative(new VisModelFileBundle(visFile, context));
                }

                artSubdirQueue.Enqueue(artSubdir.Subdirs);
            }

            return(rootNode);
        }
예제 #3
0
        private static string GetSaveFilePath(SteamUtils steamUtils)
        {
            var steamUsers = steamUtils.GetSteamUsersWithGame(Pd2SteamId).ToList();

            if (!steamUsers.Any())
            {
                throw new Exception("Ich finde bei Steam keinen Benutzer der PD2 installiert hat.");
            }

            var steamUser = steamUsers.Count() == 1 ? steamUsers.First() : PromptForSteamUser(steamUsers);

            var payday2SavePath = Path.Combine(steamUtils.GetGameDirectory(steamUser, Pd2SteamId), "remote");
            var currentSaveFile = GetLatestSaveFile(Directory.GetFiles(payday2SavePath, "save*.sav"));

            return(currentSaveFile);
        }