private CLibFile[] ReadCLib21(BinaryReader reader) { Int32 seed = reader.ReadInt32() + EncryptionSeedSalt; AGSEncoder encoder = new AGSEncoder(seed); //NOTE(adm244): assuming asset files are stored sequentially Int32 filesCount = encoder.ReadInt32(reader); CLibFile[] files = new CLibFile[filesCount]; for (int i = 0; i < files.Length; ++i) { files[i] = new CLibFile(); } for (int i = 0; i < files.Length; ++i) { files[i].Filename = encoder.ReadString(reader); } Int32 assetsCount = encoder.ReadInt32(reader); AGSCLibAsset[] assets = new AGSCLibAsset[assetsCount]; for (int i = 0; i < assets.Length; ++i) { assets[i] = new AGSCLibAsset(); } for (int i = 0; i < assetsCount; ++i) { assets[i].Filename = encoder.ReadString(reader); } for (int i = 0; i < assetsCount; ++i) { assets[i].Offset = encoder.ReadInt32(reader); } for (int i = 0; i < assetsCount; ++i) { assets[i].Size = encoder.ReadInt32(reader); } for (int i = 0; i < assetsCount; ++i) { assets[i].AssetFileIndex = encoder.ReadInt8(reader); } return(BuildAssetsLists(assets, ref files)); }
private CLibFile[] ReadCLibPre10(BinaryReader reader, int version) { CLibFile[] files = new CLibFile[1]; files[0] = new CLibFile(); files[0].Filename = RootFilename; byte salt = reader.ReadByte(); byte reserved = reader.ReadByte(); Int16 assetsCount = reader.ReadInt16(); AGSCLibAsset[] assets = new AGSCLibAsset[assetsCount]; //TODO(adm244): figure out how it's used in pre 6, ignored for now byte[] password = reader.ReadBytes(13); for (int i = 0; i < assets.Length; ++i) { assets[i] = new AGSCLibAsset(); string filename = reader.ReadFixedCString(13); assets[i].Filename = AGSEncryption.DecryptSalt(filename, salt); } for (int i = 0; i < assetsCount; ++i) { assets[i].Size = reader.ReadInt32(); } //TODO(adm244): read "flags and ratio", skipping for now reader.BaseStream.Seek(assetsCount * sizeof(Int16), SeekOrigin.Current); assets[0].Offset = reader.BaseStream.Position; for (int i = 1; i < assets.Length; ++i) { assets[i].Offset = assets[i - 1].Offset + assets[i - 1].Size; } return(BuildAssetsLists(assets, ref files)); }
//private CLibFile[] ReadCLib20(BinaryReader reader) //{ // //NOTE(adm244): assuming asset files are stored sequentially // Int32 filesCount = reader.ReadInt32(); // CLibFile[] files = new CLibFile[filesCount]; // for (int i = 0; i < files.Length; ++i) // files[i].Filename = reader.ReadCString(50); // // Int32 assetsCount = reader.ReadInt32(); // AGSCLibAsset[] assets = new AGSCLibAsset[assetsCount]; // // for (int i = 0; i < assets.Length; ++i) // { // Int16 length = reader.ReadInt16(); // length /= 5; // // byte[] jibzler = reader.ReadBytes(length); // assets[i].Filename = AGSEncryption.DecryptJibzle(jibzler); // } // // for (int i = 0; i < assets.Length; ++i) // assets[i].Offset = reader.ReadInt32(); // // for (int i = 0; i < assets.Length; ++i) // assets[i].Size = reader.ReadInt32(); // // for (int i = 0; i < assets.Length; ++i) // assets[i].AssetFileIndex = reader.ReadByte(); // // return BuildAssetsLists(assets, ref files); //} private CLibFile[] ReadCLibPre21(BinaryReader reader, int version) { Int32 filesCount = reader.ReadInt32(); CLibFile[] files = new CLibFile[filesCount]; for (int i = 0; i < files.Length; ++i) { files[i] = new CLibFile(); if (version == 20) { files[i].Filename = reader.ReadCString(50); } else { files[i].Filename = reader.ReadFixedCString(20); } } Int32 asset_count = reader.ReadInt32(); AGSCLibAsset[] assets = new AGSCLibAsset[asset_count]; for (int i = 0; i < assets.Length; ++i) { assets[i] = new AGSCLibAsset(); if (version == 20) { Int16 length = reader.ReadInt16(); length /= 5; byte[] jibzler = reader.ReadBytes(length); assets[i].Filename = AGSEncryption.DecryptJibzle(jibzler); } else if (version >= 11) { byte[] jibzler = reader.ReadBytes(25); assets[i].Filename = AGSEncryption.DecryptJibzle(jibzler); } else { assets[i].Filename = reader.ReadFixedCString(25); } } for (int i = 0; i < assets.Length; ++i) { assets[i].Offset = reader.ReadInt32(); } for (int i = 0; i < assets.Length; ++i) { assets[i].Size = reader.ReadInt32(); } for (int i = 0; i < assets.Length; ++i) { assets[i].AssetFileIndex = reader.ReadByte(); } return(BuildAssetsLists(assets, ref files)); }