重要的
我們在 GitHub 上的儲存庫主要用於專案開發和追蹤活躍問題。您在這裡找到的大部分資訊都與出於開發目的而設定專案有關,與最終用戶無關。
有關如何安裝和玩遊戲的設定指南,您可以觀看以下影片:https://youtu.be/K84UUMnkJc4
對於與該項目有關的問題或其他信息,我們在這裡有一個 Discord 可供討論:https://discord.gg/VZbXMHXzWv
此外,您可以在專案的主網站上找到更多文件和常見問題:https://opengoal.dev
警告
在未提供您自己合法購買的遊戲副本的情況下,請勿使用此反編譯項目。我們不會分發遊戲中的任何資產 - 您必須使用您自己合法獲得的遊戲 PS2 副本。我們支援每個零售 PAL、NTSC 和 NTSC-J 版本,包括 Greatest Hits 副本。
goalc
decompiler
goal_src/
game
運行時間該專案是將原始的 Jak 和 Daxter 以及 Jak II 移植到 PC 上。超過 98% 的遊戲都是用 GOAL 編寫的,GOAL 是 Naughty Dog 開發的一種客製化 Lisp 語言。我們的策略是:
我們的目標是:
我們在 x86-64 上支援 Linux 和 Windows。
我們不支援、也不計劃支援 ARM 架構。這意味著這不會在行動裝置等裝置上運作。
《Jak 1》從頭到尾基本上都可以玩,但有一些錯誤不斷解決。 Jak 2 正在開發中。
YouTube 播放清單:https://www.youtube.com/playlist?list=PLWx9T30aAT50cLnCTY1SAbt2TtWQzKfXX
為了幫助反編譯,我們建立了一個反編譯器,可以處理 GOAL 程式碼並解壓縮遊戲資源。我們手動指定函數類型和我們認為原始程式碼進行類型轉換的位置(或他們認為合適的位置),直到反編譯器成功,然後我們透過新增註解和調整格式來清理反編譯程式碼的輸出,然後將其儲存在goal_src
中。
我們的反編譯器是專門為處理原始 GOAL 編譯器的輸出而設計的。因此,當給出正確的轉換時,它通常會產生可以直接輸入編譯器並完美運行的程式碼。這是我們單元測試的一部分,不斷進行測試。
本自述文件的其餘部分面向有興趣從原始碼建立專案的人們,通常旨在作為開發人員做出貢獻。
如果這聽起來不像您,而您只是想玩遊戲,請參閱上面的“快速入門”部分
所有三個 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
我們主要使用 Windows 上的 Visual Studio 進行 C++ 開發。從這裡下載最新的社群版本。在撰寫本文時,這是 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 上的clang
而不是msvc
,儘管它應該也能運作!
注意:運行遊戲需要運行 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"
如果您不想或無法使用 Visual Studio 處理 C++ 項目,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
目錄開啟第二個終端機並執行以下命令:
task boot-game
如果一切都正確完成,遊戲應該會自動啟動。
將 REPL 連接到遊戲可讓您在遊戲執行時檢查和修改程式碼或資料。
為此,在成功(mi)
後的 REPL 中,執行以下命令:
g > (lt)
如果成功,您的提示應更改為:
gc >
例如,執行以下命令將列印有關 Jak 的一些基本資訊:
gc > * target *
您也可以在不啟動的情況下啟動遊戲。為此,請在一個終端機中執行以下命令
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_src
下的pc_debug
、 examples
和pc
資料夾,以了解我們編寫的 GOAL 程式碼的一些範例。引擎不會自動載入的偵錯檔案包含有關如何運行它們的說明。
該項目有四個主要組成部分。
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
這個專案的第二個元件是反編譯器。
反編譯器將在decompiler_out
資料夾中輸出供人類檢查的程式碼和其他資料。編譯器不會使用此資料夾中的檔案。
您必須擁有 PS2 遊戲的副本,並將 DVD 中的所有檔案放入iso_data
資料夾中與遊戲對應的資料夾中( jak1
表示 Jak 1 Black Label 等),如下圖所示:
反編譯器會將資源提取到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
中。其中包括額外的文字檔案、圖標等。