Wichtig
Unsere Repositories auf GitHub dienen in erster Linie der Entwicklung des Projekts und der Verfolgung aktiver Probleme. Die meisten Informationen, die Sie hier finden, beziehen sich auf die Einrichtung des Projekts für Entwicklungszwecke und sind für den Endbenutzer nicht relevant.
Eine Setup-Anleitung zur Installation und zum Spielen des Spiels finden Sie im folgenden Video: https://youtu.be/K84UUMnkJc4
Für Fragen oder zusätzliche Informationen zum Projekt haben wir hier einen Discord zur Diskussion: https://discord.gg/VZbXMHXzWv
Darüber hinaus finden Sie weitere Dokumentation und Antworten auf häufig gestellte Fragen auf der Hauptwebsite des Projekts: https://opengoal.dev
Warnung
Verwenden Sie dieses Dekompilierungsprojekt nicht, ohne Ihre eigene, legal erworbene Kopie des Spiels bereitzustellen. Wir verteilen keine Vermögenswerte aus dem Spiel – Sie müssen Ihre eigene, rechtmäßig erworbene PS2-Kopie des Spiels verwenden. Wir unterstützen alle im Einzelhandel erhältlichen PAL-, NTSC- und NTSC-J-Builds, einschließlich Greatest Hits-Kopien.
goalc
decompiler
goal_src/
game
Bei diesem Projekt geht es darum, die Originalversionen von Jak and Daxter und Jak II auf den PC zu portieren. Über 98 % der Spiele sind in GOAL geschrieben, einer von Naughty Dog entwickelten benutzerdefinierten Lisp-Sprache. Unsere Strategie ist:
Unsere Ziele sind:
Wir unterstützen sowohl Linux als auch Windows auf x86-64.
Wir unterstützen die ARM-Architektur nicht und planen auch nicht, sie zu unterstützen. Dies bedeutet, dass dies nicht auf Geräten wie einem mobilen Gerät ausgeführt werden kann.
Jak 1 ist weitgehend von Anfang bis Ende spielbar, mit ein paar Fehlern, die kontinuierlich behoben werden. Jak 2 ist in der Entwicklung.
YouTube-Playlist: https://www.youtube.com/playlist?list=PLWx9T30aAT50cLnCTY1SAbt2TtWQzKfXX
Um die Dekompilierung zu erleichtern, haben wir einen Dekompilierer entwickelt, der GOAL-Code verarbeiten und Spielinhalte entpacken kann. Wir geben manuell Funktionstypen und Speicherorte an, an denen wir glauben, dass der ursprüngliche Code Typumwandlungen hatte (oder wo sie angemessen erscheinen), bis der Dekompiler erfolgreich ist. Anschließend bereinigen wir die Ausgabe des dekompilierten Codes, indem wir Kommentare hinzufügen und die Formatierung anpassen, und speichern ihn dann in goal_src
.
Unser Dekompiler ist speziell für die Verarbeitung der Ausgabe des ursprünglichen GOAL-Compilers konzipiert. Bei korrekter Umwandlung entsteht daher häufig Code, der direkt in einen Compiler eingespeist werden kann und einwandfrei funktioniert. Dies wird im Rahmen unserer Unit-Tests kontinuierlich überprüft.
Der Rest dieser README-Datei richtet sich an Personen, die daran interessiert sind, das Projekt aus dem Quellcode zu erstellen, typischerweise mit der Absicht, als Entwickler einen Beitrag zu leisten.
Wenn das nicht nach Ihnen klingt und Sie das Spiel einfach nur spielen möchten, lesen Sie den obigen Abschnitt „Schnellstart“.
Alle drei Linux-Systeme werden mit Docker unterstützt.
Wählen Sie Ihre unterstützte bevorzugte Linux-Variante und erstellen Sie das gewünschte Image
docker build -f docker/(Arch|Fedora|Ubuntu)/Dockerfile -t jak .
Dadurch wird ein Image mit allen erforderlichen Abhängigkeiten erstellt und bereits erstellt.
docker run -v "$(pwd)"/build:/home/jak/jak-project/build -it jak bash
Hinweis: Wenn Sie den Inhalt des Verzeichnisses build/
ändern, müssen Sie den build
-Befehl erneut ausführen. Alternativ können Sie den Build auch über docker cp
erhalten.
Dadurch wird Ihr build/
-Ordner mit den Bildern verknüpft, sodass Sie Ihren Build validieren oder auf einem externen Gerät testen können.
Docker-Images können mit Ihrer IDE (z. B. CLion) verknüpft werden, um beim Codesniffing, der statischen Analyse, der Ausführung von Tests und der kontinuierlichen Erstellung zu helfen.
Leider benötigen Sie weiterhin den Task Runner auf Ihrem lokalen Computer, um das Spiel auszuführen, oder führen Sie das Spiel stattdessen manuell über die Befehle in Taskfile.yml
aus.
Pakete und Init-Repository installieren:
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
Kompilieren:
cmake -B build && cmake --build build -j 8
Führen Sie Tests durch:
./test.sh
Hinweis: Wir haben festgestellt, dass clang
und lld
deutlich schneller zu kompilieren und zu verknüpfen sind als gcc
, schnelleren Code generieren und bessere Warnmeldungen haben. Um diese zu installieren:
sudo apt install lld clang
und führen Sie cmake
(in einem neuen Build-Verzeichnis) aus mit:
cmake -DCMAKE_SHARED_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_EXE_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
Pakete und Init-Repository installieren:
sudo pacman -S cmake libpulse base-devel nasm python libx11 libxrandr libxinerama libxcursor libxi
yay -S go-task
Nur für Arch: Ersetzen Sie in den restlichen Anweisungen task
durch go-task
.
Kompilieren:
cmake -B build && cmake --build build -j 8
Führen Sie Tests durch:
./test.sh
Pakete und Init-Repository installieren:
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
Mit clang
kompilieren:
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 )
Führen Sie Tests durch:
./test.sh
Wir verwenden hauptsächlich Visual Studio unter Windows für die C++-Entwicklung. Laden Sie hier die neueste Community-Ausgabe herunter. Zum Zeitpunkt des Schreibens ist dies Visual Studio 2022.
Sie benötigen den Workload Desktop development with C++
. Dies kann während der Installation oder nachträglich über den Visual Studio Installer
ausgewählt werden, um die Visual Studio-Installation zu ändern.
Unter Windows empfiehlt sich die Verwendung eines Paketmanagers, wir nutzen Scoop. Befolgen Sie die Schritte unten auf der Homepage, um es zu erhalten.
Führen Sie nach der Installation von Scoop die folgenden Befehle aus:
scoop install git llvm nasm python task
Klonen Sie das Repository, indem Sie den folgenden Befehl im Ordner Ihrer Wahl ausführen.
git clone https://github.com/open-goal/jak-project.git
Dadurch wird ein Ordner jak-project
erstellt und das Projekt als CMake-Projekt über Visual Studio geöffnet.
Erstellen Sie dann das gesamte Projekt als Windows Release (clang)
. Sie können auch Strg+Umschalt+B als Hotkey für „Alle erstellen“ drücken. Wir bevorzugen derzeit clang
unter Windows gegenüber msvc
, obwohl es auch funktionieren sollte!
HINWEIS: Zum Ausführen des Spiels ist ein Apple Silicon Mac mit macOS Sequoia oder ein Intel Mac erforderlich.
Stellen Sie sicher, dass Sie Xcode-Befehlszeilentools installiert haben (dadurch werden Dinge wie Apple Clang installiert). Wenn Sie dies nicht tun, können Sie den folgenden Befehl ausführen:
xcode-select --install
Auf Apple Silicon muss außerdem Rosetta 2 installiert sein:
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` ))
Möglicherweise müssen Sie das MacOS SDK zu Ihrem LIBRARY_PATH
hinzufügen:
export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"
Wenn Sie Visual Studio nicht für die Arbeit mit dem C++-Projekt verwenden möchten oder können, ist VSCode eine gute Alternative.
Die clangd
Erweiterung wird empfohlen und erfordert, dass sich clangd
in Ihrem $PATH
befindet. Wenn Sie clangd
erfolgreich in einem Terminal ausführen können, sollte es losgehen.
Sobald Sie Ihr CMake zum ersten Mal generieren, sollte der Clangd-LSP in der Lage sein, das Projekt zu indizieren und Ihnen Intellisense zu geben.
TODO – Erwägen Sie, Dokumentation beizutragen :)
Um ein laufendes Spiel zu bekommen, sind 4 Schritte erforderlich:
Richten Sie zunächst Ihre Einstellungen ein, damit die folgenden Skripte wissen, welches Spiel Sie verwenden und welche Version. Führen Sie für die Black-Label-Version des Spiels Folgendes in einem Terminal aus:
task set-game-jak1
task set-decomp-ntscv1
Für andere Versionen des Spiels müssen Sie einen anderen Befehl -set-decomp-<VERSION>
verwenden. Ein Beispiel für die PAL-Version:
task set-game-jak1
task set-decomp-pal
Führen Sie
task --list
aus, um die anderen verfügbaren Optionen anzuzeigen
Zum Zeitpunkt des Verfassens dieses Artikels wird erwartet, dass nur Jak 1 durchgängig funktioniert!
Der erste Schritt besteht darin, den Inhalt Ihrer ISO-Datei in den Ordner iso_data/<game-name>
zu extrahieren. Im Fall von Jak 1 ist dies iso_data/jak1
.
Sobald dies erledigt ist, öffnen Sie ein Terminal im Ordner jak-project
und führen Sie Folgendes aus:
task extract
Der nächste Schritt besteht darin, das Spiel selbst zu erstellen. Führen Sie dazu im selben Terminal Folgendes aus:
task repl
Sie werden mit einer Eingabeaufforderung wie dieser begrüßt:
_____ _____ _____ _____ __
| | ___ ___ ___ | __ | | _ | |
| | | . | -_ | | | | | | | | __
| _____ | _ | ___ | _ | _ | _____ | _____ | __ | __ | _____ |
| _ |
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 >
Führen Sie Folgendes aus, um das Spiel zu erstellen:
g > (mi)
WICHTIGER HINWEIS! Wenn Sie nicht die nicht standardmäßige Version des Spiels verwenden, kann es bei der Ausführung von
(mi)
in diesem Schritt zu Problemen kommen. Ein Beispielfehler könnte etwa Folgendes umfassen:
Input file iso_data/jak1/MUS/TWEAKVAL.MUS does not exist.
Dies liegt daran, dass die Eingaben/Ausgaben des Dekompilers das JSON-Feld „
gameName
in der Dekompilerkonfiguration verwenden. Wenn Sie beispielsweise Jak 1 PAL verwenden, werdeniso_data/jak1_pal
unddecompiler_out/jak1_pal
angenommen. Daher können Sie den REPL/Compiler über das hier beschriebenegameVersionFolder
-Konfigurationsfeld darüber informieren
Endlich kann das Spiel ausgeführt werden. Öffnen Sie ein zweites Terminal aus dem jak-project
Verzeichnis und führen Sie Folgendes aus:
task boot-game
Das Spiel sollte automatisch starten, wenn alles richtig gemacht wurde.
Wenn Sie die REPL mit dem Spiel verbinden, können Sie Code oder Daten überprüfen und ändern, während das Spiel läuft.
Führen Sie dazu in der REPL nach einem erfolgreichen (mi)
Folgendes aus:
g > (lt)
Bei Erfolg sollte sich Ihre Eingabeaufforderung wie folgt ändern:
gc >
Wenn Sie beispielsweise Folgendes ausführen, werden einige grundlegende Informationen über Jak ausgedruckt:
gc > * target *
Sie können das Spiel auch ohne Booten starten. Führen Sie dazu Folgendes in einem Terminal aus
task run-game
Und führen Sie dann in Ihrem REPL Folgendes aus (nach einem erfolgreichen (mi)
):
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 >
Im Grafikfenster können Sie mit der Punkttaste das Debug-Menü aufrufen. Controller funktionieren ebenfalls und verwenden die gleiche Zuordnung wie im Originalspiel.
Schauen Sie sich die Ordner pc_debug
, examples
und pc
unter goal_src
an, um einige Beispiele für den von uns geschriebenen GOAL-Code zu finden. Die Debugdateien, die nicht automatisch von der Engine geladen werden, enthalten Anweisungen zu deren Ausführung.
Das Projekt besteht aus vier Hauptkomponenten.
goalc
– der GOAL-Compiler für x86-64decompiler
– unser Dekompilergoal_src/
– der Ordner, der den gesamten OpenGOAL/GOOS-Code enthältgame
– auch bekannt als die in C++ geschriebene LaufzeitLassen Sie uns jede Komponente aufschlüsseln.
goalc
Unsere Implementierung von GOAL heißt OpenGOAL.
Der gesamte Compiler-Quellcode befindet sich in goalc/
. Der Compiler wird über eine Eingabeaufforderung gesteuert, mit der Sie Befehle zum Kompilieren eingeben, eine Verbindung zu einem laufenden GOAL-Programm zur Interaktion herstellen, den OpenGOAL-Debugger ausführen oder, wenn Sie mit einem laufenden GOAL-Programm verbunden sind, als REPL verwendet werden können Code interaktiv ausführen. Zusätzlich zum Kompilieren von Codedateien verfügt der Compiler über Funktionen zum Packen und Erstellen von Datendateien.
Umweltunabhängig
Wenn Sie task
wie oben empfohlen installiert haben, können Sie den Compiler mit task repl
ausführen
Linux
Um den Compiler unter Linux auszuführen, gibt es ein Skript scripts/shell/gc.sh
.
Windows
Unter Windows gibt es ein scripts/batch/gc.bat
-Skript und ein scripts/batch/gc-no-lt.bat
Skript. Letzteres versucht nicht, automatisch eine Verbindung zu einem laufenden Ziel herzustellen.
decompiler
Die zweite Komponente des Projekts ist der Dekompiler.
Der Dekompiler gibt Code und andere Daten, die von Menschen überprüft werden sollen, im Ordner decompiler_out
aus. Dateien in diesem Ordner werden vom Compiler nicht verwendet.
Sie müssen über eine Kopie des PS2-Spiels verfügen und alle Dateien von der DVD in einem Ordner ablegen, der dem Spiel im Ordner iso_data
entspricht ( jak1
für Jak 1 Black Label usw.), wie in diesem Bild dargestellt:
Der Dekompiler extrahiert Assets in den assets
-Ordner. Diese Assets werden vom Compiler beim Erstellen des Ports verwendet. Möglicherweise möchten Sie die Asset-Extraktion deaktivieren, nachdem Sie sie einmal ausgeführt haben.
Umweltunabhängig
Wenn Sie task
wie oben empfohlen installiert haben, können Sie den Compiler mit task decomp
ausführen
Linux
Zum Ausführen können Sie scripts/shell/decomp.sh
verwenden, um den Dekompiler auszuführen
Windows
Zum Ausführen können Sie scripts/shell/decomp-jak1.bat
verwenden, um den Dekompiler auszuführen
goal_src/
Der in OpenGOAL geschriebene Quellcode des Spiels befindet sich in goal_src
. Der gesamte GOAL- und GOOS-Code sollte sich in diesem Ordner befinden.
game
Die letzte Komponente ist die „Laufzeit“, die sich im game
befindet. Dies ist der Teil des Spiels, der in C++ geschrieben ist.
Dazu gehören im Hafen:
game/kernel
. Dies sollte möglichst nah am Spiel sein und alle Unterschiede sollten mit einem Kommentar vermerkt werden.game/sce
. Implementierungen von Bibliotheksfunktionen, die speziell für den PC-Port gelten, finden Sie in game/system
.game/overlord
. Wie beim C-Kernel versuchen wir, diesen so nah wie möglich am eigentlichen Spiel zu halten.989SND
. Code für die Bibliothek und eine Schnittstelle dafür finden Sie in game/sound
.game/graphics
. Auch wenn man sich viele Freiheiten nimmt, damit dies funktioniert, sollte das Endergebnis dem tatsächlichen Spiel sehr nahe kommen.game/assets
befinden. Dazu gehören zusätzliche Textdateien, Symbole usw.