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); }
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); }
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); }