重要
GitHub 上のリポジトリは、主にプロジェクトの開発と現在進行中の問題の追跡を目的としています。ここで見つかる情報のほとんどは、開発目的でのプロジェクトの設定に関するものであり、エンドユーザーには関係ありません。
ゲームをインストールしてプレイする方法に関するセットアップ ガイドについては、次のビデオをご覧ください: https://youtu.be/K84UUMnkJc4
プロジェクトに関する質問や追加情報については、ディスカッション用の Discord をここに用意しています: https://discord.gg/VZbXMHXzWv
さらに、プロジェクトのメイン Web サイト (https://opengoal.dev) で、詳細なドキュメントとよくある質問への回答を見つけることができます。
警告
合法的に購入したゲームのコピーを独自に提供せずに、この逆コンパイル プロジェクトを使用しないでください。私たちはゲームのアセットを配布しません。あなたは自分で合法的に入手したゲームの PS2 コピーを使用する必要があります。当社は、グレイテスト ヒッツのコピーを含む、あらゆる小売 PAL、NTSC、および NTSC-J ビルドをサポートしています。
goalc
decompiler
goal_src/
game
ランタイムこのプロジェクトは、オリジナルの Jak と Daxter および Jak II を PC に移植するものです。ゲームの 98% 以上は、Naughty Dog によって開発されたカスタム Lisp 言語である GOAL で書かれています。私たちの戦略は次のとおりです。
私たちの目標は次のとおりです。
Linux と x86-64 上の Windows の両方をサポートします。
ARM アーキテクチャはサポートしていないか、サポートする予定はありません。これは、モバイル デバイスなどのデバイスでは実行できないことを意味します。
Jak 1 は最初から最後までほぼプレイ可能ですが、いくつかのバグは継続的に修正されています。 Jak 2 は開発中です。
YouTube プレイリスト: https://www.youtube.com/playlist?list=PLWx9T30aAT50cLnCTY1SAbt2TtWQzKfXX
逆コンパイルを支援するために、GOAL コードを処理してゲーム アセットを解凍できる逆コンパイラーを構築しました。逆コンパイラーが成功するまで、元のコードに型キャストがあったと思われる (または適切だと思われる) 関数の型と位置を手動で指定します。その後、コメントを追加して書式を調整して逆コンパイルされたコードの出力をクリーンアップし、 goal_src
に保存します。 。
当社の逆コンパイラは、オリジナルの GOAL コンパイラの出力を処理するために特別に設計されています。その結果、正しいキャストを指定すると、多くの場合、コンパイラに直接入力して完全に動作するコードが生成されます。これは単体テストの一部として継続的にテストされます。
この README の残りの部分は、通常は開発者として貢献することを目的として、ソースからプロジェクトを構築することに興味がある人々を対象としています。
これが気に入らない、ただゲームをプレイしたいだけの場合は、上記の「クイック スタート」セクションを参照してください。
3 つの Linux システムはすべて、Docker を使用してサポートされています。
サポートされている Linux の優先フレーバーを選択し、選択したイメージを構築します
docker build -f docker/(Arch|Fedora|Ubuntu)/Dockerfile -t jak .
これにより、必要な依存関係がすべて含まれ、すでにビルドされているイメージが作成されます。
docker run -v "$(pwd)"/build:/home/jak/jak-project/build -it jak bash
注: build/
ディレクトリの内容を変更した場合は、 build
コマンドを再実行する必要があります。あるいは、 docker cp
経由でビルドを取得することもできます。
これにより、 build/
フォルダーがイメージにリンクされるため、ビルドを検証したり、外部デバイスでテストしたりできるようになります。
Docker イメージを IDE (CLion など) にリンクすると、コードスニッフィング、静的分析、テストの実行、継続的ビルドに役立ちます。
残念ながら、ゲームを実行するにはローカル マシン上にタスク ランナーが必要ですが、代わりにTaskfile.yml
にあるコマンドを使用して手動でゲームを実行する必要があります。
パッケージと初期リポジトリをインストールします。
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
コンパイル:
cmake -B build && cmake --build build -j 8
テストを実行します。
./test.sh
注: clang
とlld
、 gcc
よりもコンパイルとリンクが大幅に速く、より高速なコードを生成し、より適切な警告メッセージを表示することがわかりました。これらをインストールするには:
sudo apt install lld clang
そして、次のようにしてcmake
(新しいビルド ディレクトリで) を実行します。
cmake -DCMAKE_SHARED_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_EXE_LINKER_FLAGS= " -fuse-ld=lld " -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
パッケージと初期リポジトリをインストールします。
sudo pacman -S cmake libpulse base-devel nasm python libx11 libxrandr libxinerama libxcursor libxi
yay -S go-task
Arch の場合のみ、残りの手順でtask
go-task
に置き換えます。
コンパイル:
cmake -B build && cmake --build build -j 8
テストを実行します。
./test.sh
パッケージと初期リポジトリをインストールします。
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
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 )
テストを実行します。
./test.sh
C++ 開発には主に Windows 上の Visual Studio を使用します。最新のコミュニティ エディションをここからダウンロードします。この記事の執筆時点では、これは Visual Studio 2022 です。
Desktop development with C++
必要になります。これは、インストール中、またはVisual Studio Installer
を介して Visual Studio インストールを変更した後に選択できます。
Windows では、パッケージ マネージャーを使用することをお勧めします。Scoop を使用します。ホームページの下部にある手順に従って入手してください。
Scoop をインストールしたら、次のコマンドを実行します。
scoop install git llvm nasm python task
選択したフォルダーで次のコマンドを実行して、リポジトリのクローンを作成します。
git clone https://github.com/open-goal/jak-project.git
これにより、 jak-project
フォルダーが作成され、Visual Studio 経由でプロジェクトを CMake プロジェクトとして開きます。
次に、プロジェクト全体をWindows Release (clang)
としてビルドします。 Ctrl+Shift+B をすべてビルドのホットキーとして押すこともできます。現在、Windows ではmsvc
ではなくclang
好んでいますが、同様に動作するはずです。
注: ゲームを実行するには、macOS Sequoia を実行している Apple Silicon Mac、または Intel Mac が必要です。
Xcode コマンド ライン ツールがインストールされていることを確認します (これにより、Apple Clang などがインストールされます)。そうでない場合は、次のコマンドを実行できます。
xcode-select --install
Apple Silicon では、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` ))
MacOS SDK をLIBRARY_PATH
に追加する必要がある場合があります。
export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"
C++ プロジェクトの操作に Visual Studio を使用したくない、または使用できない場合は、代わりに VSCode が適しています。
clangd
拡張機能が推奨されますが、これにはclangd
$PATH
上にある必要があります。ターミナルでclangd
正常に実行できれば、問題なく実行できます。
初めて CMake を生成すると、clangd LSP がプロジェクトのインデックスを作成し、インテリセンスを提供できるようになります。
TODO - ドキュメントへの貢献を検討してください :)
ゲームを実行するには、次の 4 つの手順を実行します。
まず、次のスクリプトが使用しているゲームとバージョンを認識できるように設定をセットアップします。ゲームのブラック ラベル バージョンの場合は、ターミナルで次のコマンドを実行します。
task set-game-jak1
task set-decomp-ntscv1
ゲームの他のバージョンの場合は、別の-set-decomp-<VERSION>
コマンドを使用する必要があります。 PAL バージョンの例:
task set-game-jak1
task set-decomp-pal
task --list
実行して、他の利用可能なオプションを確認します。
この記事の執筆時点では、Jak 1 のみがエンドツーエンドで動作すると予想されています。
最初のステップは、ISO ファイルの内容をiso_data/<game-name>
フォルダーに抽出することです。 Jak 1 の場合、これはiso_data/jak1
です。
これが完了したら、 jak-project
フォルダーでターミナルを開き、次のコマンドを実行します。
task extract
次のステップは、ゲーム自体を構築することです。これを行うには、同じターミナルで次のコマンドを実行します。
task repl
次のようなプロンプトが表示されます。
_____ _____ _____ _____ __
| | ___ ___ ___ | __ | | _ | |
| | | . | -_ | | | | | | | | __
| _____ | _ | ___ | _ | _ | _____ | _____ | __ | __ | _____ |
| _ |
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 >
次のコマンドを実行してゲームをビルドします。
g > (mi)
重要な注意事項!ゲームのデフォルト以外のバージョンを使用していない場合は、この手順
(mi)
を実行しようとすると問題が発生する可能性があります。エラーの例には次のようなものが含まれます。
Input file iso_data/jak1/MUS/TWEAKVAL.MUS does not exist.
これは、逆コンパイラーが逆コンパイラー構成の
gameName
JSON フィールドを使用して入出力を行うためです。たとえば、Jak 1 PAL を使用している場合は、iso_data/jak1_pal
およびdecompiler_out/jak1_pal
を想定します。したがって、ここで説明されているgameVersionFolder
設定フィールドを介して REPL/コンパイラーにこれを通知できます。
ようやくゲームを実行できるようになります。 jak-project
ディレクトリから 2 番目のターミナルを開き、次のコマンドを実行します。
task boot-game
すべてが正しく行われた場合、ゲームは自動的に起動するはずです。
REPL をゲームに接続すると、ゲームの実行中にコードやデータを検査および変更できます。
これを行うには、 (mi)
が成功した後の REPL で次のコマンドを実行します。
g > (lt)
成功すると、プロンプトは次のように変更されます。
gc >
たとえば、次を実行すると、Jak に関するいくつかの基本情報が出力されます。
gc > * target *
起動せずにゲームを起動することもできます。これを行うには、1 つのターミナルで次を実行します
task run-game
そして、REPL で次のコマンドを実行します ( (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 >
グラフィックス ウィンドウでは、ピリオド キーを使用してデバッグ メニューを表示できます。コントローラーも、元のゲームと同じマッピングを使用して機能します。
私たちが作成した GOAL コードの例については、 goal_src
の下にあるpc_debug
、 examples
、およびpc
フォルダーを確認してください。エンジンによって自動的にロードされないデバッグ ファイルには、その実行方法に関する指示が含まれています。
このプロジェクトには 4 つの主要なコンポーネントがあります。
goalc
- x86-64 用の GOAL コンパイラdecompiler
- 私たちの逆コンパイラgoal_src/
- すべての OpenGOAL / GOOS コードを含むフォルダーgame
- 別名 C++ で書かれたランタイム各コンポーネントを分解してみましょう。
goalc
GOAL の実装は OpenGOAL と呼ばれます。
すべてのコンパイラのソース コードは、 goalc/
にあります。コンパイラは、コンパイルするコマンドを入力したり、対話のために実行中の GOAL プログラムに接続したり、OpenGOAL デバッガを実行したりするために使用できるプロンプトを通じて制御されます。また、実行中の GOAL プログラムに接続している場合は、REPL として使用して、コードを対話的に実行します。コード ファイルのコンパイルに加えて、コンパイラにはデータ ファイルをパックしてビルドする機能もあります。
環境に依存しない
上記の推奨に従ってtask
をインストールした場合は、 task repl
を使用してコンパイラを実行できます。
Linux
Linux でコンパイラを実行するには、 scripts/shell/gc.sh
スクリプトがあります。
窓
Windows には、 scripts/batch/gc.bat
スクリプトとscripts/batch/gc-no-lt.bat
スクリプトがあり、後者は実行中のターゲットに自動的に接続しようとしません。
decompiler
プロジェクトの 2 番目のコンポーネントは逆コンパイラーです。
逆コンパイラーは、人間による検査を目的としたコードおよびその他のデータをdecompiler_out
フォルダーに出力します。このフォルダー内のファイルはコンパイラーでは使用されません。
次の図に示すように、PS2 ゲームのコピーを用意し、DVD のすべてのファイルをiso_data
フォルダー内のゲームに対応するフォルダー (Jak 1 Black Label の場合はjak1
など) 内に配置する必要があります。
逆コンパイラーは、アセットをassets
フォルダーに抽出します。これらのアセットは、ポートを構築するときにコンパイラによって使用されるため、一度実行した後はアセット抽出をオフにすることができます。
環境に依存しない
上記の推奨に従ってtask
をインストールした場合は、 task decomp
を使用してコンパイラを実行できます。
Linux
実行するには、 scripts/shell/decomp.sh
使用して逆コンパイラーを実行できます。
窓
実行するには、 scripts/shell/decomp-jak1.bat
使用して逆コンパイラーを実行できます。
goal_src/
OpenGOAL で書かれたゲームのソース コードは、 goal_src
にあります。すべての GOAL および GOOS コードはこのフォルダーにある必要があります。
game
ランタイム最後のコンポーネントは、 game
にある「ランタイム」です。これは、C++ で書かれたゲームの部分です。
ポートには以下が含まれます。
game/kernel
フォルダー内にあります。これはできる限りゲームに近いものにする必要があり、相違点はすべてコメントで指摘する必要があります。game/sce
にあります。 PC ポートに固有のライブラリ機能の実装は、 game/system
にあります。game/overlord
にあります。 C カーネルと同様に、これを実際のゲームにできる限り近づけるように努めています。989SND
というサウンド用のサードパーティ ライブラリを使用しました。ライブラリのコードとそのインターフェイスはgame/sound
にあります。game/graphics
にあります。この機能を実現するために多くの自由が取られますが、最終結果は実際のゲームに非常に近いものになるはずです。game/assets
にあります。これらには、追加のテキスト ファイル、アイコンなどが含まれます。