Ejemplo n.º 1
0
        public SprDecompiler96(TibiaFile spr)
        {
            if (File.Exists(spr.getFile()))
            {
                //lendo assinatura
                BinaryReader readspr = new BinaryReader(File.OpenRead(spr.getFile()));
                this.signature[0] = readspr.ReadByte();
                this.signature[1] = readspr.ReadByte();
                this.signature[2] = readspr.ReadByte();
                this.signature[3] = readspr.ReadByte();

                spritesAmount = readspr.ReadUInt32();          //quantidade de sprites
                this.SprBmp   = new Bitmap[spritesAmount + 1]; //array de sprites
                this.offset   = new UInt32[spritesAmount];     //array de offsets

                for (int i = 1; i < spritesAmount; i++)
                {
                    this.offset[i] = readspr.ReadUInt32();
                }

                for (int i = 1; i < spritesAmount; i++)
                {
                    UInt16 length;
                    UInt32 offset_final;
                    Int32  px          = 0;
                    byte[] pixel_array = new byte[3072], transparent = new byte[3];

                    if (this.offset[i] == 0)
                    {
                        this.SprBmp[i] = Program.nullimage;
                    }

                    else
                    {
                        readspr.BaseStream.Seek(this.offset[i], SeekOrigin.Begin);
                        //cor transparente, normalmente 255 0 255
                        transparent[0] = readspr.ReadByte();
                        transparent[1] = readspr.ReadByte();
                        transparent[2] = readspr.ReadByte();

                        length         = readspr.ReadUInt16();
                        offset_final   = this.offset[i] + length;
                        this.SprBmp[i] = new Bitmap(32, 32);
                        while (readspr.BaseStream.Position < offset_final && px != 3072)
                        {
                            UInt16 transparent_px = readspr.ReadUInt16();
                            UInt16 normal_px      = readspr.ReadUInt16();

                            for (int j = 0; j < transparent_px; j++)
                            {
                                if (px != 3072)
                                {
                                    pixel_array[px] = 255; //blue
                                    px++;
                                    pixel_array[px] = 0;   //green
                                    px++;
                                    pixel_array[px] = 255; //red
                                    px++;
                                }
                                else
                                {
                                    break;
                                }
                            }

                            for (int j = 0; j < normal_px; j++)
                            {
                                if (px != 3072)
                                {
                                    byte red = readspr.ReadByte(), green = readspr.ReadByte(), blue = readspr.ReadByte();
                                    pixel_array[px] = blue;  //blue
                                    px++;
                                    pixel_array[px] = green; //green
                                    px++;
                                    pixel_array[px] = red;   //red
                                    px++;
                                }

                                else
                                {
                                    break;
                                }
                            }
                        }

                        for (int j = px; j < 3072; j++)
                        {
                            pixel_array[j] = 255; //blue
                            j++;
                            pixel_array[j] = 0;   //green
                            j++;
                            pixel_array[j] = 255; //red
                        }

                        this.SprBmp[i] = CopyDataToBitmap(pixel_array);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private void Extract_Click(object sender, EventArgs e)
        {
            if (getVersion() == 3.0)
            {
                #region lendo para a versão 3.0 até 6.5
                setLog("Can't work with this version.");
                #endregion
            }

            else
            {
                extrair_quem = new TibiaFile("Which file you want to decompile?");
                if (extrair_quem.success == true)
                {
                    extrair_para_onde = new TibiaFolder("Where do you want the folder be created?");
                    if (extrair_para_onde.success == true)
                    {
                        #region lendo para a versão 7.0 até 9.54
                        if (getVersion() == 7.0)
                        {
                            setLog("Reading sprite file.");
                            try
                            {
                                sd70 = new SprDecompiler70(extrair_quem);
                                setLog("Exporting...");
                                setLog("The logs blinking while extracting means that my program is the best...");
                                sprites_to_export = sd70.getSprites();
                                assinatura.set(sd70.getSignature());
                            }

                            catch
                            {
                                try
                                {
                                    setLog("Can't read the file...");
                                    selectversion.SelectedIndex = 1;
                                    setLog("Trying to decompile under the pattern from version 9.6");
                                    setLog("Reading sprite file.");
                                    sd96 = new SprDecompiler96(extrair_quem);
                                    setLog("Exporting...");
                                    sprites_to_export = sd96.getSprites();
                                    assinatura.set(sd96.getSignature());
                                }

                                catch
                                {
                                    setLog("Can't read the file... Operation aborted");
                                }
                            }
                        }
                        #endregion
                        #region lendo para versão 9.6
                        else if (getVersion() == 9.6)
                        {
                            setLog("Reading sprite file.");
                            //try
                            // {
                            sd96 = new SprDecompiler96(extrair_quem);
                            setLog("Exporting...");
                            sprites_to_export = sd96.getSprites();
                            assinatura.set(sd96.getSignature());

                            /*}
                             *
                             * catch
                             * {
                             *  try
                             *  {
                             *      setLog("Can't read the file...");
                             *      selectversion.SelectedIndex = 0;
                             *      setLog("Trying to decompile under the pattern from version 7.2 to 9.54");
                             *      setLog("Reading sprite file.");
                             *      sd70 = new SprDecompiler70(extrair_quem);
                             *      assinatura.set(sd70.getSignature());
                             *      setLog("Exporting...");
                             *      sprites_to_export = sd70.getSprites();
                             *  }
                             *
                             *  catch
                             *  {
                             *      setLog("Can't read the file... Operation aborted");
                             *  }
                             */
                        }
                        #endregion
                        #region criando a pasta onde as sprites serão armazenadas e depois iniciando o thread
                        if (sprites_to_export != null)
                        {
                            string nova_pasta = "Sprites";
                            int    k          = 2;

                            while (Directory.Exists(extrair_para_onde.getPath() + "\\" + nova_pasta))
                            {
                                nova_pasta = "Sprites " + k.ToString(); k++;
                            }
                            export_folder_name = extrair_para_onde.getPath() + "\\" + nova_pasta;
                            Directory.CreateDirectory(export_folder_name);
                            assinatura.save(extrair_para_onde, nova_pasta);
                        }

                        this.sprites_exporter = new Thread(new ThreadStart(this.saveSprites));
                        this.sprites_exporter.Start();
                        #endregion
                    } //seleção da pasta onde as imagens vão ficar
                }     //seleção do arquivo a ser extraido
            }
        }