En 2012, Peter «Durante» Thoman escribió el popular mod DSfix para Dark Souls: Prepare to Die en PC, arreglando su resolución bloqueada de 1024×720 y otros problemas. En 2013, lanzó una solución similar para Deadly Premonition. Le pedimos a Durante que analizara el puerto de PC de Dark Souls 2 en una serie de artículos. También modificó el juego. La imagen de arriba es una textura del juego, no un Photoshop.
Mis primeros dos artículos sobre Dark Souls 2 investigaron las características del puerto de PC y cómo se pueden usar herramientas genéricas de ajuste de PC como SweetFX para mejorar aún más sus gráficos. Ahora es el momento de ver el alcance total de lo que se puede lograr modificando Dark Souls 2 en un nivel más profundo. Primero, proporcionaré una breve descripción de las vías generales disponibles para la modificación de juegos de PC y cómo cada una se aplica a Dark Souls 2. Luego, detallaré las modificaciones que he implementado hasta ahora con una nueva herramienta que llamo GeDoSaTo, que permite la modificación de texturas, la reducción de resolución arbitraria y más. Considérelo el sucesor de DSfix y DPfix, excepto que su objetivo final es funcionar con cualquier juego en 3D, no solo con Dark Souls 2.
Los múltiples caminos del modding
Si bien hay muchas formas de modificar un juego, generalmente se pueden asignar a una de tres categorías según su enfoque subyacente:
- Alteración de archivos de datos
- Intercepción de llamadas de la biblioteca
- Modificación binaria directa
Estos se ordenan aumentando la “invasividad” del procedimiento. Cuanto más invasivo es el mod, más difícil es. Ahora veremos cada enfoque y cómo se puede aplicar a Dark Souls 2.
Si solo desea acceder a GeDoSaTo y cómo permite modificar en Dark Souls 2, haga clic aquí para ir a la página dos.
Alteración de archivos de datos
En principio, este es un método simple y se puede usar con muchos juegos para modificar sus activos: texturas, archivos de sonido, incluso modelos y niveles. Imagina un juego básico, que viene con una carpeta llena de imágenes que se usan directamente como texturas. Al cambiar una de estas imágenes, realiza modificaciones a través de la alteración del archivo de datos. Por ejemplo, el popular juego de ritmo Audiosurf tiene todos sus archivos completamente accesibles de esta manera.
En la mayoría de los juegos modernos, al menos aquellos que no están diseñados para modificar, la situación no es tan conveniente. Los archivos de datos a menudo se recopilan en formatos de archivo personalizados no documentados con formas desconocidas de compresión. Si bien esto es, por supuesto, un obstáculo, los modders ingeniosos pueden aplicar ingeniería inversa a dichos archivos y proporcionar herramientas para reconstruirlos con datos diferentes. Dark Souls 2, como se comenta en el artículo inicial, almacena la gran mayoría de sus datos en archivos “*.bdt”, como “GameDataEbl.bdt”.
Arriba, puedes ver un pequeño extracto del contenido del archivo de datos del juego principal de Dark Souls 2. Como puede ver a la derecha, esta parte parece contener algunos nombres de algunos archivos individuales almacenados en este archivo. Antes de esta sección, se almacena un conjunto de números que bien podrían contener compensaciones en el archivo que designan la ubicación de cada archivo individual. Con suficiente tiempo y esfuerzo, debería ser factible comprender completamente este formato de archivo y escribir herramientas para manejarlo. Eso podría llevar de semanas a años, e incluso un intento tan heroico podría no ser suficiente para habilitar la alteración de archivos de datos en Dark Souls 2.
Lo que ve arriba es el contenido del archivo «GameDataKeyCode.pem» que se envía con Dark Souls. Es un Archivo de clave pública RSA , y hay uno de esos archivos asociado con cada archivo de datos del juego. La interpretación más obvia de esto es que el juego verifica la firma de cada archivo de datos al cargarlo, para asegurarse de que no se hayan realizado modificaciones. Tenga en cuenta que esto no es una certeza, es una conjetura informada. Si no me equivoco, entonces la alteración del archivo de datos para Dark Souls 2 requerirá además romper su encriptación y/o modificación binaria directa para deshabilitarlo. Afortunadamente, existen enfoques alternativos.
Intercepción de llamadas de la biblioteca
La intercepción de llamadas de la biblioteca funciona reemplazando una biblioteca (una colección de funciones de programa) de la que depende un juego determinado con una alternativa personalizada. Una herramienta muy común basada en este principio es SweetFX.
En la imagen de arriba, ve una ilustración esquemática de la ejecución «normal» de un programa. En varios momentos, el juego realiza una llamada a una función de biblioteca (por ejemplo, en la biblioteca Direct3D9 d3d9.dll), lo que hace que se ejecute algún procedimiento y se informe un valor al programa. Las llamadas a la biblioteca en el programa se ilustran con flechas azules y los valores devueltos con flechas verdes.
Un interceptor, como sugiere el nombre, intercepta las llamadas a la biblioteca del programa, alterándolas antes de que lleguen a la biblioteca. Luego informa sus valores de retorno, o valores completamente diferentes, al programa. Como ejemplo, piense en Dark Souls 1 y DSFix. En términos simplificados, DS1 solicitó a Direct3D una superficie de 1024×720 para renderizar el juego. DSfix tomó esta solicitud, cambió la resolución a lo que el usuario deseaba y devolvió la superficie generada posteriormente a Dark Souls. Eso por sí solo generalmente rompería el renderizado; también necesita ajustar las vistas de renderizado, las matrices de proyección, los rectángulos de tijera y los posibles parámetros de sombreado para que funcione, pero esta es la idea básica.
El mayor desafío al escribir un interceptor (más allá de la mecánica de la interceptación) es comprender el comportamiento del programa original y determinar cómo modificarlo para lograr el efecto deseado. De manera crucial, se debe determinar una llamada de biblioteca o una secuencia de llamadas que identifique de manera única lo que está haciendo un programa en ese momento dado. Esta dificultad es la razón por la que SweetFX funciona bien con una gran cantidad de juegos: simplemente cambia la imagen de salida al final antes de que se presente en el monitor, y este punto es fácil de identificar de forma genérica.
Modificación binaria directa
Modificar el código de un programa en ejecución directamente en la memoria es la forma de modificación más poderosa, pero también la más compleja. En este proceso, algunas instrucciones binarias en el programa original son reemplazadas por otras diferentes, lo que resulta en un comportamiento alterado. Puede, en teoría, usarse para lograr cualquier cosa, pero en la práctica, esto a menudo no es factible para los grandes juegos modernos debido al esfuerzo de ingeniería inversa necesario para comprender su código base en el grado requerido para modificaciones significativas. Nwks logró el desbloqueo de la velocidad de fotogramas de Dark Souls 1 usando este proceso, y algo similar podría ser posible para Dark Souls 2.
Por ahora, vamos con el método de intercepción. En la página dos, modificamos Dark Souls 2.