public async Task <bool> BeginProcessing() { await Task.Yield(); var defaultPath = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "assets"); string catalogContentFile = Path.Combine(defaultPath, "catalog-content.json"); if (!File.Exists(catalogContentFile)) { Console.WriteLine("catalog-content.json not found at {0}", catalogContentFile); return(false); } ParseCatalogContent(catalogContentFile); string datFile = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "assets", m_AppearancesFile); if (!File.Exists(datFile)) { Console.WriteLine("appearances.dat not found at {0}", datFile); return(false); } var bytes = File.ReadAllBytes(datFile); var tibiaAppearances = Tibia.Protobuf.Appearances.Appearances.Parser.ParseFrom(bytes); var openTibiaAppearances = new Protobuf.Appearances.Appearances(); foreach (var tibiaAppearance in tibiaAppearances.Object) { openTibiaAppearances.Objects.Add(ConvertAppearance(tibiaAppearance)); } foreach (var tibiaAppearance in tibiaAppearances.Outfit) { openTibiaAppearances.Outfits.Add(ConvertAppearance(tibiaAppearance)); } foreach (var tibiaAppearance in tibiaAppearances.Effect) { openTibiaAppearances.Effects.Add(ConvertAppearance(tibiaAppearance)); } foreach (var tibiaAppearance in tibiaAppearances.Missile) { openTibiaAppearances.Missles.Add(ConvertAppearance(tibiaAppearance)); } if (tibiaAppearances.SpecialMeaningAppearanceIds != null) { openTibiaAppearances.SpecialMeaningAppearanceIDs = new Protobuf.Appearances.SpecialMeaningAppearanceIds(); openTibiaAppearances.SpecialMeaningAppearanceIDs.GoldCoinId = tibiaAppearances.SpecialMeaningAppearanceIds.GoldCoinId; openTibiaAppearances.SpecialMeaningAppearanceIDs.PlatinumCoinId = tibiaAppearances.SpecialMeaningAppearanceIds.PlatinumCoinId; openTibiaAppearances.SpecialMeaningAppearanceIDs.CrystalCoinId = tibiaAppearances.SpecialMeaningAppearanceIds.CrystalCoinId; openTibiaAppearances.SpecialMeaningAppearanceIDs.TibiaCoinId = tibiaAppearances.SpecialMeaningAppearanceIds.TibiaCoinId; openTibiaAppearances.SpecialMeaningAppearanceIDs.StampedLetterId = tibiaAppearances.SpecialMeaningAppearanceIds.StampedLetterId; openTibiaAppearances.SpecialMeaningAppearanceIDs.SupplyStashId = tibiaAppearances.SpecialMeaningAppearanceIds.SupplyStashId; } m_JsonTokens.Add(new AppearancesToken() { file = "appearances.dat" }); Directory.CreateDirectory(Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result")); // saving appearances.dat (with the respective version) using (var stream = File.Create(Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result", "appearances.dat"))) { openTibiaAppearances.WriteTo(stream); } Console.Write("Processing Spritesheets..."); Directory.CreateDirectory(Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result", "sprites")); var spriteBuffer = new MemoryStream(); foreach (var spriteType in m_SpriteSheet) { var spriteFile = Path.Combine(defaultPath, spriteType.File); if (!File.Exists(spriteFile)) { continue; } var decoder = new SevenZip.Compression.LZMA.Decoder(); using (BinaryReader reader = new BinaryReader(File.OpenRead(spriteFile))) { var input = reader.BaseStream; while (reader.ReadByte() == 0) { } reader.ReadUInt32(); while ((reader.ReadByte() & 0x80) == 0x80) { } // LZMA size, 7-bit integer where MSB = flag for next byte used // LZMA file decoder.SetDecoderProperties(reader.ReadBytes(5)); reader.ReadUInt64(); // Should be the decompressed size but CIP writes the compressed sized, so just use a large buffer size // Disabled arithmetic underflow/overflow check in debug mode so this won't cause an exception spriteBuffer.Position = 0; decoder.Code(input, spriteBuffer, input.Length - input.Position, 0x100000, null); spriteBuffer.Position = 0; var image = Image.FromStream(spriteBuffer); var filename = string.Format("sprites-{0}-{1}.png", spriteType.FirstSpriteID, spriteType.LastSpriteID); var path = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result", "sprites", filename); image.Save(path, ImageFormat.Png); m_JsonTokens.Add(new SpritesToken() { file = filename, spritetype = spriteType.SpriteType, firstspriteid = (int)spriteType.FirstSpriteID, lastspriteid = (int)spriteType.LastSpriteID, }); } } spriteBuffer.Dispose(); Console.WriteLine("\rProcessing Spritesheets: Done!"); // saving spritesheets information (catalog-content) using (FileStream file = File.Create(Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result", "catalog-content.json"))) { var catalogJson = new JArray(); foreach (var token in m_JsonTokens) { catalogJson.Add(token.GetJObject()); } string str = catalogJson.ToString(); file.Write(Encoding.ASCII.GetBytes(str), 0, str.Length); } return(true); }
public async Task <bool> BeginProcessing() { await Task.Yield(); var loadPath = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "assets"); var resultPath = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result"); string catalogContentFile = Path.Combine(loadPath, "catalog-content.json"); if (!File.Exists(catalogContentFile)) { Console.WriteLine("catalog-content.json not found at {0}", catalogContentFile); return(false); } ParseCatalogContent(catalogContentFile); string datFile = Path.Combine(loadPath, m_AppearancesFile); if (!File.Exists(datFile)) { Console.WriteLine("appearances.dat not found at {0}", datFile); return(false); } var bytes = File.ReadAllBytes(datFile); var tibiaAppearances = Tibia.Protobuf.Appearances.Appearances.Parser.ParseFrom(bytes); var openTibiaAppearances = new Protobuf.Appearances.Appearances(); foreach (var tibiaAppearance in tibiaAppearances.Object) { openTibiaAppearances.Objects.Add(ConvertAppearance(tibiaAppearance)); } foreach (var tibiaAppearance in tibiaAppearances.Outfit) { openTibiaAppearances.Outfits.Add(ConvertAppearance(tibiaAppearance)); } foreach (var tibiaAppearance in tibiaAppearances.Effect) { openTibiaAppearances.Effects.Add(ConvertAppearance(tibiaAppearance)); } foreach (var tibiaAppearance in tibiaAppearances.Missile) { openTibiaAppearances.Missles.Add(ConvertAppearance(tibiaAppearance)); } if (tibiaAppearances.SpecialMeaningAppearanceIds != null) { openTibiaAppearances.SpecialMeaningAppearanceIDs = new Protobuf.Appearances.SpecialMeaningAppearanceIds(); openTibiaAppearances.SpecialMeaningAppearanceIDs.GoldCoinId = tibiaAppearances.SpecialMeaningAppearanceIds.GoldCoinId; openTibiaAppearances.SpecialMeaningAppearanceIDs.PlatinumCoinId = tibiaAppearances.SpecialMeaningAppearanceIds.PlatinumCoinId; openTibiaAppearances.SpecialMeaningAppearanceIDs.CrystalCoinId = tibiaAppearances.SpecialMeaningAppearanceIds.CrystalCoinId; openTibiaAppearances.SpecialMeaningAppearanceIDs.TibiaCoinId = tibiaAppearances.SpecialMeaningAppearanceIds.TibiaCoinId; openTibiaAppearances.SpecialMeaningAppearanceIDs.StampedLetterId = tibiaAppearances.SpecialMeaningAppearanceIds.StampedLetterId; openTibiaAppearances.SpecialMeaningAppearanceIDs.SupplyStashId = tibiaAppearances.SpecialMeaningAppearanceIds.SupplyStashId; } Directory.CreateDirectory(resultPath); // saving appearances.dat (with the respective version) using (var stream = File.Create(Path.Combine(resultPath, "appearances.otud"))) { openTibiaAppearances.WriteTo(stream); } Console.Write("Processing Spritesheets..."); using (var spriteStream = new FileStream(Path.Combine(resultPath, "assets.otus"), FileMode.Create)) using (var binaryWriter = new BinaryWriter(spriteStream)) { binaryWriter.Write((uint)m_SpriteSheet.Count); var spriteBuffer = new MemoryStream(); foreach (var spriteType in m_SpriteSheet) { var spriteFile = Path.Combine(loadPath, spriteType.File); if (!File.Exists(spriteFile)) { continue; } var decoder = new SevenZip.Compression.LZMA.Decoder(); using (BinaryReader reader = new BinaryReader(File.OpenRead(spriteFile))) { binaryWriter.Write(spriteType.AtlasID); binaryWriter.Write((ushort)spriteType.SpriteType); binaryWriter.Write(spriteType.FirstSpriteID); binaryWriter.Write(spriteType.LastSpriteID); while (reader.ReadByte() == 0) { } reader.ReadUInt32(); while ((reader.ReadByte() & 0x80) == 0x80) { } decoder.SetDecoderProperties(reader.ReadBytes(5)); reader.ReadUInt64(); spriteBuffer.Position = 0; var input = reader.BaseStream; decoder.Code(input, spriteBuffer, input.Length - input.Position, 0x100000, null); spriteBuffer.Position = 0; var image = Image.FromStream(spriteBuffer); using (MemoryStream tmpStream = new MemoryStream()) { image.Save(tmpStream, ImageFormat.Png); uint length = (uint)tmpStream.Length; tmpStream.Position = 0; byte[] buffer = new byte[length]; tmpStream.Read(buffer, 0, (int)length); binaryWriter.Write(length); binaryWriter.Write(buffer); } } } spriteBuffer.Dispose(); } Console.WriteLine("\rProcessing Spritesheets: Done!"); return(true); }