สำคัญ
พื้นที่เก็บข้อมูลของเราบน 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 ดั้งเดิมไปยังพีซี เกมมากกว่า 98% เขียนด้วย GOAL ซึ่งเป็นภาษา Lisp แบบกำหนดเองที่พัฒนาโดย Naughty Dog กลยุทธ์ของเราคือ:
วัตถุประสงค์ของเราคือ:
เรารองรับทั้ง Linux และ Windows บน x86-64
เราไม่สนับสนุนหรือวางแผนที่จะสนับสนุนสถาปัตยกรรม ARM ซึ่งหมายความว่าสิ่งนี้จะไม่ทำงานบนอุปกรณ์เช่นอุปกรณ์มือถือ
Jak 1 สามารถเล่นได้เป็นส่วนใหญ่ตั้งแต่ต้นจนจบโดยมีจุดบกพร่องจำนวนหนึ่งที่ถูกแก้ไขอย่างต่อเนื่อง Jak 2 อยู่ระหว่างการพัฒนา
เพลย์ลิสต์ YouTube: https://www.youtube.com/playlist?list=PLWx9T30aAT50cLnCTY1SAbt2TtWQzKfXX
เพื่อช่วยในการถอดรหัส เราได้สร้างโปรแกรมถอดรหัสที่สามารถประมวลผลโค้ด GOAL และแยกเนื้อหาของเกมได้ เราระบุประเภทฟังก์ชันและตำแหน่งด้วยตนเองโดยที่เราเชื่อว่าโค้ดต้นฉบับมีประเภทการแปลง (หรือตำแหน่งที่รู้สึกว่าเหมาะสม) จนกว่าโปรแกรมถอดรหัสจะสำเร็จ จากนั้นเราจะล้างข้อมูลเอาต์พุตของโค้ดที่ถอดรหัสแล้วโดยเพิ่มความคิดเห็นและปรับการจัดรูปแบบ จากนั้นบันทึกไว้ใน goal_src
.
ตัวถอดรหัสของเราได้รับการออกแบบมาโดยเฉพาะสำหรับการประมวลผลเอาต์พุตของคอมไพเลอร์ GOAL ดั้งเดิม ด้วยเหตุนี้ เมื่อได้รับการแคสต์ที่ถูกต้อง มักจะสร้างโค้ดที่สามารถป้อนเข้าคอมไพเลอร์ได้โดยตรงและทำงานได้อย่างสมบูรณ์แบบ โดยมีการทดสอบอย่างต่อเนื่องโดยเป็นส่วนหนึ่งของการทดสอบหน่วยของเรา
ส่วนที่เหลือของ README นี้มีไว้สำหรับผู้ที่สนใจสร้างโครงการจากแหล่งที่มา โดยทั่วไปมีความตั้งใจที่จะมีส่วนร่วมในฐานะนักพัฒนา
หากฟังดูไม่เหมือนคุณและคุณเพียงต้องการเล่นเกม โปรดดูส่วนเริ่มต้นด่วนด้านบน
Linux ทั้งสามระบบรองรับโดยใช้ Docker
เลือกลินุกซ์ที่คุณต้องการรองรับและสร้างอิมเมจที่คุณเลือก
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) เพื่อช่วยในการสแกนโค้ด การวิเคราะห์แบบสแตติก การทดสอบรัน และการสร้างอย่างต่อเนื่อง
น่าเสียดายที่คุณยังต้องใช้ Task Runner บนเครื่องของคุณเพื่อรันเกม หรือรันเกมด้วยตนเองผ่านคำสั่งที่พบใน 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
(ในไดเร็กทอรี build ใหม่) ด้วย:
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++ ดาวน์โหลด Community Edition ล่าสุดได้จากที่นี่ ในขณะที่เขียนนี่คือ 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 เป็นปุ่มลัดสำหรับ Build All ได้ด้วย ขณะนี้เราชอบ 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 ควรจะสามารถจัดทำดัชนีโครงการและให้สติปัญญาแก่คุณได้
สิ่งที่ต้องทำ - พิจารณาการบริจาคเอกสาร :)
การเล่นเกมที่กำลังดำเนินอยู่นั้นมี 4 ขั้นตอน:
ขั้นแรก ตั้งค่าการตั้งค่าของคุณเพื่อให้สคริปต์ต่อไปนี้ทราบว่าคุณกำลังใช้เกมใดและเวอร์ชันใด สำหรับเกมเวอร์ชัน black label ให้รันสิ่งต่อไปนี้ในเทอร์มินัล:
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 ของคุณให้รันสิ่งต่อไปนี้ (หลังจาก a Success (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-64decompiler
- ถอดรหัสของเรา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 และวางไฟล์ทั้งหมดจากดีวีดีไว้ในโฟลเดอร์ที่เกี่ยวข้องกับเกมภายในโฟลเดอร์ 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
การใช้งานฟีเจอร์ไลบรารีเฉพาะสำหรับพอร์ต PC จะอยู่ใน game/system
game/overlord
เช่นเดียวกับเคอร์เนล C เราพยายามทำให้สิ่งนี้ใกล้เคียงกับเกมจริงมากที่สุด989SND
รหัสสำหรับไลบรารีและอินเทอร์เฟซสำหรับไลบรารีนั้นอยู่ใน game/sound
game/graphics
แม้ว่าเราจะต้องใช้เสรีภาพมากมายในการทำงานนี้ แต่ผลลัพธ์ที่ได้ก็ควรจะตรงกับเกมจริงมากgame/assets
ซึ่งรวมถึงไฟล์ข้อความพิเศษ ไอคอน ฯลฯ