static void Main() { Depurador.Iniciar_Depurador(); //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Ventana_XNA()); Ventana_XNA Ventana = new Ventana_XNA(); GraphicsDeviceManager Dispositivo = new GraphicsDeviceManager(Ventana); Dispositivo.GraphicsProfile = GraphicsProfile.HiDef; // HiDef for Stardew Valley. Ventana.Run(); }
/// <summary> /// Loads the resources from any other XNA game like if they were form this one and extracts them. /// Tested with the XNA resources from the games "Terraria" and "Stardew Valley" with success. /// With applications like "ILSpy" you can see the source code from XNA games since they are .NET. /// The idea of this application is to find secrets hidden in the game textures and resources, /// but it should never be used to do anything illegal, so be sure you have the proper /// permissions before you start using it on random games. Jupisoft will never be responsible. /// </summary> protected override void LoadContent() { try { try { if (!Directory.Exists(Program.Ruta_XNA)) { Directory.CreateDirectory(Program.Ruta_XNA); } } catch (Exception Excepción) { Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } List <string> Lista_Rutas = new List <string>(); List <string> Lista_Rutas_XSB = new List <string>(); string[] Matriz_Rutas = Directory.GetFiles(Program.Ruta_XNA, "*.xnb", SearchOption.AllDirectories); if (Matriz_Rutas != null && Matriz_Rutas.Length > 0) { Lista_Rutas.AddRange(Matriz_Rutas); Matriz_Rutas = null; } Matriz_Rutas = Directory.GetFiles(Program.Ruta_XNA, "*.xwb", SearchOption.AllDirectories); if (Matriz_Rutas != null && Matriz_Rutas.Length > 0) { Lista_Rutas.AddRange(Matriz_Rutas); Matriz_Rutas = null; } Matriz_Rutas = Directory.GetFiles(Program.Ruta_XNA, "*.xgs", SearchOption.AllDirectories); if (Matriz_Rutas != null && Matriz_Rutas.Length > 0) { Lista_Rutas.AddRange(Matriz_Rutas); Matriz_Rutas = null; } Matriz_Rutas = Directory.GetFiles(Program.Ruta_XNA, "*.xsb", SearchOption.AllDirectories); if (Matriz_Rutas != null && Matriz_Rutas.Length > 0) { //Lista_Rutas.AddRange(Matriz_Rutas); Lista_Rutas_XSB.AddRange(Matriz_Rutas); if (Lista_Rutas_XSB.Count > 1) { Lista_Rutas.Sort(); } Matriz_Rutas = null; } if (Lista_Rutas.Count > 1) { Lista_Rutas.Sort(); } Matriz_Rutas = Lista_Rutas.ToArray(); Lista_Rutas = null; if (Matriz_Rutas != null && Matriz_Rutas.Length > 0) // There are files to extract. { foreach (string Ruta in Matriz_Rutas) { try { if (!string.IsNullOrEmpty(Ruta) && File.Exists(Ruta)) { string Ruta_Relativa = '.' + Ruta.Substring(Program.Ruta_Aplicación.Length).Substring(0, (Ruta.Length - Program.Ruta_Aplicación.Length) - 4); string Ruta_Salida = Ruta.Substring(0, Ruta.Length - 4); try // Try to read as a 2D texture and export as a PNG image. { Microsoft.Xna.Framework.Graphics.Texture2D Textura = base.Content.Load <Texture2D>(Ruta_Relativa); if (Textura != null) { MemoryStream Lector_Memoria = new MemoryStream(); int Ancho = 16; // Default on error. int Alto = 16; try { Ancho = Textura.Width; } catch { Ancho = 16; } try { Alto = Textura.Height; } catch { Alto = 16; } Textura.SaveAsPng(Lector_Memoria, Ancho, Textura.Height); byte[] Matriz_Bytes = Lector_Memoria.ToArray(); Lector_Memoria.Close(); Lector_Memoria.Dispose(); Lector_Memoria = null; Lector_Memoria = new MemoryStream(Matriz_Bytes); Image Imagen_Original = null; try { Imagen_Original = Image.FromStream(Lector_Memoria, false, false); } catch { Imagen_Original = null; } Lector_Memoria.Close(); Lector_Memoria.Dispose(); Lector_Memoria = null; Matriz_Bytes = null; if (Imagen_Original != null) // Reconvert the image to 24 or 32 bits with alpha. { //Ancho = Imagen_Original.Width; // Could the width or height change? //Alto = Imagen_Original.Height; Bitmap Imagen = new Bitmap(Ancho, Alto, !Image.IsAlphaPixelFormat(Imagen_Original.PixelFormat) ? PixelFormat.Format24bppRgb : PixelFormat.Format32bppArgb); Graphics Pintar = Graphics.FromImage(Imagen); Pintar.CompositingMode = CompositingMode.SourceCopy; Pintar.CompositingQuality = CompositingQuality.HighQuality; Pintar.InterpolationMode = InterpolationMode.HighQualityBicubic; Pintar.PixelOffsetMode = PixelOffsetMode.HighQuality; Pintar.SmoothingMode = SmoothingMode.None; Pintar.TextRenderingHint = TextRenderingHint.AntiAlias; Pintar.DrawImage(Imagen_Original, new System.Drawing.Rectangle(0, 0, Ancho, Alto), new System.Drawing.Rectangle(0, 0, Ancho, Alto), GraphicsUnit.Pixel); Pintar.Dispose(); Pintar = null; while (File.Exists(Ruta_Salida + ".png")) { Ruta_Salida += '_'; } Imagen.Save(Ruta_Salida + ".png", ImageFormat.Png); Ruta_Salida = null; Imagen.Dispose(); Imagen = null; Imagen_Original.Dispose(); Imagen_Original = null; Ruta_Relativa = null; Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. continue; // Go to the next XNB resource file. } } } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } try // Try to read as a string and string dictionary and export as Unicode text. { Dictionary <string, string> Diccionario = base.Content.Load <Dictionary <string, string> >(Ruta_Relativa); if (Diccionario != null && Diccionario.Count > 0) { while (File.Exists(Ruta_Salida + ".txt")) { Ruta_Salida += '_'; } FileStream Lector = new FileStream(Ruta_Salida + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); Lector.SetLength(0L); Lector.Seek(0L, SeekOrigin.Begin); StreamWriter Lector_Texto = new StreamWriter(Lector, Encoding.Unicode); foreach (KeyValuePair <string, string> Entrada in Diccionario) { try { Lector_Texto.WriteLine(Entrada.Key); Lector_Texto.WriteLine(Entrada.Value); Lector_Texto.WriteLine(); Lector_Texto.Flush(); } catch (Exception Excepción) { Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); continue; } } Lector_Texto.Close(); Lector_Texto.Dispose(); Lector_Texto = null; Lector.Close(); Lector.Dispose(); Lector = null; Diccionario = null; Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. continue; // Go to the next XNB resource file. } } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } try // Try to read as an int and text dictionary and export as Unicode text. { Dictionary <int, string> Diccionario = base.Content.Load <Dictionary <int, string> >(Ruta_Relativa); if (Diccionario != null && Diccionario.Count > 0) { while (File.Exists(Ruta_Salida + ".txt")) { Ruta_Salida += '_'; } FileStream Lector = new FileStream(Ruta_Salida + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); Lector.SetLength(0L); Lector.Seek(0L, SeekOrigin.Begin); StreamWriter Lector_Texto = new StreamWriter(Lector, Encoding.Unicode); foreach (KeyValuePair <int, string> Entrada in Diccionario) { try { Lector_Texto.WriteLine(Entrada.Key.ToString()); Lector_Texto.WriteLine(Entrada.Value); Lector_Texto.WriteLine(); Lector_Texto.Flush(); } catch (Exception Excepción) { Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); continue; } } Lector_Texto.Close(); Lector_Texto.Dispose(); Lector_Texto = null; Lector.Close(); Lector.Dispose(); Lector = null; Diccionario = null; Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. continue; // Go to the next XNB resource file. } } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } try // Try to read as an int and int array dictionary and export as Unicode text. { Dictionary <int, int[]> Diccionario = base.Content.Load <Dictionary <int, int[]> >(Ruta_Relativa); if (Diccionario != null && Diccionario.Count > 0) { while (File.Exists(Ruta_Salida + ".txt")) { Ruta_Salida += '_'; } FileStream Lector = new FileStream(Ruta_Salida + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); Lector.SetLength(0L); Lector.Seek(0L, SeekOrigin.Begin); StreamWriter Lector_Texto = new StreamWriter(Lector, Encoding.Unicode); // .Default? foreach (KeyValuePair <int, int[]> Entrada in Diccionario) { try { Lector_Texto.WriteLine(Entrada.Key.ToString()); if (Entrada.Value != null && Entrada.Value.Length > 0) { for (int Índice = 0; Índice < Entrada.Value.Length; Índice++) { try { Lector_Texto.Write(Entrada.Value[Índice].ToString() + (Índice + 1 < Entrada.Value.Length ? ", " : null)); } catch (Exception Excepción) { Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); continue; } } Lector_Texto.WriteLine(); } else { Lector_Texto.WriteLine(); } Lector_Texto.WriteLine(); Lector_Texto.Flush(); } catch (Exception Excepción) { Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); continue; } } Lector_Texto.Close(); Lector_Texto.Dispose(); Lector_Texto = null; Lector.Close(); Lector.Dispose(); Lector = null; Diccionario = null; Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. continue; // Go to the next XNB resource file. } } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } try // Try to read as a sprite font and export as a PNG image. { Microsoft.Xna.Framework.Graphics.SpriteFont Fuente = base.Content.Load <SpriteFont>(Ruta_Relativa); if (Fuente != null) { Fuente = null; while (File.Exists(Ruta_Salida + ".png")) { Ruta_Salida += '_'; } if (XNA_Extractor.Extract.XnbExtractor.Extract(Ruta, Ruta_Salida + ".png", false, false, false, true)) { Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. continue; // Go to the next XNB resource file. } } } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } try // Try to read as a sound effect and export as WAV audio file. { Microsoft.Xna.Framework.Audio.SoundEffect Efecto_Sonido = base.Content.Load <Microsoft.Xna.Framework.Audio.SoundEffect>(Ruta_Relativa); if (Efecto_Sonido != null) { Efecto_Sonido.Dispose(); Efecto_Sonido = null; while (File.Exists(Ruta_Salida + ".wav")) { Ruta_Salida += '_'; } if (XNA_Extractor.Extract.XnbExtractor.Extract(Ruta, Ruta_Salida + ".wav", false, false, true, false)) { //Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. continue; // Go to the next XNB resource file. } } } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } /*try // Try to read as an effect and export as ?. * { * Microsoft.Xna.Framework.Graphics.Effect Efecto = base.Content.Load<Effect>(Ruta_Relativa); * if (Efecto != null) * { * Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. * continue; // Go to the next XNB resource file. * } * } * catch (Exception Excepción) * { * //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); * }*/ try // Try to read as a multiple type and export as a PNG image. { while (File.Exists(Ruta_Salida + ".png")) { Ruta_Salida += '_'; } if (XNA_Extractor.Extract.XnbExtractor.Extract(Ruta, Ruta_Salida + ".png", false, true, true, true)) { Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. continue; // Go to the next XNB resource file. } } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } try // Try to read as a bank wave file and export as multiple WAV sound files. { //while (File.Exists(Ruta_Salida + ".wav")) Ruta_Salida += '_'; //MessageBox.Show(Path.GetDirectoryName(Ruta_Salida), Ruta_Salida); if (/*string.Compare(Path.GetExtension(Ruta), ".xwb", true) == 0 && */ XNA_Extractor.Extract.XactExtractor.Extract(Ruta, Path.GetDirectoryName(Ruta))) { Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. continue; // Go to the next XNB resource file. } } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } // TODO: Add support for more resource types... } } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); continue; } } Matriz_Rutas = null; } // This works perfectly, but the class from "XactExtractor.cs" seems to export too many files? if (Lista_Rutas_XSB != null && Lista_Rutas_XSB.Count > 0) // Post-process the track names if present. { List <char> Lista_Caracteres_Inválidos = new List <char>(Path.GetInvalidFileNameChars()); foreach (string Ruta in Lista_Rutas_XSB) { try { FileStream Lector_Entrada = new FileStream(Ruta, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite); if (Lector_Entrada.Length > 0L) // Not empty. { byte[] Matriz_Bytes = new byte[Lector_Entrada.Length]; // Read the whole file at once. int Longitud = Lector_Entrada.Read(Matriz_Bytes, 0, Matriz_Bytes.Length); Lector_Entrada.Close(); Lector_Entrada.Dispose(); Lector_Entrada = null; if (Longitud < Matriz_Bytes.Length) { Array.Resize(ref Matriz_Bytes, Longitud); } string Ruta_Actual = Path.GetDirectoryName(Ruta); int Total_Pistas = 0; for (int Índice = 1; Índice < int.MaxValue; Índice++) { if (File.Exists(Ruta_Actual + "\\" + Índice.ToString() + " Unknown.wav")) { Total_Pistas++; } else { break; // Stop when a track in order is missing. } } List <string> Lista_Nombres = new List <string>(); int Índice_Anterior = Matriz_Bytes.Length - 1; // This byte should be zero (string ender). for (int Índice = Matriz_Bytes.Length - 2; Índice >= 0; Índice--) { if (Matriz_Bytes[Índice] == 0) { if (Índice + 1 != Índice_Anterior) // Avoid multiple nulls. { string Nombre = null; for (int Índice_Caracter = Índice + 1; Índice_Caracter < Índice_Anterior; Índice_Caracter++) { char Caracter = (char)Matriz_Bytes[Índice_Caracter]; if (!char.IsControl(Caracter) && Caracter != 'ÿ' && !Lista_Caracteres_Inválidos.Contains(Caracter)) { Nombre += Caracter; } } if (string.IsNullOrEmpty(Nombre)) { Nombre = "Unknown"; } Lista_Nombres.Add(Nombre); //if (Lista_Nombres.Count >= Total_Pistas) break; } Índice_Anterior = Índice; } } if (Lista_Nombres != null && Lista_Nombres.Count > 0) { for (int Índice_Pista = Total_Pistas, Índice_Nombre = 0; Índice_Pista >= 1; Índice_Pista--, Índice_Nombre++) { try { File.Move(Ruta_Actual + "\\" + Índice_Pista.ToString() + " Unknown.wav", Ruta_Actual + "\\" + Índice_Pista.ToString() + " " + Lista_Nombres[Índice_Nombre] + ".wav"); } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); continue; } } Lista_Nombres.Reverse(); string Ruta_Salida = Ruta.Substring(0, Ruta.Length - 4); while (File.Exists(Ruta_Salida + ".txt")) { Ruta_Salida += '_'; } FileStream Lector = new FileStream(Ruta_Salida + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); Lector.SetLength(0L); Lector.Seek(0L, SeekOrigin.Begin); StreamWriter Lector_Texto = new StreamWriter(Lector, Encoding.Unicode); foreach (string Nombre in Lista_Nombres) { try { Lector_Texto.WriteLine(Nombre); Lector_Texto.Flush(); } catch (Exception Excepción) { //Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); continue; } } Lector_Texto.Close(); Lector_Texto.Dispose(); Lector_Texto = null; Lector.Close(); Lector.Dispose(); Lector = null; Lista_Nombres = null; Program.Eliminar_Archivo_Carpeta(Ruta); // Delete the copied XNB resource. continue; // Go to the next XNB resource file. } } } catch (Exception Excepción) { Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); continue; } } Lista_Caracteres_Inválidos = null; } Depurador.Detener_Depurador(); this.Exit(); } catch (Exception Excepción) { Depurador.Escribir_Excepción(Excepción != null ? Excepción.ToString() : null); } }