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); } } } }
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 } }