중요한
GitHub의 리포지토리는 주로 프로젝트 개발 및 활성 문제 추적을 위한 것입니다. 여기에서 찾을 수 있는 대부분의 정보는 개발 목적으로 프로젝트를 설정하는 것과 관련이 있으며 최종 사용자와는 관련이 없습니다.
게임 설치 및 플레이 방법에 대한 설정 가이드는 다음 비디오에서 확인하실 수 있습니다: https://youtu.be/K84UUMnkJc4
프로젝트와 관련된 질문이나 추가 정보가 있는 경우 여기 Discord에서 논의하세요: https://discord.gg/VZbXMHXzWv
또한 프로젝트의 기본 웹사이트인 https://opengoal.dev에서 추가 문서와 자주 묻는 질문 에 대한 답변을 찾을 수 있습니다.
경고
합법적으로 구매한 게임 사본을 제공하지 않고 이 디컴파일 프로젝트를 사용하지 마십시오. 우리는 게임의 어떤 자산도 배포하지 않습니다. 귀하는 합법적으로 획득한 PS2 게임 사본을 사용해야 합니다. Greatest Hits 사본을 포함하여 모든 소매 PAL, NTSC 및 NTSC-J 빌드를 지원합니다.
goalc
decompiler
goal_src/
game
런타임 이 프로젝트는 원본 Jak, Daxter 및 Jak II를 PC로 포팅하는 것입니다. 게임의 98% 이상이 Naughty Dog에서 개발한 맞춤형 Lisp 언어인 GOAL로 작성되었습니다. 우리의 전략은 다음과 같습니다:
우리의 목표는 다음과 같습니다:
우리는 x86-64에서 Linux와 Windows를 모두 지원합니다.
우리는 ARM 아키텍처를 지원하지 않으며 지원할 계획도 없습니다. 즉, 모바일 장치와 같은 장치에서는 실행되지 않습니다.
Jak 1은 지속적으로 해결되고 있는 몇 가지 버그로 인해 처음부터 끝까지 플레이가 가능합니다. Jak 2가 개발 중입니다.
유튜브 재생목록: https://www.youtube.com/playlist?list=PLWx9T30aAT50cLnCTY1SAbt2TtWQzKfXX
디컴파일을 돕기 위해 GOAL 코드를 처리하고 게임 자산의 압축을 풀 수 있는 디컴파일러를 구축했습니다. 디컴파일러가 성공할 때까지 원래 코드에 유형 캐스트가 있다고 생각되는 함수 유형과 위치(또는 적절하다고 생각되는 위치)를 수동으로 지정한 다음 주석을 추가하고 형식을 조정하여 디컴파일된 코드의 출력을 정리한 다음 goal_src
에 저장합니다. .
우리의 디컴파일러는 원래 GOAL 컴파일러의 출력을 처리하기 위해 특별히 설계되었습니다. 결과적으로 올바른 캐스트가 제공되면 컴파일러에 직접 공급될 수 있고 완벽하게 작동하는 코드가 생성되는 경우가 많습니다. 이는 단위 테스트의 일부로 지속적으로 테스트됩니다.
이 README의 나머지 부분은 일반적으로 개발자로서 기여하려는 의도로 소스에서 프로젝트를 구축하는 데 관심이 있는 사람들을 대상으로 합니다.
이것이 귀하에게 해당되지 않고 단지 게임을 플레이하고 싶은 경우 위의 빠른 시작 섹션을 참조하십시오.
세 가지 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를 누를 수도 있습니다. 현재 우리는 msvc
대신 Windows에서 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` ))
LIBRARY_PATH
에 MacOS SDK를 추가해야 할 수도 있습니다.
export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"
C++ 프로젝트 작업에 Visual Studio를 사용하고 싶지 않거나 사용할 수 없는 경우 VSCode가 좋은 대안입니다.
clangd
확장이 권장되며 clangd
$PATH
에 있어야 합니다. 터미널에서 clangd
성공적으로 실행할 수 있다면 잘 진행된 것입니다.
처음으로 CMake를 생성하면 clangd LSP가 프로젝트를 색인화하고 intellisense를 제공할 수 있어야 합니다.
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 코드의 몇 가지 예를 보려면 pc_debug
, examples
및 goal_src
아래의 pc
폴더를 확인하세요. 엔진에 의해 자동으로 로드되지 않는 디버그 파일에는 실행 방법에 대한 지침이 있습니다.
프로젝트에는 네 가지 주요 구성 요소가 있습니다.
goalc
- x86-64용 GOAL 컴파일러decompiler
- 우리의 디컴파일러goal_src/
- 모든 OpenGOAL / GOOS 코드가 포함된 폴더game
- C++로 작성된 런타임이라고도 함각 구성요소를 분해해 보겠습니다.
goalc
GOAL 구현을 OpenGOAL이라고 합니다.
모든 컴파일러 소스 코드는 goalc/
에 있습니다. 컴파일러는 컴파일 명령을 입력하고, 상호 작용을 위해 실행 중인 GOAL 프로그램에 연결하고, OpenGOAL 디버거를 실행하는 데 사용할 수 있는 프롬프트를 통해 제어됩니다. 또는 실행 중인 GOAL 프로그램에 연결된 경우 REPL로 사용할 수 있습니다. 코드를 대화형으로 실행합니다. 코드 파일을 컴파일하는 것 외에도 컴파일러에는 데이터 파일을 압축하고 빌드하는 기능이 있습니다.
환경에 구애받지 않음
위에서 권장한 대로 task
설치한 경우 task repl
사용하여 컴파일러를 실행할 수 있습니다.
리눅스
Linux에서 컴파일러를 실행하려면 scripts/shell/gc.sh
스크립트가 있습니다.
윈도우
Windows에는 scripts/batch/gc.bat
스크립트와 scripts/batch/gc-no-lt.bat
스크립트가 있는데, 후자는 실행 중인 대상에 자동으로 연결을 시도하지 않습니다.
decompiler
프로젝트의 두 번째 구성 요소는 디컴파일러입니다.
디컴파일러는 사람이 검사할 코드와 기타 데이터를 decompiler_out
폴더에 출력합니다. 이 폴더의 파일은 컴파일러에서 사용되지 않습니다.
이 그림에 표시된 대로 PS2 게임 사본이 있어야 하며 DVD의 모든 파일을 iso_data
폴더 내 게임에 해당하는 폴더(Jak 1 Black Label의 경우 jak1
등)에 넣어야 합니다.
디컴파일러는 assets
폴더에 자산을 추출합니다. 이러한 자산은 포트를 빌드할 때 컴파일러에서 사용되며, 한 번 실행한 후 자산 추출을 끌 수 있습니다.
환경에 구애받지 않음
위에서 권장한 대로 task
설치한 경우 task decomp
사용하여 컴파일러를 실행할 수 있습니다.
리눅스
실행하려면 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
에 있는 어떤 방식으로든 포트에서 사용되는 추가 자산입니다. 여기에는 추가 텍스트 파일, 아이콘 등이 포함됩니다.