Exemple #1
0
        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 + ".");
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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)));
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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
            });
        }
Exemple #6
0
        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);
            }
        }