Important
Nos référentiels sur GitHub sont principalement destinés au développement du projet et au suivi des problèmes actifs. La plupart des informations que vous trouverez ici concernent la configuration du projet à des fins de développement et ne sont pas pertinentes pour l'utilisateur final.
Pour un guide de configuration sur la façon d'installer et de jouer au jeu, vous pouvez consulter la vidéo suivante : https://youtu.be/K84UUMnkJc4
Pour des questions ou des informations supplémentaires concernant le projet, nous avons un Discord pour discuter ici : https://discord.gg/VZbXMHXzWv
De plus, vous pouvez trouver de la documentation supplémentaire et des réponses aux questions fréquemment posées sur le site Web principal du projet : https://opengoal.dev
Avertissement
N'utilisez pas ce projet de décompilation sans fournir votre propre copie du jeu achetée légalement. Nous ne distribuons aucun élément du jeu - vous devez utiliser votre propre copie PS2 du jeu légitimement obtenue. Nous prenons en charge toutes les versions PAL, NTSC et NTSC-J vendues au détail, y compris les copies Greatest Hits.
goalc
decompiler
goal_src/
game
Ce projet consiste à porter les Jak et Daxter et Jak II originaux sur PC. Plus de 98 % des jeux sont écrits en GOAL, un langage Lisp personnalisé développé par Naughty Dog. Notre stratégie est la suivante :
Nos objectifs sont :
Nous prenons en charge Linux et Windows sur x86-64.
Nous ne prenons pas en charge, ou prévoyons de prendre en charge, l'architecture ARM. Cela signifie que cela ne fonctionnera pas sur des appareils tels qu'un appareil mobile.
Jak 1 est largement jouable du début à la fin avec une poignée de bugs qui sont continuellement corrigés. Jak 2 est en développement.
Liste de lecture YouTube : https://www.youtube.com/playlist?list=PLWx9T30aAT50cLnCTY1SAbt2TtWQzKfXX
Pour faciliter la décompilation, nous avons créé un décompilateur capable de traiter le code GOAL et de décompresser les ressources du jeu. Nous spécifions manuellement les types de fonctions et les emplacements où nous pensons que le code d'origine avait des conversions de type (ou là où ils semblent appropriés) jusqu'à ce que le décompilateur réussisse, puis nous nettoyons la sortie du code décompilé en ajoutant des commentaires et en ajustant le formatage, puis nous l'enregistrons dans goal_src
.
Notre décompilateur est conçu spécifiquement pour traiter la sortie du compilateur GOAL d'origine. En conséquence, lorsqu’il est correctement converti, il produit souvent du code qui peut être directement introduit dans un compilateur et fonctionne parfaitement. Ceci est continuellement testé dans le cadre de nos tests unitaires.
Le reste de ce README s'adresse aux personnes intéressées par la construction du projet à partir des sources, généralement avec l'intention de contribuer en tant que développeur.
Si cela ne vous ressemble pas et que vous souhaitez simplement jouer au jeu, reportez-vous à la section Démarrage rapide ci-dessus.
Les trois systèmes Linux sont pris en charge à l'aide de Docker.
Choisissez votre version préférée de Linux et créez l'image de votre choix
docker build -f docker/(Arch|Fedora|Ubuntu)/Dockerfile -t jak .
Cela créera une image avec toutes les dépendances requises et déjà construite.
docker run -v "$(pwd)"/build:/home/jak/jak-project/build -it jak bash
Remarque : Si vous modifiez le contenu du répertoire build/
vous devrez réexécuter la commande build
. Vous pouvez également obtenir la version via docker cp
.
Cela reliera votre dossier build/
aux images afin de pouvoir valider votre build ou le tester sur un périphérique externe.
Les images Docker peuvent être liées à votre IDE (par exemple CLion) pour faciliter le reniflage de codes, l'analyse statique, l'exécution de tests et la construction continue.
Malheureusement, vous aurez toujours besoin d'un exécuteur de tâches sur votre ordinateur local pour exécuter le jeu ou, à la place, exécutez manuellement le jeu via les commandes trouvées dans Taskfile.yml
.
Installez les packages et le référentiel d'initialisation :
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
Compiler:
cmake -B build && cmake --build build -j 8
Exécutez des tests :
./test.sh
Remarque : nous avons constaté que clang
et lld
sont nettement plus rapides à compiler et à lier que gcc
, génèrent du code plus rapidement et ont de meilleurs messages d'avertissement. Pour les installer :
sudo apt install lld clang
et exécutez cmake
(dans un nouveau répertoire de build) avec :
cmake -DCMAKE_SHARED_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_EXE_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
Installez les packages et le référentiel d'initialisation :
sudo pacman -S cmake libpulse base-devel nasm python libx11 libxrandr libxinerama libxcursor libxi
yay -S go-task
Pour Arch uniquement, remplacez task
par go-task
dans le reste des instructions.
Compiler:
cmake -B build && cmake --build build -j 8
Exécutez des tests :
./test.sh
Installez les packages et le référentiel d'initialisation :
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
Compiler avec 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 )
Exécutez des tests :
./test.sh
Nous utilisons principalement Visual Studio sur Windows pour le développement C++. Téléchargez la dernière édition communautaire à partir d'ici. Au moment de la rédaction, il s’agit de Visual Studio 2022.
Vous aurez besoin du Desktop development with C++
. Cela peut être sélectionné lors de l'installation, ou après via Visual Studio Installer
, en modifiant l'installation de Visual Studio.
Sous Windows, il est recommandé d'utiliser un gestionnaire de packages, nous utilisons Scoop. Suivez les étapes au bas de la page d'accueil ici pour l'obtenir.
Une fois Scoop installé, exécutez les commandes suivantes :
scoop install git llvm nasm python task
Clonez le référentiel en exécutant la commande suivante dans le dossier de votre choix.
git clone https://github.com/open-goal/jak-project.git
Cela créera un dossier jak-project
, ouvrira le projet en tant que projet CMake via Visual Studio.
Créez ensuite l'intégralité du projet en tant que Windows Release (clang)
. Vous pouvez également appuyer sur Ctrl+Shift+B comme raccourci clavier pour tout construire. Nous préférons actuellement clang
sous Windows plutôt que msvc
, même si cela devrait également fonctionner !
REMARQUE : L'exécution du jeu nécessite un Mac Apple Silicon exécutant macOS Sequoia ou un Mac Intel.
Assurez-vous que les outils de ligne de commande Xcode sont installés (cela installe des éléments comme Apple Clang). Si ce n'est pas le cas, vous pouvez exécuter la commande suivante :
xcode-select --install
Sur Apple Silicon, Rosetta 2 doit également être installé :
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` ))
Vous devrez peut-être ajouter le SDK MacOS à votre LIBRARY_PATH
:
export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"
Si vous ne souhaitez pas ou ne pouvez pas utiliser Visual Studio pour travailler avec le projet C++, VSCode est une bonne alternative.
L'extension clangd
est recommandée et nécessite que clangd
soit sur votre $PATH
. Si vous parvenez à exécuter clangd
dans un terminal avec succès, vous devriez être prêt à partir.
Une fois que vous avez généré votre CMake pour la première fois, le LSP clangd devrait être capable d'indexer le projet et de vous donner Intellisense.
À FAIRE - Envisagez de contribuer à la documentation :)
Obtenir un jeu en cours d'exécution implique 4 étapes :
Tout d’abord, configurez vos paramètres afin que les scripts suivants sachent quel jeu vous utilisez et quelle version. Pour la version en marque noire du jeu, exécutez ce qui suit dans un terminal :
task set-game-jak1
task set-decomp-ntscv1
Pour les autres versions du jeu, vous devrez utiliser une autre commande -set-decomp-<VERSION>
. Un exemple pour la version PAL :
task set-game-jak1
task set-decomp-pal
Exécutez
task --list
pour voir les autres options disponibles
Au moment de la rédaction de cet article, seul Jak 1 devrait fonctionner de bout en bout !
La première étape consiste à extraire le contenu de votre fichier ISO dans le dossier iso_data/<game-name>
. Dans le cas de Jak 1, il s'agit iso_data/jak1
.
Une fois cela fait, ouvrez un terminal dans le dossier jak-project
et exécutez ce qui suit :
task extract
La prochaine étape consiste à créer le jeu lui-même. Pour ce faire, dans le même terminal, exécutez ce qui suit :
task repl
Vous serez accueilli par une invite comme celle-ci :
_____ _____ _____ _____ __
| | ___ ___ ___ | __ | | _ | |
| | | . | -_ | | | | | | | | __
| _____ | _ | ___ | _ | _ | _____ | _____ | __ | __ | _____ |
| _ |
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 >
Exécutez ce qui suit pour créer le jeu :
g > (mi)
REMARQUE IMPORTANTE ! Si vous n'utilisez pas la version autre que celle par défaut du jeu, vous risquez de rencontrer des problèmes en essayant d'exécuter
(mi)
à cette étape. Un exemple d'erreur pourrait inclure quelque chose comme :
Input file iso_data/jak1/MUS/TWEAKVAL.MUS does not exist.
En effet, les entrées/sorties du décompilateur utilisent le champ
gameName
JSON dans la configuration du décompilateur. Par exemple, si vous utilisez Jak 1 PAL, il supposeraiso_data/jak1_pal
etdecompiler_out/jak1_pal
. Par conséquent, vous pouvez en informer le REPL/compilateur via le champ de configurationgameVersionFolder
décrit ici
Le jeu peut enfin être lancé. Ouvrez un deuxième terminal à partir du répertoire jak-project
et exécutez ce qui suit :
task boot-game
Le jeu devrait démarrer automatiquement si tout a été fait correctement.
Connecter le REPL au jeu vous permet d'inspecter et de modifier du code ou des données pendant que le jeu est en cours d'exécution.
Pour ce faire, dans le REPL après un (mi)
réussi, exécutez ce qui suit :
g > (lt)
En cas de succès, votre invite devrait devenir :
gc >
Par exemple, exécuter ce qui suit affichera des informations de base sur Jak :
gc > * target *
Vous pouvez également démarrer le jeu sans démarrer. Pour ce faire, exécutez ce qui suit dans un seul terminal
task run-game
Et puis dans votre REPL, exécutez ce qui suit (après un (mi)
réussi) :
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 >
Dans la fenêtre graphique, vous pouvez utiliser la touche point pour afficher le menu de débogage. Les contrôleurs fonctionnent également, utilisant le même mappage que le jeu original.
Consultez les dossiers pc_debug
, examples
et pc
sous goal_src
pour quelques exemples de code GOAL que nous avons écrit. Les fichiers de débogage qui ne sont pas chargés automatiquement par le moteur contiennent des instructions sur la manière de les exécuter.
Le projet comporte quatre composantes principales.
goalc
- le compilateur GOAL pour x86-64decompiler
- notre décompilateurgoal_src/
- le dossier contenant tout le code OpenGOAL / GOOSgame
- alias le runtime écrit en C++Décomposons chaque composant.
goalc
Notre implémentation de GOAL s'appelle OpenGOAL.
Tout le code source du compilateur est dans goalc/
. Le compilateur est contrôlé via une invite qui peut être utilisée pour saisir des commandes pour compiler, se connecter à un programme GOAL en cours d'exécution pour interagir, exécuter le débogueur OpenGOAL ou, si vous êtes connecté à un programme GOAL en cours d'exécution, peut être utilisé comme REPL pour exécuter du code de manière interactive. En plus de compiler des fichiers de code, le compilateur dispose de fonctionnalités permettant de regrouper et de créer des fichiers de données.
Indépendant de l’environnement
Si vous avez installé task
comme recommandé ci-dessus, vous pouvez exécuter le compilateur avec task repl
Linux
Pour exécuter le compilateur sous Linux, il existe un script scripts/shell/gc.sh
.
Fenêtres
Sous Windows, il existe un script scripts/batch/gc.bat
et un script scripts/batch/gc-no-lt.bat
, ce dernier ne tentant pas de s'attacher automatiquement à une cible en cours d'exécution.
decompiler
Le deuxième composant du projet est le décompilateur.
Le décompilateur produira du code et d'autres données destinées à être inspectées par des humains dans le dossier decompiler_out
. Les fichiers de ce dossier ne seront pas utilisés par le compilateur.
Vous devez avoir une copie du jeu PS2 et placer tous les fichiers du DVD dans un dossier correspondant au jeu dans le dossier iso_data
( jak1
pour Jak 1 Black Label, etc.), comme le montre cette image :
Le décompilateur extraira les actifs dans le dossier assets
. Ces actifs seront utilisés par le compilateur lors de la création du port, et vous souhaiterez peut-être désactiver l'extraction des actifs après l'avoir exécutée une fois.
Indépendant de l’environnement
Si vous avez installé task
comme recommandé ci-dessus, vous pouvez exécuter le compilateur avec task decomp
Linux
Pour exécuter, vous pouvez utiliser scripts/shell/decomp.sh
pour exécuter le décompilateur
Fenêtres
Pour exécuter, vous pouvez utiliser scripts/shell/decomp-jak1.bat
pour exécuter le décompilateur
goal_src/
Le code source du jeu, écrit en OpenGOAL, se trouve dans goal_src
. Tout le code GOAL et GOOS doit être dans ce dossier.
game
Le dernier composant est le "runtime", situé dans game
. C'est la partie du jeu écrite en C++.
Au port, cela comprend :
game/kernel
. Cela doit être aussi proche que possible du jeu, et toutes les différences doivent être notées avec un commentaire.game/sce
. Les implémentations des fonctionnalités de la bibliothèque spécifiques au port PC se trouvent dans game/system
.game/overlord
. Comme pour le noyau C, nous essayons de garder cela aussi proche que possible du jeu réel.989SND
. Le code de la bibliothèque et son interface se trouvent dans game/sound
.game/graphics
. Même si de nombreuses libertés seront prises pour que cela fonctionne, le résultat final devrait être très proche du jeu réel.game/assets
. Ceux-ci incluent des fichiers texte supplémentaires, des icônes, etc.