Beispiel #1
0
        //função responsável por compilar as imagens individualmente
        public static byte[] CompileImg(Image sprite)
        {
            byte[] compiled = new byte[0], coloredgroup = new byte[0], add = new byte[3], coloreds, transps;

            //Quantos pixels coloridos? Quantos transparentes?
            UInt16 colored = 0, transp = 0;

            //Declarando os pixels
            Color  pixel, nextPx;
            Bitmap mysprite = new Bitmap(sprite);

            for (int y = 0; y < mysprite.Height; y++)
            {
                for (int x = 0; x < mysprite.Width; x++)
                {
                    pixel = mysprite.GetPixel(x, y);
                    if (isMagenta(pixel))
                    {
                        transp++;
                    }

                    else
                    {
                        //Adicionando o novo pixel
                        add[0] = pixel.R;
                        add[1] = pixel.G;
                        add[2] = pixel.B;

                        //Avisando que mais um pixel colorido foi encontrado
                        colored++;

                        //Próximo pixel
                        nextPx = nextPixel(mysprite, x, y);

                        coloredgroup = groupByteArray(coloredgroup, add);
                        //se o proximo pixel for magenta OU se esse for o ultimo e for colorido
                        if (x == 31 && y == 31 && isMagenta(pixel) == false || isMagenta(nextPx) == true)
                        {
                            //Salvando tudo
                            transps  = Change.UInt16_to_Byte(transp);
                            coloreds = Change.UInt16_to_Byte(colored);
                            compiled = groupByteArray(compiled, transps);
                            compiled = groupByteArray(compiled, coloreds);
                            compiled = groupByteArray(compiled, coloredgroup);

                            //Reiniciando
                            coloredgroup = new byte[0];
                            transp       = 0;
                            colored      = 0;
                        }
                    }
                }
            }

            return(compiled);
        }
Beispiel #2
0
        private void ShowMsg_Tick(object sender, EventArgs e)
        {
            #region Extração das imagens
            if (Decompiler[0] == true)
            {
                Msg.ForeColor   = Color.Goldenrod;
                Msg.Text        = "It is not frozen! Just reading Tibia.spr (:";
                Decompiler[0]   = false;
                Decompiler[1]   = true;
                Extract.Enabled = false;
                Compile.Enabled = false;
            }

            else if (Decompiler[1] == true)
            {
                string version = "";
                if (selectversion.SelectedIndex == 0)
                {
                    version = "7.2";
                }

                else if (selectversion.SelectedIndex == 1)
                {
                    version = "9.6";
                }

                AzziSprites = new SprReader(extract_path_file_name, Registred, Read, Exported, Compiled, Decompiler, version);
                if (AzziSprites.isRead == false)
                {
                    Msg.ForeColor = Color.Red;
                    Msg.Text      = "Can't find Tibia.spr!";
                }

                Decompiler[1] = false;
                Decompiler[2] = true;
            }

            else if (Decompiler[2] == true)
            {
                Msg.ForeColor = Color.Goldenrod;
                Msg.Text      = "Now it is exporting...";
                if (Directory.Exists(extract_path + "\\Sprites"))
                {
                    Msg.ForeColor   = Color.Red;
                    Msg.Text        = "'Sprites' folder already exists";
                    Decompiler[2]   = false;
                    Extract.Enabled = true;
                    MessageBox.Show("Already have a folder called 'Sprites' \n Body... I can't work in these conditions, all right? \n Adjust that for me (:", "There is a problem! Duh...", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                else
                {
                    Directory.CreateDirectory(extract_path + "\\Sprites");
                    FileStream   dat    = new FileStream(extract_path + "\\Sprites\\signature.dat", FileMode.Create);
                    BinaryWriter writer = new BinaryWriter(dat);
                    writer.Write(AzziSprites.signature[0]);
                    writer.Write(AzziSprites.signature[1]);
                    writer.Write(AzziSprites.signature[2]);
                    writer.Write(AzziSprites.signature[3]);
                    writer.Flush();
                    writer.Close();
                    Decompiler[2] = false;
                    Decompiler[3] = true;
                }
            }

            else if (Decompiler[3] == true)
            {
                if (MasterForm.gettedPassword != "" && MasterForm.gettedSpriteNo != "" && canPass == false)
                {
                    if (alreadyOpen == false)
                    {
                        Msg.ForeColor = Color.Green;
                        Msg.Text      = "Not so easy, this sprites are password protected! /o/";
                        LoginForm loginform = new LoginForm();
                        loginform.Show();
                        alreadyOpen = true;
                    }
                }

                else
                {
                    if (timerRunTimes < AzziSprites.numberOfSpritesRead)
                    {
                        try
                        {
                            for (int i = 0; i < 151; i++)
                            {
                                AzziSprites.SprItems[timerRunTimes].SprBmp.Save(extract_path + "\\Sprites\\s" + timerRunTimes.ToString() + ".bmp");
                                timerRunTimes++;
                                Read.Text     = (int.Parse(Read.Text) - 1).ToString();
                                Exported.Text = (int.Parse(Exported.Text) + 1).ToString();
                            }
                        }
                        catch
                        {
                            Msg.ForeColor = Color.Red;
                            Msg.Text      = "I'm not feeling well...";
                        }
                    }

                    else
                    {
                        Msg.ForeColor   = Color.Green;
                        Msg.Text        = "It is over ;D";
                        Decompiler[3]   = false;
                        Extract.Enabled = true;
                        Compile.Enabled = true;
                        Timer.Enabled   = false;
                        MessageBox.Show("It is over! ;D", "Hey!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            #endregion
            #region Compactação das imagens
            if (Compiler[0] == true)
            {
                //Bloquenado os botões
                Extract.Enabled = false;
                Compile.Enabled = false;

                //Lendo a assinatura da versão
                BinaryReader signa = new BinaryReader(File.OpenRead(compile_path + "\\signature.dat"));
                signature[0] = signa.ReadByte();
                signature[1] = signa.ReadByte();
                signature[2] = signa.ReadByte();
                signature[3] = signa.ReadByte();

                //Descobrindo os arquivos da pasta
                sprite_folder = new DirectoryInfo(compile_path).GetFiles("*.bmp");
                //Quantidade de sprites para serem compiladas
                if (selectversion.SelectedIndex == 0) //versão 7.2 ~ 9.4
                {
                    spriteNumber16 = Change.Int32_to_UInt16(sprite_folder.Length);
                    spriteNumber16++;

                    offsets = new UInt32[spriteNumber16];
                    //O calculo do primeiro offset é a multiplicação da quantidade de offsets por 4
                    offsets[0] = (Change.UInt16_to_UInt32(spriteNumber16) - 1) * 4 + 6;

                    //Imprimindo o valor
                    Read.Text = (spriteNumber16 - 1).ToString();
                }

                else if (selectversion.SelectedIndex == 1) //versão 9.6
                {
                    spriteNumber32 = Change.Int32_to_UInt32(sprite_folder.Length);
                    spriteNumber32++;

                    offsets = new UInt32[spriteNumber32];
                    //O calculo do primeiro offset é a multiplicação da quantidade de offsets por 4
                    offsets[0] = spriteNumber32 * 4 + 6;

                    //Imprimindo o valor
                    Read.Text = (spriteNumber32 - 1).ToString();
                }


                //buscando um nome para o arquivo
                string nome = "Azzi";
                novonome = nome; int onemore = 1;
                while (File.Exists(compile_path + novonome + ".spr"))
                {
                    onemore++;
                    novonome = nome + " " + onemore.ToString();
                }
                novonome = novonome + ".spr";
                //criando o arquivo
                FileStream fs = new FileStream(compile_path + novonome, FileMode.Create);
                writer = new BinaryWriter(fs);

                //Mensagem
                Msg.ForeColor = Color.Goldenrod;
                Msg.Text      = "Compiling sprites...";

                Compiler[0] = false;
                Compiler[1] = true;
            }

            else if (Compiler[1] == true)
            {
                UInt32 spriteNumber = 0;
                if (selectversion.SelectedIndex == 0) //versão 7.2 ~ 9.4
                {
                    spriteNumber = Change.UInt16_to_UInt32(spriteNumber16);
                }

                else if (selectversion.SelectedIndex == 1) //9.6
                {
                    spriteNumber = spriteNumber32;
                }
                for (int i = 0; i <= 37; i++)
                {
                    if (currentSprite < (spriteNumber - 1))
                    {
                        currentSprite++;
                        if (secur == true && currentSprite == 2)
                        {
                            tmpImage = new byte[5];
                        }

                        else if (int.Parse(spriteno) == currentSprite)
                        {
                            tmpImage = SprCompiler.CompileImg(Program.createPasswordSprite(pass));
                        }

                        else
                        {
                            tmpImage = SprCompiler.CompileImg(Image.FromFile(compile_path + "\\s" + currentSprite.ToString() + ".bmp"));
                        }

                        //Colocando o OFFSET de um arquivo de imagem para frente
                        if (offsets[currentSprite - 1] != 0)
                        {
                            lastOffset = offsets[currentSprite - 1];
                        }

                        bool fogetaboutme = false;
                        if (currentSprite < spriteNumber)
                        {
                            if (tmpImage.Length == 3 && selectversion.SelectedIndex == 1 && currentSprite != 1) // se a imagem for vazia e a versão for 9.61
                            {
                                offsets[currentSprite] = 0;
                                fogetaboutme           = true;
                            }
                            else
                            {
                                //Ele usa currentSprite, mas na verdade esta uma na frente, porque eu comecei com o index do offset em 1, o das sprites começa em 2
                                offsets[currentSprite] = lastOffset + Change.Int32_to_UInt32(tmpImage.Length) + 5; //+5 referente a cor transparente que ocupa 3 bytes e o tamanho da sprite 2 bytes
                            }
                        }

                        ushort tamanho = ushort.Parse(tmpImage.Length.ToString());

                        magentabyte[0] = 255;
                        magentabyte[1] = 0;
                        magentabyte[2] = 255;


                        //tamanho da imagem
                        tmpImage = SprCompiler.groupByteArray(Change.UInt16_to_Byte(tamanho), tmpImage);
                        //pixel invisivel
                        tmpImage = SprCompiler.groupByteArray(magentabyte, tmpImage);

                        if (fogetaboutme == true)
                        {
                            //escrevendo a compilação nele
                            writer.Write(tmpImage);
                        }

                        //compiledimages = SprCompiler.groupByteArray(compiledimages, tmpImage);
                        Compiled.Text = (int.Parse(Compiled.Text) + 1).ToString();

                        Random rand = new Random();
                        if (rand.Next(0, 50000) == i)
                        {
                            Msg.ForeColor = Color.Goldenrod;
                            Msg.Text      = "Compiling sprites with perfect love.";
                        }
                    }

                    else
                    {
                        Compiler[1]   = false;
                        Compiler[2]   = true;
                        Msg.ForeColor = Color.Goldenrod;
                        Msg.Text      = "Now it is adjusting the file.";
                    }
                }
            }

            else if (Compiler[2] == true)
            {
                //adicionando a signature
                fullcompile = SprCompiler.groupByteArray(fullcompile, signature);

                //adicionando os 2 bytes do sprite number
                UInt32 spriteNumber = 0;
                if (selectversion.SelectedIndex == 0) //versão 7.2 ~ 9.4
                {
                    spriteNumber = Change.UInt16_to_UInt32(spriteNumber16);
                    fullcompile  = SprCompiler.groupByteArray(fullcompile, Change.UInt16_to_Byte(Change.UInt16_add(spriteNumber16, (0 - 1))));
                }
                else if (selectversion.SelectedIndex == 1) //9.6
                {
                    spriteNumber = spriteNumber32;
                    fullcompile  = SprCompiler.groupByteArray(fullcompile, Change.UInt32_to_Byte(Change.UInt32_add(spriteNumber32, (0 - 1))));
                }
                //adicionando os offsets

                for (int i = 0; i < (spriteNumber - 1); i++)
                {
                    //compilando os offsets
                    fullcompile = SprCompiler.groupByteArray(fullcompile, Change.UInt32_to_Byte(offsets[i]));
                }

                //Lendo as imagens guardadas no arquivo
                writer.Flush();
                writer.Close();
                BinaryReader readspr = new BinaryReader(File.OpenRead(compile_path + novonome)); //abrindo o arquivo
                readspr.BaseStream.Position = 0;
                compiledimages = readspr.ReadBytes(int.Parse(readspr.BaseStream.Length.ToString()));

                readspr.Close();
                File.Delete(compile_path + novonome);

                FileStream fs = new FileStream(compile_path + novonome, FileMode.Create);
                writer = new BinaryWriter(fs);

                //juntando o grupo de imagens compiladas
                fullcompile = SprCompiler.groupByteArray(fullcompile, compiledimages);

                //CONCLUSÃO
                //escrevendo a compilação nele
                for (int i = 0; i < fullcompile.Length; i++)
                {
                    writer.Write(fullcompile[i]);
                }
                writer.Flush();

                //Fechando tudo
                writer.Close();
                Compiler[2] = false;

                //Desbloqeuando os botões
                Extract.Enabled = true;
                Compile.Enabled = true;
                Timer.Enabled   = false;

                Msg.ForeColor = Color.Green;
                Msg.Text      = "It is over ;D";
            }
            #endregion
        }