Importante
Nuestros repositorios en GitHub son principalmente para el desarrollo del proyecto y el seguimiento de problemas activos. La mayor parte de la información que encontrará aquí se refiere a la configuración del proyecto con fines de desarrollo y no es relevante para el usuario final.
Para obtener una guía de configuración sobre cómo instalar y jugar, hay el siguiente vídeo que puedes ver: https://youtu.be/K84UUMnkJc4
Si tiene preguntas o información adicional relacionada con el proyecto, tenemos un Discord para discutir aquí: https://discord.gg/VZbXMHXzWv
Además, puede encontrar más documentación y respuestas a preguntas frecuentes en el sitio web principal del proyecto: https://opengoal.dev
Advertencia
No utilices este proyecto de descompilación sin proporcionar tu propia copia del juego comprada legalmente. No distribuimos ningún activo del juego; debes utilizar tu propia copia del juego para PS2 obtenida legítimamente. Admitimos todas las versiones comerciales PAL, NTSC y NTSC-J, incluidas las copias de Greatest Hits.
goalc
decompiler
goal_src/
game
Este proyecto es portar el Jak and Daxter y el Jak II originales a PC. Más del 98% de los juegos están escritos en GOAL, un lenguaje Lisp personalizado desarrollado por Naughty Dog. Nuestra estrategia es:
Nuestros objetivos son:
Admitimos Linux y Windows en x86-64.
No admitimos ni planeamos admitir la arquitectura ARM. Esto significa que esto no se ejecutará en dispositivos como un dispositivo móvil.
Jak 1 se puede jugar en gran medida de principio a fin con un puñado de errores que se solucionan continuamente. Jak 2 está en desarrollo.
Lista de reproducción de YouTube: https://www.youtube.com/playlist?list=PLWx9T30aAT50cLnCTY1SAbt2TtWQzKfXX
Para ayudar con la descompilación, hemos creado un descompilador que puede procesar el código GOAL y descomprimir los recursos del juego. Especificamos manualmente los tipos de funciones y las ubicaciones donde creemos que el código original tenía conversiones de tipos (o donde lo consideran apropiado) hasta que el descompilador tenga éxito, luego limpiamos la salida del código descompilado agregando comentarios y ajustando el formato, luego lo guardamos en goal_src
.
Nuestro descompilador está diseñado específicamente para procesar la salida del compilador GOAL original. Como resultado, cuando se le dan conversiones correctas, a menudo produce código que puede introducirse directamente en un compilador y funciona perfectamente. Esto se prueba continuamente como parte de nuestras pruebas unitarias.
El resto de este README está dirigido a personas interesadas en construir el proyecto desde el origen, normalmente con la intención de contribuir como desarrollador.
Si esto no te parece familiar y solo quieres jugar, consulta la sección anterior Inicio rápido.
Los tres sistemas Linux son compatibles con Docker.
Elija su versión preferida de Linux compatible y cree la imagen elegida
docker build -f docker/(Arch|Fedora|Ubuntu)/Dockerfile -t jak .
Esto creará una imagen con todas las dependencias necesarias y ya creada.
docker run -v "$(pwd)"/build:/home/jak/jak-project/build -it jak bash
Nota: Si cambia el contenido del directorio build/
necesitará volver a ejecutar el comando build
. Alternativamente, puede obtener la compilación a través de docker cp
.
Esto vinculará su build/
carpeta a las imágenes para que pueda validar su compilación o probarla en un dispositivo externo.
Las imágenes de Docker se pueden vincular a su IDE (por ejemplo, CLion) para ayudar con la detección de códigos, el análisis estático, la ejecución de pruebas y la compilación continua.
Desafortunadamente, aún necesitarás Task Runner en tu máquina local para ejecutar el juego o, en su lugar, ejecutarlo manualmente mediante los comandos que se encuentran en Taskfile.yml
.
Instalar paquetes y repositorio de inicio:
sudo apt install gcc make cmake ninja-build build-essential g++ nasm clang-format libxrandr-dev libxinerama-dev libxcursor-dev libpulse-dev libxi-dev python libgl1-mesa-dev libssl-dev
sudo sh -c " $( curl --location https://taskfile.dev/install.sh ) " -- -d -b /usr/local/bin
Compilar:
cmake -B build && cmake --build build -j 8
Ejecutar pruebas:
./test.sh
Nota: hemos descubierto que clang
y lld
son significativamente más rápidos de compilar y vincular que gcc
, generan código más rápido y tienen mejores mensajes de advertencia. Para instalar estos:
sudo apt install lld clang
y ejecute cmake
(en un directorio de compilación nuevo) con:
cmake -DCMAKE_SHARED_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_EXE_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
Instalar paquetes y repositorio de inicio:
sudo pacman -S cmake libpulse base-devel nasm python libx11 libxrandr libxinerama libxcursor libxi
yay -S go-task
Solo para Arch, reemplace task
con go-task
en el resto de las instrucciones.
Compilar:
cmake -B build && cmake --build build -j 8
Ejecutar pruebas:
./test.sh
Instalar paquetes y repositorio de inicio:
sudo dnf install cmake python lld clang nasm libX11-devel libXrandr-devel libXinerama-devel libXcursor-devel libXi-devel pulseaudio-libs-devel mesa-libGL-devel
sudo sh -c " $( curl --location https://taskfile.dev/install.sh ) " -- -d -b /usr/local/bin
Compilar con clang
:
cmake -DCMAKE_SHARED_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_EXE_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -B build
cmake --build build -j $( nproc )
Ejecutar pruebas:
./test.sh
Utilizamos principalmente Visual Studio en Windows para el desarrollo en C++. Descargue la última edición comunitaria desde aquí. Al momento de escribir este artículo es Visual Studio 2022.
Necesitará la carga de trabajo Desktop development with C++
. Esto se puede seleccionar durante la instalación, o después a través del Visual Studio Installer
, modificando la instalación de Visual Studio.
En Windows, se recomienda utilizar un administrador de paquetes, nosotros usamos Scoop. Siga los pasos en la parte inferior de la página de inicio aquí para obtenerlo.
Una vez instalado Scoop, ejecute los siguientes comandos:
scoop install git llvm nasm python task
Clona el repositorio ejecutando el siguiente comando en la carpeta que elijas.
git clone https://github.com/open-goal/jak-project.git
Esto creará una carpeta jak-project
, abrirá el proyecto como un proyecto CMake a través de Visual Studio.
Luego, cree todo el proyecto como Windows Release (clang)
. También puede presionar Ctrl+Shift+B como tecla de acceso rápido para Construir todo. Actualmente preferimos clang
en Windows en lugar de msvc
, ¡aunque debería funcionar también!
NOTA: Para ejecutar el juego se requiere una Mac Apple Silicon con macOS Sequoia o una Mac Intel.
Asegúrese de tener instaladas las herramientas de línea de comandos de Xcode (esto instala cosas como Apple Clang). Si no lo hace, puede ejecutar el siguiente comando:
xcode-select --install
En Apple Silicon, también se debe instalar Rosetta 2:
softwareupdate --install-rosetta
brew install cmake nasm ninja go-task clang-format
cmake -B build --preset=Release-macos-x86_64-clang
cmake --build build --parallel $(( `sysctl - n hw.logicalcpu` ))
brew install cmake ninja go-task clang-format
cmake -B build --preset=Release-macos-arm64-clang
cmake --build build --parallel $(( `sysctl - n hw.logicalcpu` ))
Es posible que tengas que agregar el SDK de MacOS a tu LIBRARY_PATH
:
export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"
Si no desea o no puede utilizar Visual Studio para trabajar con el proyecto C++, VSCode es una buena alternativa.
Se recomienda la extensión clangd
y requiere que clangd
esté en su $PATH
. Si puedes ejecutar clangd
en una terminal con éxito, entonces deberías estar listo.
Una vez que genere su CMake por primera vez, el LSP clangd debería poder indexar el proyecto y brindarle inteligencia.
TODO: considere contribuir con documentación :)
Conseguir un juego terrestre implica 4 pasos:
Primero, configura tus ajustes para que los siguientes scripts sepan qué juego estás usando y qué versión. Para la versión de etiqueta negra del juego, ejecuta lo siguiente en una terminal:
task set-game-jak1
task set-decomp-ntscv1
Para otras versiones del juego, necesitarás usar un comando -set-decomp-<VERSION>
diferente. Un ejemplo para la versión PAL:
task set-game-jak1
task set-decomp-pal
Ejecute
task --list
para ver las otras opciones disponibles
En el momento de escribir este artículo, ¡solo se espera que Jak 1 funcione de un extremo a otro!
El primer paso es extraer el contenido del archivo ISO en la carpeta iso_data/<game-name>
. En el caso de Jak 1, esto es iso_data/jak1
.
Una vez hecho esto, abra una terminal en la carpeta jak-project
y ejecute lo siguiente:
task extract
El siguiente paso es construir el juego en sí. Para ello, en la misma terminal ejecuta lo siguiente:
task repl
Serás recibido con un mensaje como este:
_____ _____ _____ _____ __
| | ___ ___ ___ | __ | | _ | |
| | | . | -_ | | | | | | | | __
| _____ | _ | ___ | _ | _ | _____ | _____ | __ | __ | _____ |
| _ |
Welcome to OpenGOAL 0.8 !
Run (repl-help) for help with common commands and REPL usage.
Run (lt) to connect to the local target.
g >
Ejecute lo siguiente para construir el juego:
g > (mi)
¡NOTA IMPORTANTE! Si no estás utilizando la versión no predeterminada del juego, es posible que tengas problemas al intentar ejecutar
(mi)
en este paso. Un error de ejemplo podría incluir algo como:
Input file iso_data/jak1/MUS/TWEAKVAL.MUS does not exist.
Esto se debe a que las entradas/salidas del descompilador utilizan el campo JSON
gameName
en la configuración del descompilador. Por ejemplo, si está utilizando Jak 1 PAL, asumiráiso_data/jak1_pal
ydecompiler_out/jak1_pal
. Por lo tanto, puedes informar al REPL/compilador de esto a través del campo de configuracióngameVersionFolder
descrito aquí.
Finalmente se puede ejecutar el juego. Abra una segunda terminal desde el directorio jak-project
y ejecute lo siguiente:
task boot-game
El juego debería iniciarse automáticamente si todo se hizo correctamente.
Conectar el REPL al juego te permite inspeccionar y modificar códigos o datos mientras el juego se está ejecutando.
Para hacerlo, en REPL después de un (mi)
exitoso, ejecute lo siguiente:
g > (lt)
Si tiene éxito, su mensaje debería cambiar a:
gc >
Por ejemplo, al ejecutar lo siguiente se imprimirá información básica sobre Jak:
gc > * target *
También puedes iniciar el juego sin iniciar. Para hacerlo, ejecute lo siguiente en una terminal
task run-game
Y luego en su REPL ejecute lo siguiente (después de un (mi)
exitoso):
g > (lt)
[Listener] Socket connected established ! (took 0 tries). Waiting for version...
Got version 0.8 OK !
[Debugger] Context: valid = true, s7 = 0x147d24, base = 0x2123000000, tid = 2438049
gc > (lg)
10836466 # xa559f2 0.0000 ("game" "kernel")
gc > (test-play)
(play :use-vis # t :init-game #f) has been called!
0 # x0 0.0000 0
gc >
En la ventana de gráficos, puede usar la tecla de punto para abrir el menú de depuración. Los controladores también funcionan y utilizan el mismo mapeo que el juego original.
Consulte las carpetas pc_debug
, examples
y pc
en goal_src
para ver algunos ejemplos del código GOAL que escribimos. Los archivos de depuración que el motor no carga automáticamente tienen instrucciones sobre cómo ejecutarlos.
Hay cuatro componentes principales del proyecto.
goalc
: el compilador GOAL para x86-64decompiler
- nuestro descompiladorgoal_src/
- la carpeta que contiene todo el código OpenGOAL/GOOSgame
- también conocido como el tiempo de ejecución escrito en C++Analicemos cada componente.
goalc
Nuestra implementación de GOAL se llama OpenGOAL.
Todo el código fuente del compilador está en goalc/
. El compilador se controla a través de un mensaje que puede usarse para ingresar comandos para compilar, conectarse a un programa GOAL en ejecución para interactuar, ejecutar el depurador OpenGOAL o, si está conectado a un programa GOAL en ejecución, puede usarse como REPL para ejecutar código de forma interactiva. Además de compilar archivos de código, el compilador tiene funciones para empaquetar y crear archivos de datos.
Agnóstico del medio ambiente
Si ha instalado task
como se recomienda anteriormente, puede ejecutar el compilador con task repl
linux
Para ejecutar el compilador en Linux, existe un script scripts/shell/gc.sh
.
ventanas
En Windows, hay scripts/batch/gc.bat
y scripts/batch/gc-no-lt.bat
, el último de los cuales no intentará conectarse automáticamente a un objetivo en ejecución.
decompiler
El segundo componente del proyecto es el descompilador.
El descompilador generará código y otros datos destinados a ser inspeccionados por humanos en la carpeta decompiler_out
. El compilador no utilizará los archivos de esta carpeta.
Debes tener una copia del juego de PS2 y colocar todos los archivos del DVD dentro de una carpeta correspondiente al juego dentro de la carpeta iso_data
( jak1
para Jak 1 Black Label, etc.), como se ve en esta imagen:
El descompilador extraerá los activos a la carpeta de assets
. El compilador utilizará estos activos al crear el puerto y es posible que desee desactivar la extracción de activos después de ejecutarlo una vez.
Agnóstico del medio ambiente
Si ha instalado task
como se recomienda anteriormente, puede ejecutar el compilador con task decomp
linux
Para ejecutar, puede usar scripts/shell/decomp.sh
para ejecutar el descompilador
ventanas
Para ejecutar, puede usar scripts/shell/decomp-jak1.bat
para ejecutar el descompilador
goal_src/
El código fuente del juego, escrito en OpenGOAL, se encuentra en goal_src
. Todo el código GOAL y GOOS debe estar en esta carpeta.
game
El componente final es el "tiempo de ejecución", ubicado en game
. Esta es la parte del juego escrita en C++.
En el puerto, eso incluye:
game/kernel
. Esto debería ser lo más parecido posible al juego y todas las diferencias deberían anotarse con un comentario.game/sce
. Las implementaciones de funciones de biblioteca específicas para el puerto de PC se encuentran en game/system
.game/overlord
. Al igual que el kernel C, intentamos mantener esto lo más cerca posible del juego real.989SND
. El código para la biblioteca y una interfaz para ella se encuentran en game/sound
.game/graphics
. Si bien se tomarán muchas libertades para que esto funcione, el resultado final debería parecerse mucho al juego real.game/assets
. Estos incluyen archivos de texto adicionales, íconos, etc.