Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        /// <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); }
        }