Важный
Наши репозитории на 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 and Daxter и Jak II на ПК. Более 98% игр написаны на GOAL — специальном языке Lisp, разработанном Naughty Dog. Наша стратегия:
Наши цели:
Мы поддерживаем как Linux, так и Windows на x86-64.
Мы не поддерживаем и не планируем поддерживать архитектуру ARM. Это означает, что это не будет работать на таких устройствах, как мобильное устройство.
В Jak 1 в основном можно играть от начала до конца, но есть несколько ошибок, которые постоянно исправляются. Як 2 находится в разработке.
Плейлист YouTube: 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
В основном мы используем Visual Studio в Windows для разработки на 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
, откройте проект как проект CMake через Visual Studio.
Затем соберите весь проект как Windows Release (clang)
. Вы также можете нажать Ctrl+Shift+B в качестве горячей клавиши для «Построить все». В настоящее время мы предпочитаем clang
в Windows, а не msvc
, хотя он тоже должен работать!
ПРИМЕЧАНИЕ. Для запуска игры требуется Apple Silicon Mac под управлением macOS Sequoia или 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 сможет проиндексировать проект и предоставить вам 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
. Поэтому вы можете сообщить об этом REPL/компилятору через поле конфигурацииgameVersionFolder
описанное здесь.
Наконец-то игру можно запустить. Откройте второй терминал из каталога jak-project
и запустите следующее:
task boot-game
Игра должна загрузиться автоматически, если все было сделано правильно.
Подключение REPL к игре позволяет вам проверять и изменять код или данные во время работы игры.
Для этого в REPL после успешного выполнения (mi)
выполните следующее:
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 >
В графическом окне вы можете использовать клавишу точки, чтобы вызвать меню отладки. Контроллеры также работают, используя то же отображение, что и в оригинальной игре.
Посмотрите папки pc_debug
, examples
и pc
в goal_src
где вы найдете примеры кода GOAL, который мы написали. Файлы отладки, которые не загружаются движком автоматически, содержат инструкции по их запуску.
Проект состоит из четырех основных компонентов.
goalc
— компилятор GOAL для x86-64.decompiler
- наш декомпиляторgoal_src/
— папка, содержащая весь код OpenGOAL/GOOSgame
— она же среда выполнения, написанная на 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
( jak1
для Jak 1 Black Label и т. д.), как показано на этом рисунке:
Декомпилятор извлечет ресурсы в папку 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
. Реализации функций библиотеки, специфичные для порта ПК, расположены в файле game/system
.game/overlord
. Как и в случае с ядром C, мы стараемся максимально приблизить его к реальной игре.989SND
. Код библиотеки и интерфейс для нее находятся в файле game/sound
.game/graphics
. Несмотря на то, что для выполнения этой работы потребуется много вольности, конечный результат должен очень точно соответствовать реальной игре.game/assets
. К ним относятся дополнительные текстовые файлы, значки и т. д.