static void ConvertClientVersion(int fromVersion, int toVersion, bool useAlpha) { string datFile = fromVersion.ToString() + "/Tibia.dat"; string sprFile = fromVersion.ToString() + "/Tibia.spr"; if (!File.Exists(datFile) || !File.Exists(sprFile)) { Console.WriteLine("Tibia.dat or Tibia.spr doesn't exist"); Environment.Exit(0); return; } Directory.CreateDirectory(toVersion.ToString()); string newDatFile = toVersion.ToString() + "/Tibia.dat"; string newSprFile = toVersion.ToString() + "/Tibia.spr"; var datParser = new Core.Sprites.ContentData(File.ReadAllBytes(datFile), fromVersion); datParser.Parse(); byte[] result = datParser.ConvertTo(toVersion); File.WriteAllBytes(newDatFile, result); var sprParser = new Core.Sprites.ContentSprites(File.ReadAllBytes(sprFile), fromVersion, useAlpha); sprParser.Parse(); result = sprParser.ConvertTo(toVersion); File.WriteAllBytes(newSprFile, result); Console.WriteLine("Convertion Successfull to " + toVersion + "."); }
static void GenerateEverything(int clientVersion, bool useAlpha) { // generating new appearances string datFile = clientVersion.ToString() + "/Tibia.dat"; string sprFile = clientVersion.ToString() + "/Tibia.spr"; if (!File.Exists(datFile) || !File.Exists(sprFile)) { Console.WriteLine("Tibia.dat or Tibia.spr doesn't exist"); Environment.Exit(0); return; } Appearances appearances = GenerateAppearances(datFile, clientVersion); // loading tibia.spr into chunks Core.Sprites.ContentSprites sprParser; try { var bytes = File.ReadAllBytes(sprFile); sprParser = new Core.Sprites.ContentSprites(bytes, clientVersion, useAlpha); sprParser.Parse(); } catch (Exception e) { Console.WriteLine(e.Message + '\n' + e.StackTrace); Environment.Exit(0); return; } Directory.CreateDirectory(clientVersion + "/sprites"); int start = 0; SaveSprites(appearances.Outfits, ref start, sprParser, clientVersion); SaveSprites(appearances.Effects, ref start, sprParser, clientVersion); SaveSprites(appearances.Missles, ref start, sprParser, clientVersion); SaveSprites(appearances.Objects, ref start, sprParser, clientVersion); Task.WaitAll(tasks.ToArray()); // saving appearances.dat (with the respective version) using (FileStream file = File.Create(clientVersion + "/appearances.dat")) { appearances.WriteTo(file); } // saving spritesheets information (catalog-content) using (FileStream file = File.Create(clientVersion + "/catalog-content.json")) { jsonTokens.Sort(ITokenItemSort); foreach (var token in jsonTokens) { catalogJson.Add(token.GetJObject()); } string str = catalogJson.ToString(); file.Write(Encoding.ASCII.GetBytes(str), 0, str.Length); } }
static void Main(string[] args) { // Generating New appearances Appearances appearances0001 = GenerateAppearances001(); // Creating the sprites folder to save files in. Directory.CreateDirectory("sprites"); // Loading tibia.spr into chunks Core.Sprites.ContentSprites sprParser; try { var bytes = File.ReadAllBytes("tibia.spr"); sprParser = new Core.Sprites.ContentSprites(bytes); sprParser.Parse(); } catch (Exception e) { Console.WriteLine(e.Message); Environment.Exit(0); return; } int start = 0; RepeatedField <uint>[] sortedFrameGroups = new RepeatedField <uint> [4]; // This is following how tibia did it exactly, // Tibia did every appearances group (32x32, 32x64, 64x32, 64x64) // Outfits, Effects, Missles, Items // This doesn't affect how it works, you can save the way you want.. for (int i = 0; i < 4; i++) { sortedFrameGroups[i] = new RepeatedField <uint>(); } DeploySprites(appearances0001.Outfits, ref sortedFrameGroups); SaveStaticBitmaps(sortedFrameGroups[0], ref start, ref sprParser, 32, 32); SaveStaticBitmaps(sortedFrameGroups[1], ref start, ref sprParser, 32, 64); SaveStaticBitmaps(sortedFrameGroups[2], ref start, ref sprParser, 64, 32); SaveStaticBitmaps(sortedFrameGroups[3], ref start, ref sprParser, 64, 64); for (int i = 0; i < 4; i++) { sortedFrameGroups[i] = new RepeatedField <uint>(); } DeploySprites(appearances0001.Effects, ref sortedFrameGroups); SaveStaticBitmaps(sortedFrameGroups[0], ref start, ref sprParser, 32, 32); SaveStaticBitmaps(sortedFrameGroups[1], ref start, ref sprParser, 32, 64); SaveStaticBitmaps(sortedFrameGroups[2], ref start, ref sprParser, 64, 32); SaveStaticBitmaps(sortedFrameGroups[3], ref start, ref sprParser, 64, 64); for (int i = 0; i < 4; i++) { sortedFrameGroups[i] = new RepeatedField <uint>(); } DeploySprites(appearances0001.Missles, ref sortedFrameGroups); SaveStaticBitmaps(sortedFrameGroups[0], ref start, ref sprParser, 32, 32); SaveStaticBitmaps(sortedFrameGroups[1], ref start, ref sprParser, 32, 64); SaveStaticBitmaps(sortedFrameGroups[2], ref start, ref sprParser, 64, 32); SaveStaticBitmaps(sortedFrameGroups[3], ref start, ref sprParser, 64, 64); for (int i = 0; i < 4; i++) { sortedFrameGroups[i] = new RepeatedField <uint>(); } DeploySprites(appearances0001.Objects, ref sortedFrameGroups); SaveStaticBitmaps(sortedFrameGroups[0], ref start, ref sprParser, 32, 32); SaveStaticBitmaps(sortedFrameGroups[1], ref start, ref sprParser, 32, 64); SaveStaticBitmaps(sortedFrameGroups[2], ref start, ref sprParser, 64, 32); SaveStaticBitmaps(sortedFrameGroups[3], ref start, ref sprParser, 64, 64); // saving appearances.dat (with the respective version) using (FileStream file1 = File.Create("appearances001.dat")) { appearances0001.WriteTo(file1); } // This is a helper, by using some sort of data structure (i.e interval tree) // you can load any sprite quickly at runtime using (FileStream file2 = File.Create("catalog-content.json")) { string str = catalogJson.ToString(); file2.Write(Encoding.ASCII.GetBytes(str), 0, str.Length); } }