- เวอร์ชันที่พอร์ตมาสำหรับ PlayStation (PSX) โดยเฉพาะ โดยอิงจากโปรเจกต์ Super Mario 64 decompilation สำหรับ Nintendo 64
- มีการปรับแก้ขนานใหญ่ให้เข้ากับฮาร์ดแวร์ PS1 เช่น รองรับแรงสั่น DualShock, แปลงคณิตศาสตร์เป็น fixed-point, และ ปรับแต่งการเรนเดอร์
- เพิ่มฟีเจอร์ปรับปรุงประสิทธิภาพอย่าง ตัวพรีโปรเซสกราฟิก, การบีบอัดเท็กซ์เจอร์, และ การเพิ่มประสิทธิภาพหน่วยความจำของแอนิเมชัน
- ยังมีบั๊กที่ทราบอยู่จำนวนมาก เช่น การควบคุมกล้องที่ยังไม่สมบูรณ์, ปัญหาการชนและแครช, และ ไม่สามารถบิลด์เพลงได้
- เป็นการทดลอง พอร์ตข้ามแพลตฟอร์ม ของเกมคลาสสิกที่มีความหมายต่อการพัฒนาเครื่องคอนโซลรุ่นเก่าและงานวิจัยด้าน reverse engineering
ภาพรวมโปรเจกต์
- โค้ดนี้เป็นฟอร์กของเวอร์ชัน decompilation เต็มรูปแบบของ Super Mario 64 (J/U/E/SH) โดยรองรับเฉพาะ PSX และ PC (สำหรับดีบัก) เท่านั้น
- ไม่รองรับการบิลด์สำหรับ Nintendo 64 อีกต่อไป
- ปัจจุบันบิลด์ได้เฉพาะ ROM เวอร์ชันสหรัฐฯ (US)
- การบิลด์เกมไม่ได้รวมแอสเซ็ตต้นฉบับมาให้ และจำเป็นต้อง แตกแอสเซ็ตจาก ROM ของแท้
ฟีเจอร์หลัก
- เพิ่มกราฟิก DualShock™ compatible เพื่อเลียนแบบข้อความ “Rumble Pak Compatible” แบบต้นฉบับ
- รองรับทั้ง สัญญาณแรงสั่นแบบอนาล็อกสำหรับมอเตอร์ขนาดใหญ่ของ DualShock และ สัญญาณดิจิทัลสำหรับมอเตอร์ขนาดเล็ก
- ใช้ ซอฟต์ฟลอตความแม่นยำต่ำ สำหรับ PSX เพื่อลดผลกระทบด้านประสิทธิภาพจากการคำนวณ floating-point
- แทนที่โค้ดด้วย คณิตศาสตร์แบบ fixed-point และใช้เวกเตอร์/เมทริกซ์จำนวนเต็ม 16 บิตซึ่งเป็นมาตรฐานของ PSX
- ปรับให้ง่ายขึ้นและเขียนใหม่สำหรับ render graph walker
- ใช้ การแบ่งหลายเหลี่ยม (สูงสุด 2 เท่า) เพื่อลดปัญหาของโพลิกอนขนาดใหญ่
- แปลง RSP display list เป็นฟอร์แมตแบบกำหนดเองด้วยวิธี JIT เพื่อเพิ่มความเร็วในการประมวลผล
- ใช้ display list preprocessor เพื่อตัดคำสั่งที่ไม่จำเป็นและปรับเมชให้เหมาะสม
- บีบอัดแอนิเมชันของ Mario (580,632 → 190,324 ไบต์) และวางไว้ใน VRAM โดยตรง
- เพิ่ม profiler แบบกำหนดเอง และ ตัวเข้ารหัสเท็กซ์เจอร์ 4bpp
- แทนที่ด้วย เงาทรงหกเหลี่ยม โดยคำนึงถึงข้อจำกัดด้านความโปร่งใสของ PSX
- (วางแผน) การหมุนกล้องด้วยอนาล็อกสติกขวา และ การเขียนระบบย่อย Goddard ใหม่
ปัญหาที่ทราบ
- ต้นไม้ลอยได้, บางแอนิเมชันไม่ทำงานหรือทำให้แครช
- ไม่สามารถบิลด์เพลงได้, เอฟเฟกต์เสียงหายหรือเสียงเพี้ยน
- การควบคุมกล้องยังไม่สมบูรณ์, แครชเมื่อเข้าเลเวลบางจุด
- โหลดฉากจบไม่สำเร็จ, Lakitu ไม่ปรากฏ, เสาใช้งานไม่ได้
- เวลาโหลดนานจากการโหลดเท็กซ์เจอร์แยกชิ้น, เท็กซ์เจอร์บิดเบี้ยวจากข้อจำกัดของ PSX
- ตัวพรีโปรเซสกราฟิกยังต้องปรับปรุง, บางเท็กซ์เจอร์เรนเดอร์ผิดพลาด, หน้าจอไตเติลยังไม่เสร็จ, เมนูหยุดเกมไม่ทำงาน
วิธีบิลด์
Linux
- ติดตั้ง toolchain
mipsel-none-elf-gcc แล้วโคลนรีโพซิทอรี
- วางไฟล์
baserom.us.z64 ไว้ที่ไดเรกทอรีราก
- (ไม่บังคับ) เพิ่มไฟล์ซาวด์แทร็ก
.wav (0~37) ในโฟลเดอร์ .local
- เมื่อรัน
make จะสร้างอิมเมจ ISO (build/us_psx/sm64.us.iso)
- เวอร์ชันเบนช์มาร์ก (
make BENCH=1) จะสร้างเฉพาะ ELF/EXE โดยไม่มี ISO และต้องใช้ PSX RAM 8MB
Windows (ยังไม่ยืนยัน)
- ติดตั้ง MSYS2 แล้วตั้งค่าแพ็กเกจ
mingw-w64
- ติดตั้ง
mipsel-none-elf-gcc และโคลนรีโพซิทอรี sm64-psx
- วางไฟล์
baserom.us.z64 แล้วรัน make
- ไฟล์ผลลัพธ์จากการบิลด์จะถูกสร้างในพาธเดียวกับบน Linux
การแก้ปัญหา
- หาก ไม่รู้จัก gcc ให้ตรวจสอบว่าเปิดใช้งานสภาพแวดล้อม MSYS2 ถูกต้องหรือไม่
- หาก ไม่พบ
baserom.us.z64 ให้ตรวจสอบตำแหน่งไฟล์
- หาก ไม่พบ Makefile ให้ตรวจสอบพาธของไดเรกทอรี
- หาก เกิดข้อผิดพลาดของแพ็กเกจ ให้อัปเดตด้วย
pacman -Syu และ pacman -Su
- การตรวจสอบว่า mipsel gcc ทำงานได้หรือไม่ ให้ใช้คำสั่ง
mipsel-none-elf-gcc -v
- เมื่อต้องสลับแพลตฟอร์ม ต้องคอมไพล์เครื่องมือใหม่ด้วย
make -C tools clean
โครงสร้างโปรเจกต์
actors: พฤติกรรมอ็อบเจ็กต์, geo layout, display list
assets: แอนิเมชันและข้อมูลเดโม
src: ซอร์ส C หลักของเกม (เสียง, เอนจิน, เกม, เมนู, พอร์ต ฯลฯ)
textures, text, levels: ข้อมูลกราฟิกและเลเวล
tools: เครื่องมือสำหรับบิลด์
lib: รวมโค้ด N64 SDK
การมีส่วนร่วม
- ยินดีรับ Pull Request
- แนะนำให้ เปิด Issue แล้วหารือ ก่อนทำการเปลี่ยนแปลงสำคัญ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ถ้าคุณชอบพอร์ตนี้ น่าจะสนใจโปรเจ็กต์ที่นำ SM64 มาสร้างใหม่ทั้งหมดบน GBAด้วย
ดูวิดีโอ YouTube
บทความที่เกี่ยวข้อง: The Impossible Port – Super Mario 64 on the Game Boy Advance
N64 ก็น่าจะเข้ากันได้ดีเหมือนกัน และสักวันก็อยากหา SummerCart64 มาลองเล่นดู
ถึงอย่างนั้นการทำจนเสร็จได้ก็น่าทึ่งจริงๆ
นี่เป็นความสำเร็จที่น่าทึ่งมาก
ผมเคยมีทั้งสองคอนโซลมาก่อน และพอเห็นพอร์ตนี้ก็ยิ่งรู้สึกอีกครั้งว่า N64 ในปี 1996 ถ่ายทอดอารมณ์แบบ**‘SGI ในบ้าน’ได้ดีแค่ไหน
ผมยังจำความช็อกตอนเห็น Mario 64 ครั้งแรกบน N64 เครื่องนำเข้าจากญี่ปุ่นได้ชัดเจน
มันทำให้นึกถึงภูมิทัศน์เกมที่หลากหลาย**ในยุคที่เกมอย่าง Wipeout บน PSX กำลังพัฒนาไปอีกทิศทางหนึ่ง
เขาบอกว่าลดปัญหาโพลิกอนขนาดใหญ่ด้วย “Tessellation (สูงสุด 2 เท่า)” แต่ในวิดีโอก็ยังเห็นการบิดเบี้ยวของเท็กซ์เจอร์หนักอยู่ดี
อาจเป็นไปได้ว่า 2 เท่ายังไม่พอ หรือไม่ก็ต้องสร้างเลเวล geometry ใหม่
น่าจะเพราะจัดการการคำนวณ floating-point ด้วยซอฟต์แวร์อยู่ ทำให้ perspective-correct mapping น่าจะกระทบเฟรมเรตมาก
ถ้าทำเพิ่มในอนาคตก็น่าจะแบ่งโพลิกอนใหญ่ๆ ออก และแก้ปัญหาข้อจำกัดของพิกัดเท็กซ์เจอร์ได้
เลยยังคงเหลืออารมณ์หยาบๆ ของ 3D ยุคแรกอยู่
สงสัยว่ามีวิดีโอรันจริงหรือภาพหน้าจอไหม ถึงจะเข้าใจได้ว่าทำไมใน GitHub ถึงไม่มี
ลิงก์ YouTube
ลิงก์ YouTube
คนบ่นกันเยอะเรื่องเท็กซ์เจอร์บิดเบี้ยว แต่ถึงอย่างนั้นนี่ก็ยังเป็นผลงานที่น่าทึ่งอยู่ดี
จะไม่พูดถึง Kaze ก็คงไม่ได้
เขาเป็นคนที่ปรับแต่ง Mario 64 ในหลายรูปแบบมาหลายปีแล้ว ถ้าคุณสนใจจุดตัดระหว่างเกมเรโทรกับการเขียนโปรแกรม ก็ควรดูจริงๆ
ช่อง YouTube ของ Kaze
ไม่คิดเลยว่ามันจะกลายเป็นจริงได้เร็วขนาดนี้
ดูวิดีโอที่เกี่ยวข้อง
ถ้ามีคนที่รู้เรื่อง PS1 ลึกเท่าระดับ Kaze ก็น่าจะทำโปรเจ็กต์อย่าง Mario 32 ได้เหมือนกัน
ช่วงนี้มีโปรเจ็กต์ decompileเพิ่มขึ้นแบบระเบิดระเบ้อมาก เลยสงสัยว่าเกิดจากอะไร
ตัวอย่างที่เด่นคือ decomp.me
เครื่องมือพวกนี้ช่วยให้สร้างโค้ดกลับขึ้นมาใหม่ให้ตรงกับไบนารีเดิมได้อย่างแม่นยำ และทำให้เริ่มโปรเจ็กต์ใหม่ได้เร็วขึ้น
อีกปัจจัยหนึ่งคือการมาของporting layerที่เลียนแบบ API ของ console SDK
แต่การทำให้ตรงเป๊ะก็ยังต้องใช้ความพยายามมหาศาล เช่น ต้องจำลองพฤติกรรมผิดปกติของ toolchain เก่าๆ เพื่อให้แมตช์สมบูรณ์
ช่วงนี้ยังมีDreamcast พอร์ตออกมาด้วย และ Star Fox 64 กับ Mario Kart 64 ก็ถูกพอร์ตไปหลายแพลตฟอร์มแล้ว
รายการที่เกี่ยวข้อง: awesome-game-decompilations
เสียดายที่ไม่มีภาพหน้าจอ
“ในที่สุดก็ได้ Super Mario 32”