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 SaveStaticBitmaps(RepeatedField <uint> sprites, ref int start, Core.Sprites.ContentSprites sprParser, int dX, int dY, int clientVersion) { DrawBitmapsDelegate drawFunc; int layers = 0; int spritetype = 1; if (dX == 32 && dY == 32) { drawFunc = DrawBitmap32x32From1_32x32; layers = 1; } else if (dX == 32 && dY == 64) { drawFunc = DrawBitmap32x64From2_32x32; layers = 2; spritetype = 2; } else if (dX == 64 && dY == 32) { drawFunc = DrawBitmap64x32From2_32x32; layers = 2; spritetype = 3; } else { drawFunc = DrawBitmap64x64From4_32x32; layers = 4; spritetype = 4; } int amountInBitmap = BITMAP_SIZE / (32 * 32); int totalBitmaps = (int)Math.Ceiling((double)sprites.Count / amountInBitmap); if (totalBitmaps == 0) { return; } int localStart = start; start += sprites.Count / layers; tasks.Add(Task.Run(() => InternalSaveStaticBitmaps(sprites, drawFunc, layers, spritetype, localStart, sprParser, dX, dY, clientVersion))); }
static void SaveSprites(RepeatedField <Appearance> appearances, ref int start, Core.Sprites.ContentSprites sprParser, int clientVersion) { RepeatedField <uint>[] sortedFrameGroups = new RepeatedField <uint> [4]; for (int i = 0; i < 4; i++) { sortedFrameGroups[i] = new RepeatedField <uint>(); } DeploySprites(appearances, sortedFrameGroups); SaveStaticBitmaps(sortedFrameGroups[0], ref start, sprParser, 32, 32, clientVersion); SaveStaticBitmaps(sortedFrameGroups[1], ref start, sprParser, 32, 64, clientVersion); SaveStaticBitmaps(sortedFrameGroups[2], ref start, sprParser, 64, 32, clientVersion); SaveStaticBitmaps(sortedFrameGroups[3], ref start, sprParser, 64, 64, clientVersion); }
static void InternalSaveStaticBitmaps(RepeatedField <uint> sprites, DrawBitmapsDelegate drawFunc, int layers, int spriteType, int localStart, Core.Sprites.ContentSprites sprParser, int dX, int dY, int clientVersion) { int singleSize = dX * dY; AsyncGraphics gfx = new AsyncGraphics(new Bitmap(SEGMENT_DIMENTION, SEGMENT_DIMENTION)); string filename; int x = 0, y = 0, z = 0; for (int i = 0; i < sprites.Count;) { Bitmap[] smallBitmaps = new Bitmap[layers]; for (int m = 0; m < layers; m++) { if (i + m >= sprites.Count) { break; } smallBitmaps[m] = sprParser.GetSprite(sprites[i + m]); } if (y >= SEGMENT_DIMENTION) { filename = string.Format("sprites-{0}-{1}.png", localStart, localStart + (BITMAP_SIZE / singleSize) - 1); tasks.Add(gfx.SaveAndDispose(Path.Combine(clientVersion.ToString() + "/sprites", filename))); jsonTokens.Add(new SpritesToken() { file = filename, spritetype = spriteType, firstspriteid = localStart, lastspriteid = localStart + (BITMAP_SIZE / singleSize) - 1 }); localStart += BITMAP_SIZE / singleSize; gfx = new AsyncGraphics(new Bitmap(SEGMENT_DIMENTION, SEGMENT_DIMENTION)); x = y = z = 0; } var tmpSmallBitmaps = smallBitmaps; drawFunc(gfx, smallBitmaps, x, y); tasks.Add(gfx.DisposeOnDone(smallBitmaps)); x += dX; if (x >= SEGMENT_DIMENTION) { y += dY; x = 0; } if (i == sprites.Count) { break; } i = Math.Min(i + layers, sprites.Count); z++; } // save the last gfx int end = localStart + z; filename = string.Format("sprites-{0}-{1}.png", localStart, end - 1); tasks.Add(gfx.SaveAndDispose(Path.Combine(clientVersion.ToString(), "sprites", filename))); jsonTokens.Add(new SpritesToken() { file = filename, spritetype = spriteType, firstspriteid = localStart, lastspriteid = end - 1 }); }
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); } }