Animal Crossing เวอร์ชัน GameCube อายุ 24 ปี ถูกแทนที่ระบบบทสนทนาด้วย LLM ผ่านการแฮ็กหน่วยความจำ
(joshfonseca.com)- โปรเจกต์ที่เปลี่ยนบทสนทนาแบบซ้ำ ๆ ของเกมคลาสสิก Animal Crossing (GameCube, 2001) ให้เป็น บทสนทนา LLM บนคลาวด์แบบเรียลไทม์
- เชื่อมเกมกับสคริปต์ Python ภายนอกและ AI ผ่าน การแฮ็กหน่วยความจำและวิธี shared memory (mailbox) โดยไม่แก้โค้ดเกม
- ข้อความในเกมไม่ได้ถูกจัดการเป็นสตริงธรรมดา แต่เป็น ภาษาควบคุมพิเศษ จึงแก้ปัญหาด้วยการสร้างตัวเข้ารหัสและถอดรหัสแยกต่างหาก
- การสร้างบทสนทนาถูกแยกเป็น Writer (เขียนบทพูดเชิงสร้างสรรค์) และ Director (เพิ่ม control code และการแสดงออก) เพื่อคงคุณภาพ
- ผลลัพธ์คือชาวบ้านในหมู่บ้านสามารถพูดคุยแบบ AI ที่คาดเดาไม่ได้ ซึ่งสะท้อนทั้งข่าวลือ ข่าวสาร และเสียดสี ทำให้เกมคลาสสิกมีชีวิตชีวาขึ้นอีกครั้ง
- โค้ดโปรเจกต์เปิดเผยบน GitHub
นิยามปัญหา
- Animal Crossing มีเสน่ห์แต่ก็ขึ้นชื่อเรื่องบทสนทนาที่ซ้ำไปซ้ำมา และแม้จะผ่านไป 23 ปี บทพูดก็ไม่เปลี่ยน จึงเกิดแนวคิดว่าจะเปลี่ยนมันอย่างพลิกโฉมได้อย่างไร
- ปัญหาคือ GameCube เป็นสภาพแวดล้อมแบบปิดที่มี CPU 485MHz, RAM 24MB และไม่รองรับเครือข่าย
- ต้องคงเกมต้นฉบับไว้เหมือนเดิมโดยไม่แก้ไขโค้ด
- เป้าหมายคือสร้างบริดจ์เพื่อแทนที่บทสนทนาที่ซ้ำซากด้วย LLM สมัยใหม่
ขั้นแรก: แฮ็กระบบบทสนทนา
- ด้วย การดีคอมไพล์ Animal Crossing ของชุมชน จึงสามารถเข้าถึงโค้ด C ได้
- ประสบความสำเร็จในการ แทนที่ข้อความบทสนทนา โดย hook การเรียกฟังก์ชันในไฟล์
m_message.c - แต่ยังเหลือโจทย์ว่าจะรับส่งข้อมูลกับ AI ภายนอกแบบเรียลไทม์ได้อย่างไร
วิธี mailbox บนหน่วยความจำ
- ใช้พื้นที่บางส่วนของ RAM บน GameCube เป็น IPC mailbox
- สคริปต์ Python ทำ การเขียน/อ่านโดยตรงที่แอดเดรสหน่วยความจำ → ใช้สื่อสารระหว่างเกมกับ AI
- เขียนตัวสแกนหน่วยความจำเพื่อหาแอดเดรสของ ชื่อผู้พูด (0x8129A3EA), บัฟเฟอร์บทสนทนา (0x81298360)
ภาษาของ control code
- หากส่งสตริงธรรมดาเข้าไป เกมจะ ค้าง
- สาเหตุคือ Animal Crossing ใช้ ภาษาที่อิงกับ control code เช่น
<End Conversation>,<Pause>,<Color Line> - จึงเขียน encoder/decoder ด้วย Python เพื่อแปลงระหว่างข้อความที่มนุษย์อ่านเข้าใจกับลำดับไบต์ที่เกมเข้าใจ
การพิจารณาทางเลือกด้านเครือข่าย
- แม้จะมี Broadband Adapter สำหรับ GameCube แต่ Animal Crossing ไม่มี network stack
- หากจะใช้ BBA ต้องเพิ่มทั้ง network stack และ asynchronous I/O จึงไม่คุ้มค่า
- จึงตัดสินว่า การแฮ็กหน่วยความจำผ่านอีมูเลเตอร์ เรียบง่ายและเสถียรกว่า
ไปป์ไลน์ AI
- ตอนแรกให้ LLM ตัวเดียว รับผิดชอบทั้งงานสร้างสรรค์และ control code แต่มีปัญหาด้านคุณภาพมาก จึงเลือกกลยุทธ์ แยก Writer-Director
- Writer: สร้างบทพูดเชิงสร้างสรรค์ตามบุคลิกของตัวละคร (ใช้ข้อมูลจากแฟนวิกิ)
- Director: อ่านบทพูดแล้วแทรก control code, สีหน้า, สี, เสียง ที่เหมาะสม
- ไปป์ไลน์ LLM สองขั้นตอน นี้แยกความคิดสร้างสรรค์ของ AI ออกจากข้อกำหนดทางเทคนิค เพื่อใช้จุดแข็งของแต่ละส่วน
- การแยกบทบาทนี้ช่วยให้ได้คุณภาพที่เสถียร
ผลลัพธ์และการต่อยอด
- เมื่อป้อนฟีดข่าว ชาวบ้านจะนำพาดหัวข่าวมาใส่ในบทสนทนาประจำวัน
- ระบบข่าวลือที่อิง shared memory → เกิด ขบวนการต่อต้าน Tom Nook
- การสะท้อนข้อมูลจากแหล่งภายนอกแบบตรง ๆ ทำให้บางครั้งเกิด บทพูดแปลกประหลาดและชวนอึดอัด
- โค้ดทั้งหมด (อินเทอร์เฟซหน่วยความจำ, encoder/decoder, logic ของ AI prompt) เปิดเผยบน GitHub
ความสำคัญ
- เป็นโปรเจกต์ทดลองที่ผสาน การแฮ็กคอนโซลเรโทร, การรวม AI และการอนุรักษ์เกม เข้าด้วยกัน
- เชื่อมเกมจากปี 2001 เข้ากับ AI ปี 2025 เพื่อสร้าง ปฏิสัมพันธ์ข้ามยุคสมัย
- เกมไม่ใช่แค่บทสนทนาซ้ำ ๆ อีกต่อไป แต่พัฒนาเป็น โลกเสมือนที่มีชีวิต
- กระบวนการพัฒนาทั้งหมด/วิดีโอเดโม: Modern AI in a 24-Year-Old Game
7 ความคิดเห็น
ว้าว.. น่าสนุกจริง ๆ เลยนะครับ
คนที่ทำสิ่งนี้น่าจะส่งเรซูเม่ไปที่ Nintendo แล้วเขาคงรีบรับตัวไปเลย
แค่คิดเล่น ๆ ว่าถ้าทำ Ultima ยุค DOS แบบนี้ได้ก็คงสนุกดี..
นี่มัน geek จริง ๆ เลย!
เป็นโปรเจกต์ที่สนุกมากๆ เลยนะ
ความเห็นบน Hacker News
มีการแชร์ลิงก์โค้ดของม็อด Animal Crossing LLM ไว้ที่นี่ github.com/vuciv/animal-crossing-llm-mod และเพราะสงสัยว่า LLM ดักจับบทพูดในเกมแล้วทำให้เกมค้างรอจนกว่าจะสร้างคำตอบอย่างไร จึงเอา 40,000 โทเคนไปโยนใส่ Claude Opus 4.1 ผ่าน gitingest.com แล้วถามตรง ๆ คำตอบที่แชร์จาก claude.ai ประเด็นสำคัญคือฟังก์ชัน
watch_dialogue()จะคอย polling ทุก 0.1 วินาทีแล้วตอบกลับด้วยข้อความชั่วคราว ดูตำแหน่งโค้ดแบบเจาะจง ในทางปฏิบัติผู้ใช้จะเห็นปุ่ม "กด A เพื่อเล่นต่อ" และคาดหวังว่า ณ ตอนนั้นคำตอบจาก LLM จะออกมาแล้วฉันสรุปโน้ตละเอียดกว่านี้ไว้ในบล็อกแล้ว โพสต์บน simonwillison.net
ขำมากที่พอให้ชาวบ้านในหมู่บ้านมี ‘ความคิด’ สิ่งแรกที่พวกเขาอยากทำคือโค่นล้ม Tom Nook ถ้ามันทำได้บนอีมูเลเตอร์ GameCube ก็น่าจะมีหวังทำบนอีมูเลเตอร์ Switch ได้เหมือนกัน
ฉันเองก็อยากลองทำเวอร์ชัน Animal Crossing New Horizons เหมือนกัน
ฉันก็อยากโค่นล้ม Tom Nook เหมือนกัน Tom Nook ขังคุณไว้ แล้วผลักให้ชาวเมืองทุกคนตกอยู่ในวังวนหนี้ไม่รู้จบ และถ้าจะทำให้เขาพอใจก็ต้องใช้เงินหลายล้าน bells
เมื่อดูจากการที่ Tom Nook คุมทั้งเมืองเหมือนเจ้าพ่อมาเฟีย ฉันว่าไม่มีใครโทษการกบฏของพวกเขาได้หรอก
ถ้าจะทำบนเวอร์ชัน Switch ก็ต้อง decompile โค้ดเกม Animal Crossing ก่อน และ DRM สมัยนี้ก็แข็งแกร่งกว่ายุค GameCube มาก ในทางทฤษฎีเป็นไปได้ แต่ถ้าจะทำจริงน่าจะต้องลงแรงมหาศาล
LLM ส่วนใหญ่ฝึกมาจาก Reddit และมุกว่า "Tom Nook คือเผด็จการทุนนิยม" ก็เป็นมีมจาก Reddit ปฏิกิริยาของ LLM หลายอย่างจริง ๆ จึงใกล้เคียงกับการทำซ้ำอารมณ์ขันหรือความเห็นจาก Reddit มากกว่าจะเป็น ‘ความคิด’
ฉันว่าการใช้งานแบบนี้เจ๋งมาก และนี่คือสิ่งที่ฉันอยากเห็นที่สุดสำหรับ NPC ที่ขับเคลื่อนด้วย LLM ในเกม การได้ยินบทพูดเดิมซ้ำ ๆ เป็นหนึ่งในสิ่งที่ทำลาย immersion มากที่สุด
พูดตรง ๆ ฉันยังไม่แน่ใจว่ามันจะมีประโยชน์จริงแค่ไหน! เวลาที่ NPC พูดซ้ำเดิม สำหรับผู้เล่นมันก็เป็นสัญญาณว่า “บทสนทนาจบแล้ว” เหมือนกัน แน่นอนว่ามันมีกรณีใช้งานที่เท่มาก แต่บทพูดซ้ำก็ถือเป็น ‘ฟีเจอร์’ อย่างหนึ่งด้วย คงต้องรอดูว่าจะออกมาเป็นยังไง xD
มีเกมเล็ก ๆ และม็อดใหญ่ของ Skyrim ที่ลองทำแบบนี้กันอยู่แล้ว ฉันเคยลองเล่นกับม็อด Skyrim อันหนึ่งอยู่บ้าง และยังมีปัญหาที่ต้องแก้อีกเยอะ อย่างแรกคือการสร้าง LLM ต้องใช้ข้อความฝึกจำนวนมหาศาล และแทบจะลบเนื้อหาเฉพาะจุดออกย้อนหลังได้ยากมาก ถ้าผู้ใช้แค่เล่นบทบาทสมมติกับ AI ใน Skyrim มันก็พอถูไถได้ แต่ NPC ก็อาจพูดถึงประเด็นทางการแพทย์หรือคนดังอย่าง Taylor Swift, Fox News ขึ้นมาได้ ซึ่งสำหรับ LLM ปัจจุบันแทบแก้ไม่ได้เลย อีกอย่างคือ LLM อาจให้ ‘คำสัญญา’ ที่เกมทำให้จริงไม่ได้ เช่น NPC บอกว่า "เมื่อวานฉันไปดันเจียนนี้มา" ฟังดูสมจริง แต่จริง ๆ แล้วสถานที่หรืออีเวนต์นั้นไม่มีอยู่ในเกม เรื่องนี้ก็ยังเป็นจุดที่ LLM ปัจจุบันแก้ไม่ได้เหมือนกัน ถ้าจะให้ประสบการณ์ลื่นไหลถึงระดับนั้น ฉันคิดว่า AI ต้องพัฒนาไปอีกอย่างน้อยหนึ่งเจเนอเรชัน Mantella เป็นม็อดที่สนุก แต่ในสภาพตอนนี้ยังยากจะเอาไปทำเป็นสินค้าจริงแบบแพร่หลาย
ฉันคิดว่าแค่ local LLM ก็ทำได้ประมาณนี้สบาย ๆ แล้ว ประเด็นมีแค่ว่าการรันอนุมานของ LLM อาจกินเวลา GPU แต่ก็ไม่ใช่ปัญหาที่แก้ไม่ได้ ฉันคงไม่อยากใช้มันกับจังหวะสำคัญของเนื้อเรื่อง แต่สำหรับบทสนทนาเบา ๆ ของ NPC หรือสถานการณ์แบบ RPG มันเหมาะมาก และฉันไม่ชอบให้เกมเล่นคนเดียวต้องพึ่ง remote inference (cloud inference) เพราะถ้าบริการปิด เกมก็เล่นไม่ได้เลย
นึกภาพได้เลยว่าอีกไม่นานจะมีปรากฏการณ์ ‘ติดเกม + AI หลอน’ ที่ผู้เล่นหมกมุ่นกับ NPC แบบ LLM ใน MMORPG ฟาร์มทองวันละ 12 ชั่วโมงพร้อมคบกับ AI girlfriend
เดิมทีฉันก็เกลียดการฟังบทพูดซ้ำ ๆ เหมือนกัน จนมาเจอ Skyrim กับประโยค “ก่อนที่ฉันจะโดนลูกศรที่หัวเข่า”
ไอเดียการใช้ LLM เป็นเครื่องมือ modding เพื่อเติมความหมายใหม่ให้พื้นที่เสมือนนั้นน่าสนใจมาก วิธีคิดนี้คล้ายกับเครื่องมือเชิง plunderludic อย่าง Unity Hawk เลยคิดว่าน่าจะเหมาะกับงานแทรกแซงเชิงศิลปะด้วย ลิงก์อ้างอิง: แนะนำ Unity Hawk
การเติมชีวิตใหม่ให้เกมเก่าเป็นอะไรที่ทั้งน่าตื่นเต้นและสนุกเสมอ และการที่โค้ดเบสของ Animal Crossing ถูก decompile ออกมาเป็นโค้ด C ที่อ่านรู้เรื่องได้ก็น่าสนใจมาก ทำให้มีพื้นที่ให้คนเข้าไปลองเล่นได้เต็มที่ขึ้นเยอะ
การหาวิธีทำผ่านการแฮ็ก shared memory แบบนี้ยอดเยี่ยมจริง ๆ ทั้งในเชิงวิศวกรรมก็ประหยัดเวลาไปมาก และการโจมตีตรงจุดได้แม่นแบบนี้คือฝีมือของมืออาชีพอย่างแท้จริง เปรียบเหมือน “10 ดอลลาร์สำหรับการจับค้อน และ 5,000 ดอลลาร์สำหรับการรู้ว่าต้องตีตรงไหนของเครื่องจักร”
มีคำถามเชิงเทคนิคนิดหน่อย กลไกอะไรทำให้มั่นใจได้ว่าที่อยู่หน่วยความจำนั้นคงที่? มันขึ้นอยู่กับเงื่อนไขว่าการจัดสรรหน่วยความจำในเกมเกิดในลำดับเดิมทุกครั้งหรือเปล่า?
วิธีแบบ shared memory นี้ใช้กันบ่อยพอสมควรใน multiplayer randomizer ด้วย ปกติจะใช้พื้นที่เล็กกว่านี้ แต่มีการใช้ scratch memory เป็น message buffer ระหว่างอีมูเลเตอร์กับเครือข่าย (หรือระหว่าง FXPakPro กับเครือข่าย) เป็นแพตเทิร์นที่มีประโยชน์มาก
เมื่อให้ตัวละครแต่ละตัวมี agency แบบนี้ มันน่าสนใจมากที่มุมมองว่า ‘พวกเขาคิดต่อโลกอย่างไร’ ถูกสร้างขึ้นมาอย่างเป็นธรรมชาติ มันเป็นการทดลองแปลกดีที่จะช่วยกะคร่าว ๆ ได้ว่า ถ้า LLM ทำหน้าที่แบบนี้ได้ถึงระดับหนึ่ง คนจริง ๆ จะมีพฤติกรรมอย่างไรในฉากโลกสมมติแบบนั้น
ฉันอาจกำลังพลาดอะไรไป แต่แนวทางนี้จริง ๆ แล้วก็แค่สร้างข้อความ โดยไม่ได้ตอบสนองต่ออีเวนต์ในเกมจริงหรือเปล่า? ดูเหมือนว่าจะสร้างข้อความแบบเดียวกันได้ด้วยกระบวนการออฟไลน์หรือแบบ batch อยู่แล้ว การอนุมาน LLM แบบเรียลไทม์ดูน่าทึ่งก็จริง แต่ไม่ได้รู้สึกว่าจำเป็นหรือสำคัญมาก ถ้าใช้ lookup table แทน polling ก็น่าจะง่ายกว่าและประสิทธิภาพดีกว่าด้วย
มีคนบอกว่า “Nintendo GameCube เป็นคอนโซลอายุ 24 ปี มี CPU PowerPC 485MHz, RAM 24MB และไม่มีเครือข่าย” แต่จริง ๆ แล้วมันมีอุปกรณ์เสริม Ethernet ทางการชื่อ Broadband Adapter อยู่ เพียงแต่เกมที่รองรับมีไม่กี่เกม และ Phantasy Star Online ก็รวมอยู่ด้วย ฉันเคยต่อกับพีซีเพื่อสตรีมเกมหรือรอมมาก่อน วิธีคืออาศัยช่องโหว่หน่วยความจำเพื่ออัปโหลดโค้ดผ่านเครือข่าย และความเร็วโหลดก็ช้ากว่าแผ่นดิสก์
ก่อนหน้านี้เคยมีโปรเจกต์วิจัยที่สลับข้อความ localized ในเกมอย่าง The Sims หรือ Grim Fandango เพื่อเปลี่ยนให้เป็นเกมสำหรับฝึกภาษา ตอนนี้บทสนทนาเชิงกำเนิดที่สอดคล้องกับบริบทและปรับตามระดับผู้เรียนได้ น่าจะกลายเป็น killer app ที่ทรงพลังมากสำหรับการเรียนภาษา
อันนี้น่าตื่นเต้นจริง ๆ ทุกคนอยากเรียนภาษาต่างประเทศ แต่ไม่ชอบการเรียนที่น่าเบื่อ ถ้าฉันเล่น Grim Fandango แล้วถาม AI ได้ตรง ๆ ว่า “Morte แปลว่าอะไร?” และ LLM ติวให้แบบเรียลไทม์ ฉันยอมจ่ายเงินใช้เลย พอเริ่มเบื่อก็กลับไปเล่นเกมต่อได้ และถ้าส่งรายการคำศัพท์ที่ฉันรู้แล้วให้ AI มันก็อาจค่อย ๆ เพิ่มคำและประโยคให้ทีละนิด เพื่อสร้างประสบการณ์เรียนรู้ที่เป็นธรรมชาติได้ด้วย
ตอนนี้แม้แต่ Duolingo ก็เริ่มใช้ AI อย่างจริงจังแล้ว
Tom Nook คือคาแรกเตอร์ "แร็กคูน" ภายในเกม