1 คะแนน โดย GN⁺ 2025-12-12 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เวอร์ชันที่พอร์ตมาสำหรับ 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 ความคิดเห็น

 
GN⁺ 2025-12-12
ความคิดเห็นจาก Hacker News
  • ถ้าคุณชอบพอร์ตนี้ น่าจะสนใจโปรเจ็กต์ที่นำ SM64 มาสร้างใหม่ทั้งหมดบน GBAด้วย
    ดูวิดีโอ YouTube

    • ไหนๆ ก็เป็น HN แล้ว ควรต้องพูดถึงไว้ว่า GBA พอร์ตนี้เขียนด้วย Rust
      บทความที่เกี่ยวข้อง: The Impossible Port – Super Mario 64 on the Game Boy Advance
    • น่าสนใจดี สงสัยว่า GBA จะรับมือกับเวอร์ชันเบาๆ สไตล์ Minecraftได้ไหม
      N64 ก็น่าจะเข้ากันได้ดีเหมือนกัน และสักวันก็อยากหา SummerCart64 มาลองเล่นดู
    • มีใครรู้ไหมว่าซอร์สโค้ดของโปรเจ็กต์นี้อยู่ที่ไหน? เหมือนจะถูกลบไปแล้ว
    • มันเจ๋งมากก็จริง แต่สำหรับผมดูแล้วค่อนข้างลำบากตา
      ถึงอย่างนั้นการทำจนเสร็จได้ก็น่าทึ่งจริงๆ
  • นี่เป็นความสำเร็จที่น่าทึ่งมาก
    ผมเคยมีทั้งสองคอนโซลมาก่อน และพอเห็นพอร์ตนี้ก็ยิ่งรู้สึกอีกครั้งว่า N64 ในปี 1996 ถ่ายทอดอารมณ์แบบ**‘SGI ในบ้าน’ได้ดีแค่ไหน
    ผมยังจำความช็อกตอนเห็น Mario 64 ครั้งแรกบน N64 เครื่องนำเข้าจากญี่ปุ่นได้ชัดเจน
    มันทำให้นึกถึง
    ภูมิทัศน์เกมที่หลากหลาย**ในยุคที่เกมอย่าง Wipeout บน PSX กำลังพัฒนาไปอีกทิศทางหนึ่ง

  • เขาบอกว่าลดปัญหาโพลิกอนขนาดใหญ่ด้วย “Tessellation (สูงสุด 2 เท่า)” แต่ในวิดีโอก็ยังเห็นการบิดเบี้ยวของเท็กซ์เจอร์หนักอยู่ดี
    อาจเป็นไปได้ว่า 2 เท่ายังไม่พอ หรือไม่ก็ต้องสร้างเลเวล geometry ใหม่

    • ผมก็เห็นการบิดเบี้ยวของเท็กซ์เจอร์เหมือนกัน แต่ไม่เห็นอาการสั่นของ geometryแบบที่เป็นเอกลักษณ์ของเกม PS1
      น่าจะเพราะจัดการการคำนวณ floating-point ด้วยซอฟต์แวร์อยู่ ทำให้ perspective-correct mapping น่าจะกระทบเฟรมเรตมาก
    • ตอนนี้แทบจะยังไม่มีกระบวนการ preprocessกับโพลิกอนของเลเวลเลย
      ถ้าทำเพิ่มในอนาคตก็น่าจะแบ่งโพลิกอนใหญ่ๆ ออก และแก้ปัญหาข้อจำกัดของพิกัดเท็กซ์เจอร์ได้
    • ใน known issues ก็ระบุไว้ชัดว่า “Tessellation ยังไม่เพียงพอ”
      เลยยังคงเหลืออารมณ์หยาบๆ ของ 3D ยุคแรกอยู่
  • สงสัยว่ามีวิดีโอรันจริงหรือภาพหน้าจอไหม ถึงจะเข้าใจได้ว่าทำไมใน GitHub ถึงไม่มี

    • มีวิดีโอเกมเพลย์ที่ค่อนข้างดีอันหนึ่งที่ผมดูเมื่อคืน
      ลิงก์ YouTube
    • มีอีกวิดีโอหนึ่งด้วย
      ลิงก์ YouTube
  • คนบ่นกันเยอะเรื่องเท็กซ์เจอร์บิดเบี้ยว แต่ถึงอย่างนั้นนี่ก็ยังเป็นผลงานที่น่าทึ่งอยู่ดี

  • จะไม่พูดถึง Kaze ก็คงไม่ได้
    เขาเป็นคนที่ปรับแต่ง Mario 64 ในหลายรูปแบบมาหลายปีแล้ว ถ้าคุณสนใจจุดตัดระหว่างเกมเรโทรกับการเขียนโปรแกรม ก็ควรดูจริงๆ
    ช่อง YouTube ของ Kaze

    • ในวิดีโอที่ลงเมื่อเดือนสิงหาคม เขาวิเคราะห์ว่า Mario 64 เปลือง RAM แค่ไหน และตอนนั้นก็พูดถึงความเป็นไปได้ของพอร์ต PS1 เป็นครั้งแรก
      ไม่คิดเลยว่ามันจะกลายเป็นจริงได้เร็วขนาดนี้
      ดูวิดีโอที่เกี่ยวข้อง
    • เขาเก่งมากจริงๆ (และกล้ามใหญ่มากด้วย)
      ถ้ามีคนที่รู้เรื่อง PS1 ลึกเท่าระดับ Kaze ก็น่าจะทำโปรเจ็กต์อย่าง Mario 32 ได้เหมือนกัน
  • ช่วงนี้มีโปรเจ็กต์ decompileเพิ่มขึ้นแบบระเบิดระเบ้อมาก เลยสงสัยว่าเกิดจากอะไร

    • เหตุผลหลักคือความก้าวหน้าของ tooling ที่รองรับ การ decompile แบบจับคู่ไบต์ 1:1
      ตัวอย่างที่เด่นคือ decomp.me
      เครื่องมือพวกนี้ช่วยให้สร้างโค้ดกลับขึ้นมาใหม่ให้ตรงกับไบนารีเดิมได้อย่างแม่นยำ และทำให้เริ่มโปรเจ็กต์ใหม่ได้เร็วขึ้น
      อีกปัจจัยหนึ่งคือการมาของporting layerที่เลียนแบบ API ของ console SDK
      แต่การทำให้ตรงเป๊ะก็ยังต้องใช้ความพยายามมหาศาล เช่น ต้องจำลองพฤติกรรมผิดปกติของ toolchain เก่าๆ เพื่อให้แมตช์สมบูรณ์
    • อาจเป็นเพราะAI ทำให้ decompile ง่ายขึ้นก็ได้
    • หรืออาจเป็นเพราะแค่AI
    • คนใช้ Ghidra มากขึ้นก็น่าจะมีผลเหมือนกัน
  • ช่วงนี้ยังมีDreamcast พอร์ตออกมาด้วย และ Star Fox 64 กับ Mario Kart 64 ก็ถูกพอร์ตไปหลายแพลตฟอร์มแล้ว
    รายการที่เกี่ยวข้อง: awesome-game-decompilations

    • พอร์ต Star Fox 64 ก็เพิ่งเสร็จเหมือนกัน
  • เสียดายที่ไม่มีภาพหน้าจอ

  • “ในที่สุดก็ได้ Super Mario 32