
Un desensamblador y decompilador experimental para scripts de TLOU2 DC.

dconstruct es una herramienta de ingeniería inversa para los archivos DC-Script utilizados en The Last of Us Part II. Incluye un desensamblador y un descompilador.
Genera archivos .asm que contienen las estructuras desensambladas y bytecode, así como archivos .dcpl (DC Pseudo Language) que contienen código pseudo similar a C.
También puede realizar ediciones en archivos mediante la línea de comandos, incluyendo reemplazar estructuras completas con poco esfuerzo. Esto hace que crear mods que simplemente cambien un par de valores dentro de los archivos .bin sea extremadamente fácil.
-e, creando nuevos archivos que puede usar para modsPrimero, se recomienda que mueva el directorio dconstruct descomprimido a una ubicación segura, como C:\Program Files.
Para que dconstruct sea lo más fácil de usar posible, se recomienda que agregue el directorio .\bin dentro de la carpeta dconstruct a su PATH. Puede obtener más información aquí, o seguir estos pasos rápidos:

Asegúrese de que su ruta termine en "\bin" y NO en "\dconstruct".
Haga clic en 'Aceptar' en todos los cuadros de diálogo abiertos.
Para verificar que funcionó, abra un nuevo símbolo del sistema y escriba dconstruct --about. Debería ver alguna salida del programa y ningún mensaje de error.
Ejecute un comando como este en la línea de comandos para generar su primer archivo desensamblado:```shell dconstruct my_bin_file.bin
Esto generará un archivo llamado `my_bin_file.bin.asm` en el mismo directorio que su archivo de entrada. Luego puede abrir ese archivo usando un editor de texto/código. Recomendaría usar algo como VSCode que ofrece funciones de búsqueda avanzada y es bueno para manejar archivos grandes. No se recomienda el Bloc de notas estándar de Windows.
Para descompilar un archivo, agregue la bandera `--decompile` al ejecutar el comando.
# Argumentos de línea de comandos
- `-i` - archivo o carpeta de entrada. Se puede omitir si se pasa la ruta de entrada como primer argumento.
- `-o` - ruta de salida. Si su ruta de entrada es una carpeta, esto no puede ser un archivo. Si no se especifica salida, el archivo .txt se colocará junto al archivo de entrada. Si la entrada es una carpeta y no se especifica salida, el programa creará un directorio "output" en el directorio de trabajo actual y colocará todos los archivos allí.
- La sidbase se carga desde `sidbase.bin` ubicado junto al ejecutable.
- `--no_decompile` - no emite código pseudo descompilado en un archivo .dcpl. El archivo se colocará junto al archivo .asm. Esto es falso por defecto.
- `--no_optimize` - no optimizar y limpiar el código dcpl. Implica la inserción en línea de llamadas a funciones, la eliminación de variables no utilizadas, la transformación de bucles for compatibles en bucles foreach, y la conversión de algunas cadenas if-else en expresiones match.
- `--pascal_case` - convierte los nombres de las funciones del juego a PascalCase en la salida dcpl, por ejemplo get-boolean -> GetBoolean.
- `--graphs` - genera archivos .svg que contienen gráficos de flujo de control para todas las funciones descompiladas. Cada archivo .bin obtiene su propia carpeta que contiene todos sus gráficos. Esto **ralentiza significativamente** la velocidad de descompilación, por lo que no se recomienda al descompilar un gran número de archivos al mismo tiempo.
- `--emit_once` - prohíbe que la misma estructura sea emitida dos veces en el desensamblado. Si una estructura aparece varias veces, solo la primera instancia se emitirá completamente, y todas las demás ocasiones serán reemplazadas por una etiqueta `ALREADY_EMITTED`. Esto puede reducir significativamente el tamaño del archivo.
- `-e` - realizar una edición. Más información en la sección siguiente.
- `--edit_file` - proporcionar un archivo de edición. Un archivo de edición contiene una edición por línea. Utiliza la misma sintaxis que la bandera -e.
# ¿Qué es un desensamblador?
Un [desensamblador](https://en.wikipedia.org/wiki/Disassembler) es una herramienta que lee instrucciones binarias (también conocido como [bytecode](https://en.wikipedia.org/wiki/Bytecode) o [código máquina](https://en.wikipedia.org/wiki/Machine_code)) y traduce cada una a una versión legible por humanos llamada [mnemónico](https://en.wikipedia.org/wiki/Assembly_language#Mnemonics). Los desensambladores generalmente no intentan interpretar mucho sobre el significado de estas instrucciones y simplemente las transforman 1-1 en sus versiones legibles. Por ejemplo, las instrucciones:```arm
15 00 00 00
4A 01 01 00
43 31 01 00
1C 00 00 01
se desmontan en las siguientes versiones legibles por humanos:```arm LookupPointer r0, 0 LoadStaticU64Imm r1, 1 Move r49, r1 CallFf r0, r0, 1
Todos los números en el bytecode están escritos en [hexadecimal](https://en.wikipedia.org/wiki/hexadecimal). La primera columna de cada fila representa el `opcode`, o el tipo de instrucción a ejecutar. La siguiente columna es el registro de destino, donde se almacenará el resultado de la operación. Las últimas dos columnas son los operandos 1 y 2, que son registros o números literales sobre los cuales se realizará la operación. No todas las instrucciones utilizan los 4 bytes, por ejemplo, la primera instrucción `LookupPointer` solo necesita un operando.