Пример #1
0
        public bool TryParsePackage(Stream s, string filename, FS context, out IReadOnlyPackage package)
        {
            if (filename.EndsWith(".lpk"))
            {
                s = Crypter.Decrypt(s);
            }

            var signature = s.ReadASCII(4);

            s.Position -= 4;

            if (!signature.Equals("DATA") && !signature.Equals("DAT2"))
            {
                package = null;
                return(false);
            }

            Stream lvlLookup;

            context.TryOpen("LvlLookup.yaml", out lvlLookup);

            package = new LvlPackage(s, filename, MiniYaml.FromStream(lvlLookup).ToDictionary(x => x.Key, x => x.Value));

            return(true);
        }
Пример #2
0
        public bool TryParsePackage(Stream s, string filename, FS context, out IReadOnlyPackage package)
        {
            if (filename.EndsWith(".lpk") ||          // Spritesheet container
                filename.EndsWith(".bpk") ||             // Image container
                filename.EndsWith(".spk") ||             // Sound set
                filename.EndsWith(".lps") ||             // Singleplayer map
                filename.EndsWith(".lpm") ||             // Multiplayer map
                filename.EndsWith(".mpk"))                // Matrix set (destroyable map part, tile replacements)
            {
                s = Decompressor.Decompress(s);
            }

            if (s.Position + 4 <= s.Length)
            {
                var signature = s.ReadASCII(4);
                s.Position -= 4;

                if (signature.Equals("DATA"))
                {
                    package = new LvlPackage(new SegmentStream(s, 8, (s.ReadByte() << 24) | (s.ReadByte() << 16) | (s.ReadByte() << 8) | s.ReadByte()), filename, context);

                    return(true);
                }
            }

            package = null;
            return(false);
        }
Пример #3
0
        public bool TryParsePackage(Stream s, string filename, FS context, out IReadOnlyPackage package)
        {
            if (filename.EndsWith(".lpk") ||          // Spritesheet container
                filename.EndsWith(".bpk") ||             // Image container
                filename.EndsWith(".spk") ||             // Sound set
                filename.EndsWith(".lps") ||             // Singleplayer map
                filename.EndsWith(".lpm") ||             // Multiplayer map
                filename.EndsWith(".mpk"))                // Matrix set (destroyable map part, tile replacements)
            {
                s = Crypter.Decrypt(s);
            }

            var signature = s.ReadASCII(4);

            var version = Version.UNKNOWN;

            if (signature.Equals("DATA"))
            {
                version = Version.KKND1;
            }

            if (signature.Equals("DAT2"))
            {
                version = Version.KKND2;
            }

            if (version == Version.UNKNOWN)
            {
                s.Position -= 4;
                package     = null;
                return(false);
            }

            var tmp        = s.ReadBytes(4);      // Big-Endian
            var dataLength = (tmp[0] << 24) | (tmp[1] << 16) | (tmp[2] << 8) | tmp[3];

            package = new LvlPackage(new SegmentStream(s, 8, dataLength), filename, context);

            return(true);
        }