Пример #1
0
        public Installation?TryRegister(string path)
        {
            var executablePath = path;

            // Xtreme GoG and Steam
            var executable = InstallationUtils.GetFile(executablePath, "kkndgame.exe");

            if (executable == null)
            {
                // Xtreme CD
                executablePath = InstallationUtils.GetDirectory(path, "game");

                if (executablePath == null)
                {
                    // Dos CD
                    executablePath = InstallationUtils.GetDirectory(path, "kknd");

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

                executable = InstallationUtils.GetFile(executablePath, "kknd.exe");

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

            Log.Write("debug", $"Detected installation: {path}");

            var release  = CryptoUtil.SHA1Hash(File.OpenRead(executable));
            var isXtreme = true;

            switch (release)
            {
            case "d1f41d7129b6f377869f28b89f92c18f4977a48f":
                Log.Write("debug", "=> Krush, Kill 'N' Destroy Xtreme (Steam/GoG, English)");

                break;

            case "6fb10d85739ef63b28831ada4cdfc159a950c5d2":
                Log.Write("debug", "=> Krush, Kill 'N' Destroy Xtreme (Disc, English)");

                break;

            case "024e96860c504b462b24b9237d49bfe8de6eb8e0":
                Log.Write("debug", "=> Krush, Kill 'N' Destroy (Disc, English)");
                isXtreme = false;
                path     = executablePath;

                break;

            default:
                Log.Write("debug", "=> Unsupported game version");

                return(null);
            }

            var levelsFolder = InstallationUtils.GetDirectory(path, "levels");

            if (levelsFolder == null)
            {
                Log.Write("debug", "=> Missing folder: levels");

                return(null);
            }

            var fmvFolder = InstallationUtils.GetDirectory(path, "fmv");

            if (fmvFolder == null)
            {
                Log.Write("debug", "=> Missing folder: fmv");

                return(null);
            }

            var graphicsFolder = InstallationUtils.GetDirectory(levelsFolder, "640");

            if (graphicsFolder == null)
            {
                Log.Write("debug", "=> Missing folder: 640");

                return(null);
            }

            // Required files.
            var files =
                new Dictionary <string, string>
            {
                { "sprites.lvl", graphicsFolder },
                { "surv.slv", levelsFolder },
                { "mute.slv", levelsFolder },
                { "mh_fmv.vbc", fmvFolder },
                { "intro.vbc", fmvFolder }
            }.Concat(
                isXtreme
                                                ? new()
            {
                { "surv1.wav", levelsFolder },
                { "surv2.wav", levelsFolder },
Пример #2
0
        public Installation?TryRegister(string path)
        {
            var executablePath = path;

            // Krossfire GoG and Steam
            var executable = InstallationUtils.GetFile(executablePath, "kknd2.exe");

            // TODO CD version is more tricky
            //      its compressed in a .cab. So we need to use the local installation for the .exe and the base assets.
            //      however briefing videos and music tracks must be loaded from CD
            //      but depending on the faction, you need CD1 or CD2.
            //      this requires us to implement a "Insert Disc X" dialog.
            //      to avoid disk swapping while playing, we should make the dialog copy the data into the installation dir.

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

            Log.Write("debug", $"Detected installation: {path}");

            var release = CryptoUtil.SHA1Hash(File.OpenRead(executable));

            switch (release)
            {
            case "8d81c9183d04eb834aff29195797abe11aedc249":
                Log.Write("debug", "=> Krush, Kill 'N' Destroy 2: Krossfire (Steam/GoG, English)");

                break;

            default:
                Log.Write("debug", "=> Unsupported game version");

                return(null);
            }

            var levelsFolder = InstallationUtils.GetDirectory(path, "levels");

            if (levelsFolder == null)
            {
                Log.Write("debug", "=> Missing folder: levels");

                return(null);
            }

            var fmvFolder = InstallationUtils.GetDirectory(path, "fmv");

            if (fmvFolder == null)
            {
                Log.Write("debug", "=> Missing folder: fmv");

                return(null);
            }

            // TODO the name of the graphics folder is tied to the language of the executable
            const string language = "english";

            var graphicsFolder = InstallationUtils.GetDirectory(levelsFolder, language);

            if (graphicsFolder == null)
            {
                Log.Write("debug", $"=> Missing folder: {language}");

                return(null);
            }

            var multiFolder = InstallationUtils.GetDirectory(levelsFolder, "multi");

            if (multiFolder == null)
            {
                Log.Write("debug", "=> Missing folder: multi");

                return(null);
            }

            // Required files.
            var files =
                new Dictionary <string, string>
            {
                { "gamesprt.lpk", graphicsFolder },
                { "surv.spk", graphicsFolder },
                { "mute.spk", graphicsFolder },
                { "robo.spk", graphicsFolder },
                { "mh.vbc", fmvFolder },
                { "intro.vbc", fmvFolder }
            }.Concat(
                new Dictionary <string, string>
            {
                { "surv_01.wav", levelsFolder },
                { "surv_02.wav", levelsFolder },
                { "surv_03.wav", levelsFolder },
                { "mute_01.wav", levelsFolder },
                { "mute_02.wav", levelsFolder },
                { "mute_03.wav", levelsFolder },
                { "robo_01.wav", levelsFolder },
                { "robo_02.wav", levelsFolder },
                { "robo_03.wav", levelsFolder }
            }
                );

            var foundFiles = new Dictionary <string, string>();

            foreach (var(file, folder) in files)
            {
                var resolved = InstallationUtils.GetFile(folder, file);

                if (resolved == null)
                {
                    Log.Write("debug", $"=> Missing file: {file}");

                    return(null);
                }

                foundFiles.Add(file, resolved);
            }

            var game = new Installation("gen2", path);

            game.Music.Add("Survivors 1", game.GetPath(foundFiles["surv_01.wav"]));
            game.Music.Add("Survivors 2", game.GetPath(foundFiles["surv_02.wav"]));
            game.Music.Add("Survivors 3", game.GetPath(foundFiles["surv_03.wav"]));
            game.Music.Add("Evolved 1", game.GetPath(foundFiles["mute_01.wav"]));
            game.Music.Add("Evolved 2", game.GetPath(foundFiles["mute_02.wav"]));
            game.Music.Add("Evolved 3", game.GetPath(foundFiles["mute_03.wav"]));
            game.Music.Add("Series9 1", game.GetPath(foundFiles["robo_01.wav"]));
            game.Music.Add("Series9 2", game.GetPath(foundFiles["robo_02.wav"]));
            game.Music.Add("Series9 3", game.GetPath(foundFiles["robo_03.wav"]));

            // Any other container for asset browser purpose
            game.Packages.Add("gen2_levels", game.GetPath(levelsFolder));
            game.Packages.Add("gen2_graphics", game.GetPath(graphicsFolder));
            game.Packages.Add("gen2_multi", game.GetPath(multiFolder));
            game.Packages.Add("gen2_fmv", game.GetPath(fmvFolder));

            foreach (var file in Directory.GetFiles(levelsFolder)
                     .Concat(Directory.GetFiles(graphicsFolder))
                     .Concat(Directory.GetFiles(multiFolder))
                     .Where(
                         f => f.EndsWith(".lpk", StringComparison.OrdinalIgnoreCase) ||
                         f.EndsWith(".bpk", StringComparison.OrdinalIgnoreCase) ||
                         f.EndsWith(".spk", StringComparison.OrdinalIgnoreCase) ||
                         f.EndsWith(".lps", StringComparison.OrdinalIgnoreCase) ||
                         f.EndsWith(".lpm", StringComparison.OrdinalIgnoreCase) ||
                         f.EndsWith(".mpk", StringComparison.OrdinalIgnoreCase)
                         ))
            {
                if (!game.Packages.ContainsValue(file))
                {
                    game.Packages.Add(Path.GetFileName(file).ToLower(), game.GetPath(file));
                }
            }

            return(game);
        }