วิศวกรรมย้อนกลับเดโมเซิร์ฟเวอร์ Ultima Online ปี 1998
(draxinar.github.io)- OUO เป็นโปรเจกต์ที่ทำวิศวกรรมย้อนกลับเดโมเซิร์ฟเวอร์
Ultima Onlineปี 1998 แบบสมบูรณ์ โดยถอดประกอบไบนารี MSVC x86 ราว 5,000 ฟังก์ชัน แล้วแปลงเป็น C99 ที่พกพาได้ UoDemo.exeเป็นเดโมแบบสแตนด์อโลนที่รวมอยู่ในรีลีสแรกของUltima Online: The Second Ageและบรรจุทั้งไคลเอนต์กับโค้ดและข้อมูลเซิร์ฟเวอร์ทั้งหมดที่พอร์ตมาบน Windows ไว้ด้วย- แต่ละฟังก์ชันถูกเทียบกับไบนารีต้นฉบับในระดับคำสั่ง โดยมีการจัดชั้นคลาสและเลย์เอาต์ vtable ให้ตรงกัน ก่อนจะแปลงด้วยมือเพื่อคง control flow, เลย์เอาต์ struct และแขนงการทำงานให้เหมือนต้นฉบับ
- ชุดที่กู้คืนมาใกล้เคียงกับโค้ดเซิร์ฟเวอร์
Ultima Onlineที่เปิดใช้งานจริงในช่วงกลางปี 1998 แต่มีการแก้ ปัญหาด้านเสถียรภาพ เช่น crash, overflow และตัวแปรที่ไม่ได้ initialize รวมถึง ปัญหาด้านเกมเพลย์ เช่น การเพิ่มสกิลและความหนาแน่นของการเกิดมอนสเตอร์ พร้อมติดแท็กกำกับไว้ - เดโมดั้งเดิมรองรับเฉพาะไคลเอนต์ 1.25.33 แต่ชุดที่กู้คืนมารองรับไคลเอนต์ ตั้งแต่ 1.25.30 ถึง 5.0.9.1 ไม่ว่าจะเข้ารหัสหรือไม่ก็ตาม และกำลังขอไฟล์ข้อมูลเซิร์ฟเวอร์ช่วงปี 1997~2003 เพิ่มเติม
ที่มาและขอบเขตของไฟล์เดโม
- แต่ละฟังก์ชันถูกเทียบกับไบนารีต้นฉบับในระดับคำสั่ง และงานที่ทำแบบเป็นช่วง ๆ ตลอด 10 ปีก็สามารถปิดงานได้ในที่สุดด้วยความก้าวหน้าของ LLM ในช่วงหลัง
UoDemo.exeมีวันที่เป็น 1998-09-02 และข้อมูลเซิร์ฟเวอร์ถูกดึงมาจากเซิร์ฟเวอร์ที่เปิดให้บริการจริงเมื่อ 2 มิถุนายน 1998- มีบางฟีเจอร์ที่ถูกทำเป็น stub เพื่อใช้กับเดโม และแผนที่ที่เล่นได้ถูกย่อเหลือเพียงเกาะ Ocllo แต่ส่วนที่เหลือคือโค้ดเซิร์ฟเวอร์ปฏิบัติการจริงที่รันอยู่บน
Ultima Onlineช่วงกลางปี 1998 Ultima Onlineเป็น MMORPG ปี 1997 ที่พัฒนาโดย Origin Systems Inc. และเป็นหนึ่งใน MMORPG ยุคแรกที่ประสบความสำเร็จเชิงพาณิชย์- ไคลเอนต์รันบน Windows ส่วนเซิร์ฟเวอร์หรือ “shards” รันอยู่บนเครื่อง Solaris หลายเครื่อง และแผนที่ถูกแบ่งตามภูมิภาค
- เดโมมีเควสต์ง่าย ๆ ให้ฆ่ามังกรบนเกาะ Ocllo และออกแบบมาเพื่อให้ได้ลองระบบหลักของเกม เช่น บทสนทนา การค้า และการต่อสู้
- แม้จะมี UO server emulator หลายตัวนำบางส่วนของเดโมนี้ไปใช้ซ้ำ แต่จนถึงตอนนี้ยังไม่เคยมีใครทำวิศวกรรมย้อนกลับแบบสมบูรณ์
UoDemo.exeถูกคอมไพล์ด้วย Microsoft Visual C++ 5.0 หรือ Visual Studio 97 และมุ่งเป้าไปที่ C++ สำเนียงก่อนยุค C++98
วิธีทำวิศวกรรมย้อนกลับ
-
การถอดประกอบและการคาดเดาสัญลักษณ์
- ใช้ radare2 สำหรับการถอดประกอบ
- ชื่อสัญลักษณ์อนุมานจากไคลเอนต์
UOเวอร์ชัน Linux แบบ experimental รุ่น 1.25.37 ที่มี C++ symbol รวมอยู่
-
การแปลงเป็น C99 ด้วยมือ
- แต่ละฟังก์ชันถูกแปลเป็น C99 ด้วยมือ โดยคง control flow, เลย์เอาต์ struct และแขนงการทำงานให้เหมือนกับไบนารีต้นฉบับ
- จุดที่แตกต่างกันคือการแก้บั๊กจริงของเดโมหรือการปรับให้เข้ากับแพลตฟอร์ม ซึ่งมีการระบุไว้ในซอร์ส
-
วิธีตรวจสอบความถูกต้อง
- นำบิลด์ C ไปถอดประกอบด้วย
r2อีกครั้งแล้วเทียบกับต้นฉบับ - ฟังก์ชันจะถูกทำเครื่องหมายว่าเสร็จสมบูรณ์ก็ต่อเมื่อผลลัพธ์ทั้งสองตรงกัน
- helper function ใช้เฉพาะกับแพตเทิร์น inline ที่ซ้ำ ๆ และจะใช้ก็ต่อเมื่อสามารถขยายกลับเป็นโค้ดเดียวกับเวอร์ชัน inline ได้เท่านั้น
- นำบิลด์ C ไปถอดประกอบด้วย
-
การกู้คืนลำดับชั้นคลาส
- งานที่สำคัญที่สุดในช่วงแรกคือการทำให้ลำดับชั้นคลาสตรงกันอย่างแม่นยำ
- ลำดับชั้นหลักคือ
CEntity (0x10) -> CResourceEntity (0x1C) -> CItem (0x50) -> CContainer (0x5C) -> CMobile (0x37C) -> CPlayer (0x458) - virtual dispatch ทำผ่านสล็อตใน vtable เช่น
vtable[0x18]คือIsPlayer,[0xD0]คือIsMobile,[0xE4]คือIsNPC - เมื่อเลย์เอาต์นี้ลงตัวแล้ว ไบนารีส่วนใหญ่ก็สามารถแปลได้ค่อนข้างตรงไปตรงมา
ผลลัพธ์การกู้คืนและความต่างจากต้นฉบับ
- ผลลัพธ์ที่ได้เกือบจะเป็นสำเนาที่สมบูรณ์แบบของเซิร์ฟเวอร์
Ultima Onlineปี 1998 แต่ยังมีความต่างบางส่วน - มีการแก้ ปัญหาด้านเสถียรภาพ เช่น crash, overflow และตัวแปรที่ไม่ได้ initialize เมื่อเทียบกับโค้ดต้นฉบับ
- ปัญหาด้านเกมเพลย์ อย่างการเพิ่มสกิล ทิศทางของ fame/notoriety และความหนาแน่นของการเกิดมอนสเตอร์ก็ได้รับการแก้ไข
- การแก้ไขแต่ละจุดมีแท็กกำกับในซอร์ส เพื่อให้ผู้ที่เทียบกับ
UoDemo.exeตรวจสอบได้ชัดเจนว่าอะไรเปลี่ยนไปและเพราะเหตุใด - ฟีเจอร์บางอย่างอย่างระบบ spawn และระบบ decay อยู่ในสภาพเสียหาย และอาจถูกปิดบางส่วนหรือทำเป็น stub เพื่อออกเดโม
- โค้ดของฟีเจอร์เหล่านั้นยังคงอยู่ แต่จุดเรียกใช้งานจริงไม่สามารถเข้าถึงได้ และสามารถทำให้กลับมาทำงานได้เพียงแค่ decompile แยกต่างหากแล้วต่อ dispatch กลับเข้าไปใหม่
- ข้อมูลบางส่วนหายไป เช่น แผนที่เกมมีเฉพาะเกาะ Ocllo
- มีการสร้างชุดเครื่องมือเต็มรูปแบบสำหรับจัดการฟอร์แมตข้อมูลเซิร์ฟเวอร์ และประกอบโลกส่วนที่เหลือกลับขึ้นมาอย่างครบถ้วน ทั้งประตู ป้าย ของตกแต่ง teleporter กับดัก หีบ และตำแหน่งเกิดมอนสเตอร์
ระบบนิเวศที่ยังหลงเหลืออยู่
- ecology system อันโด่งดังที่เลิกใช้ไปแล้วนั้นยังคงอยู่ในโค้ด แม้ว่าการเรียกฟังก์ชันจะถูกตัดขาด
- มีการต่อระบบผู้ล่า เหยื่อ และสัตว์กินซากกลับเข้าด้วยกันอีกครั้ง ทำให้เห็นหมาป่าไล่กระต่ายหรืออีกากินไอเท็มได้
- อย่างไรก็ตาม ยังไม่ได้ทำถึงระดับระบบทรัพยากรและการผลิตทั้งหมด เนื่องจากข้อมูลที่แม่นยำมีไม่เพียงพอ
- วัสดุอ้างอิงที่เชื่อมไว้ประกอบด้วยบทความ
UOเรื่อง ecology system ของ Raph Koster และบทความเรื่องระบบทรัพยากรของUO1, 2, 3
ฟีเจอร์เพิ่มเติมและความเข้ากันได้ของไคลเอนต์
- เพิ่มสกิล Meditation, Stealth และ Remove Trap ที่ OSI เพิ่มเข้ามาในเดือนกุมภาพันธ์ 1999
- ร่องรอยเริ่มต้นของฟีเจอร์เหล่านี้บางส่วนมีอยู่แล้วในโค้ด
- ฟีเจอร์ใหม่ส่วนใหญ่สามารถเปิดหรือปิดได้ตอนเริ่มต้นผ่านพารามิเตอร์
-features - เนื่องจากเดโมเซิร์ฟเวอร์เดิมไม่มีระบบบัญชีเลย จึงมีการนำกลับมาสร้างใหม่ในรูปแบบที่ปรับให้ทันสมัยขึ้นเล็กน้อย โดยคาดเดาจากวิธีที่นักพัฒนาเดิมน่าจะทำไว้
- เดโมเซิร์ฟเวอร์เดิมรองรับเพียงไคลเอนต์ 1.25.33 แต่ได้ถูกขยายให้รองรับไคลเอนต์ ทุกเวอร์ชันตั้งแต่ 1.25.30 ถึง 5.0.9.1 หรือถึงวันที่ 2007-03-27 ไม่ว่าจะเข้ารหัสหรือไม่ก็ตาม
- เนื่องจากตลอดหลายปีมีรูปแบบการเข้ารหัสที่แตกต่างกันอย่างสิ้นเชิงถึงห้าแบบ จึงต้องทำวิศวกรรมย้อนกลับแต่ละแบบจากไบนารีของไคลเอนต์
ต้นฉบับ 32 บิตและบิลด์เริ่มต้น 64 บิต
- ไบนารีต้นฉบับเป็น 32 บิต แต่บิลด์เริ่มต้นในปัจจุบันมุ่งเป้าไปที่ 64 บิต
- ลำดับชั้นคลาสถูกจำลอง inheritance แบบ C++ ดั้งเดิมด้วยการฝัง struct ของภาษา C
- วิธีนี้ทำให้สามารถส่ง
CMobile*ไปยังจุดที่ต้องการCContainer*ได้ - เพราะความกว้างของ pointer ที่มากขึ้นบน 64 บิตอาจทำให้ตำแหน่ง field ที่สืบทอดมาขยับไป จึงมีการใส่ padding ให้บาง struct โดยตั้งใจ เพื่อให้ inheritance และเลย์เอาต์ vtable ตรงกับไบนารีทั้งบน 32 บิตและ 64 บิต
ทรัพยากรที่เผยแพร่สู่สาธารณะ
- https://github.com/draxinar/ouo: โค้ด
- https://github.com/draxinar/rundir: ข้อมูลที่อิง
UoDemo.dat, การแก้ไข, ข้อมูลที่เติมเต็มแล้ว และฟีเจอร์ใหม่ - https://uo.serpent-isle.com/: Test Center ไม่ใช่ shard จริง แต่เป็นสภาพแวดล้อมสำหรับทดลองการจำลองเซิร์ฟเวอร์
Ultima Onlineปี 1998 ที่ซื่อสัตย์ต่อของจริงอย่างมาก - UO:98: โปรเจกต์ของ Batlin และ Derrick ซึ่งเป็นแรงบันดาลใจที่ทำให้เริ่มงานนี้ในปี 2016
OUOยังอยู่ในช่วงเริ่มต้นและอาจยังมีปัญหาเหลืออยู่- ปัญหาที่พบสามารถรายงานเป็น issue ได้ และยินดีรับการมีส่วนร่วม
คำขอต่อชุมชน Ultima Online
- หากใครมีไฟล์
dynamic0.mul,dynamic0.bkp,regions.txt,resbank.mulของเซิร์ฟเวอร์Ultima Onlineดั้งเดิมช่วงประมาณปี 1997~2003 ขอความกรุณาส่งต่อ dynamic0.mulและdynamic0.bkpเป็นไฟล์บันทึกสถานะเซิร์ฟเวอร์ ส่วนregions.txtคือคำนิยามการเกิดมอนสเตอร์ และresbank.mulคือไฟล์คำนิยามทรัพยากร- ดูแล้วมีโอกาสน้อยที่ไฟล์
dynamic0.mulหรือdynamic0.bkpต้นฉบับจะสูญหายไปทั้งหมด - มีเครื่องมือพร้อมอยู่แล้วสำหรับลบข้อมูลผู้เล่นออกจากไฟล์
dynamic0.mulเพื่อรักษาความเป็นส่วนตัวก่อนเผยแพร่ - ไฟล์เหล่านี้มีคุณค่าอย่างมากต่อการจำลองเนื้อหาโลกของ
Ultima Onlineให้แม่นยำอย่างยิ่ง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ถ้าใครมีไฟล์ dynamic0.mul, dynamic0.bkp, regions.txt, resbank.mul ของ เซิร์ฟเวอร์ Ultima Online ต้นฉบับแล้วส่งมาให้ได้ จะขอบคุณมาก
นี่คือไฟล์เซฟเกมฝั่งเซิร์ฟเวอร์, คำจำกัดความการเกิดของสิ่งต่าง ๆ และไฟล์นิยามทรัพยากรราวช่วงปี 1997~2003 โดยเฉพาะ dynamic0.mul หรือ dynamic0.bkp น่าจะถูกสำรองไว้ในที่ปลอดภัยหลายแห่ง เลยยากจะเชื่อว่ามันหายไปหมดแล้วจริง ๆ
ไฟล์เหล่านี้มี คุณค่าอย่างมหาศาล สำหรับการสร้างคอนเทนต์โลกของ Ultima Online ขึ้นมาใหม่ได้อย่างแม่นยำมาก
เจ๋งมาก บังเอิญกำลังฟัง ซาวด์แทร็กเกม Ultima ภาคเก่า อยู่พอดีแล้วมาเจอโพสต์นี้ เลยรู้สึกแปลกดี
สงสัยว่าเคยพิจารณาเขียนผลจากการ disassemble ด้วย สำเนียง C++ ยุคก่อน C++98 แล้วเล็งไปที่คอมไพเลอร์ดั้งเดิมที่ใช้หรือเปล่า
ผมเคย disassemble ไบนารีที่รันบนระบบเก่า ๆ มาก่อน และถ้าทำได้ก็คงอยากเล็งไปที่ toolchain เดิม มันเป็นคำถามเชิงปรัชญาที่น่าสนใจทีเดียว
ในฐานะนักพัฒนาผู้รอดชีวิตคนสุดท้ายของ eqclassic อ่านแล้วน่าสนใจ แต่ก็แอบหวังว่าจะได้เห็น เรื่องเล่าที่ลึกกว่านี้ ว่าใช้เครื่องมืออย่างไรและกระบวนการทั้งหมดเป็นอย่างไร ถึงอย่างนั้นก็ยังเป็นบทความที่ดี
ตอนนั้นยังไม่มี LLM แต่มี debug symbol บางส่วนจากไบนารี PowerPC ในอีก 3 ปีถัดมา เลยช่วยได้บ้าง
ชื่อไฟล์อย่าง packet_handler หรือ entitylist ฟังดูคุ้น ๆ อย่างประหลาด :D
ด่านสุดท้ายคือการต้องมี โค้ดเครือข่าย ที่แทบจะสมบูรณ์แบบก่อนจะไปเกลางานส่วนที่เหลือ ซึ่งผมก็เสียเวลาไปกับจุดนี้แล้วหลายร้อยชั่วโมง
ผมแค่ลองไล่ดูซอร์สนิดหน่อย แต่ดูเหมือนทั้งหมดจะอิงกับ TCP และไม่น่าจะมีการซ้อนกลไกความเชื่อถือได้แยกต่างหากทับลงไปอีก ถ้าเป็นแบบนั้นก็น่าสนใจ เพราะสำหรับ MMO ยุคนั้นมันดูเป็นทางเลือกที่ค่อนข้าง “ช้า”
ถ้าใครอยากลองเล่น UO เกมนี้ยังมี ฐานผู้เล่นที่แอ็กทีฟ อยู่จนถึงตอนนี้ เซิร์ฟเวอร์ภายนอกอย่าง UO Outlands ให้ประสบการณ์ใกล้กับเกมต้นฉบับมากกว่า แต่ถ้าวัดตามมาตรฐานคนที่ชินกับ MMO สมัยใหม่ มันก็ค่อนข้างโหด
ผู้เล่นคนอื่นอาจโผล่มา gank คุณได้ และคุณอาจเสียอุปกรณ์ไปเลย
ตอนนี้ก็ยังมีคนออนไลน์บนเซิร์ฟเวอร์นั้น มากกว่า 2500 คน อยู่ จึงยังคึกคักมาก
ความสำเร็จด้านการเขียนโปรแกรมจริง ๆ ครั้งแรกของผมคือการทำ เว็บไซต์ของชาร์ด Ultima Online
ใช้ PHP กับ HTML ที่ห่วยมาก แต่หลังจากนั้นมันก็ยังทำงานมาได้อีกกว่า 20 ปี เป็นความทรงจำที่ดี
ผมประหลาดใจที่รอบ ๆ UO ยังมีชุมชนที่คึกคักอยู่จนถึงตอนนี้ และไม่ว่ายังไงโปรเจ็กต์นี้ก็เจ๋งมาก
ตอนนั้นผมอายุ 12~13 ปี เป็นช่วงปลายยุค 90 ถึงต้นยุค 2000 ตอนนี้จำชื่อ emulator ไม่ได้แล้ว แต่มีโอกาสสูงว่าเป็น POL
เป้าหมายของชาร์ดคือทำให้ใกล้กับเซิร์ฟเวอร์ทางการก่อน UO:Renaissance มากที่สุด เลยต้องทำงานไปเยอะพอควรเพื่อให้มันดูและให้ความรู้สึกแบบ T2A
ผมได้เรียนรู้อะไรมากมาย หลังจากนั้นพอ RunUO ออกมาและเริ่มนิ่งขึ้นราวปี 2003 ผมก็ช่วยย้ายสิ่งที่ทำไว้บน POL ไปเป็น โค้ด C# สำหรับ RunUO และต้องเรียนรู้อีกเยอะเพื่อให้ตามทัน
คนที่ผมทำงานด้วยบนชาร์ดนั้นล้วนเรียนวิทยาการคอมพิวเตอร์ในมหาวิทยาลัยหรือไม่ก็ทำงานเป็นโปรแกรมเมอร์อยู่แล้ว ส่วนผมเป็นแค่เด็กที่พอเขียนสคริปต์ได้ไม่กี่ตัว
ผมมองว่าประสบการณ์นี้มีส่วนชี้ขาดที่ทำให้ผมกลายเป็นมืออาชีพในภายหลัง แม้แต่งานแรกในบริษัทเทคจริง ๆ ก็ได้มาเพราะหนึ่งในนั้นแนะนำตอนมีตำแหน่งฝึกงานว่าง
ในความหมายหนึ่ง UO กับชาร์ดเถื่อน นี่แหละที่สร้างเส้นทางอาชีพของผมในทุกวันนี้
ผมเริ่มเขียนโปรแกรมเพราะความจำเป็นล้วน ๆ
จำชื่อเกมไม่ได้แล้ว แต่น่าจะเป็น City of Heroes ที่ปิดไปหลายปี ก่อนจะมีใครสักคนเอาเซิร์ฟเวอร์เถื่อนกลับมาเปิดใหม่วันหนึ่ง
เกมออนไลน์ยุค Shockwave เก่า ๆ ก็มีชุมชนเฉพาะทางที่ช่วยกันสร้างเซิร์ฟเวอร์ใหม่ รวมถึงทำ runtime ของ Shockwave และ decompiler ด้วย
เพราะแต่ละเกมต้องแก้ปัญหาคล้าย ๆ กัน ชุมชนข้ามเกมเลยทับซ้อนกันด้วย ;)
อย่างที่สองคือการแก้แผนที่ ลบไอเท็มแบบ static แล้วเพิ่มเกาะกับอาคารใหม่
อย่างที่สามคือการแก้ verdata.mul เพื่อเพิ่มแอนิเมชันใหม่และกราฟิกไอเท็มใหม่
การเล่น Ultima Online บนเซิร์ฟเวอร์ POL ที่ไม่เป็นทางการนี่เองที่พาผมเข้าสู่วงการ IT แบบตรงตัว ก่อนหน้านั้นผมกำลังเรียนเพื่อจะเป็นนักบัญชี
มันนี่แหละที่ทำให้ผมเข้า IRC เป็นครั้งแรก และต่อมาก็ไปถึง freenode
วงการ emulator ของ UO นี่แหละที่พาผมไปสู่การเขียนโปรแกรมเครือข่าย
ผมไม่เคยเห็นเกมออนไลน์เกมไหนที่เก็บกลไกการเล่นแบบผลพลอยได้ การเกิดขึ้นเอง และความบังเอิญไว้ได้ดีเท่านี้
หลังจากนั้น MMO แบบ 3D ดูเหมือนจะลดทอนองค์ประกอบด้านเศรษฐกิจ การก่อสร้าง และการสำรวจที่น่าสนใจแบบที่ UO เคยให้ไว้ไปมาก
เรื่อง PvP หรือคอนเทนต์แนวเควสต์ เกมอื่นอาจทำได้ดีกว่า แต่ UO ยังมีเสน่ห์ตรงที่คุณจะเล่นคนเดียว เล่นเป็นกลุ่ม หรือแค่ปฏิสัมพันธ์เบา ๆ กับคนแปลกหน้า แล้วค่อยไหลไปมาได้ตามอารมณ์อย่างเป็นธรรมชาติ
คนส่วนใหญ่ไม่ได้ต้องการอะไรแบบนี้ และชอบอยู่บน รางที่กำหนดไว้ มากกว่า
และสองกลุ่มที่ถูกดึงดูดเข้าหาเกมแบบนี้มากที่สุดก็มักติดอยู่ในพลวัตที่ถ้ามีกลุ่มหนึ่งอยู่ อีกกลุ่มก็จะเลิกเล่นเกมไป แต่กลุ่มที่สองกลับต้องอาศัยให้กลุ่มแรกเล่นอยู่
อย่างเช่น Asheron's Call มีชุมชนม็อดที่คึกคักมาก และตอนนี้ก็มีวงการ emulator ด้วย เพียงแต่ความนิยมของเซิร์ฟเวอร์ดูจะไม่ถึงระดับ UO
ส่วน Shadowbane เน้นกิลด์อย่างมาก แต่ก็สนุกในแบบเป็นพวกนอกกฎหมายหน่อย ๆ ที่ออกไป PvP กับคนหรือกิลด์ไหนก็ได้แบบสุ่ม
นอกจาก WoW, Old School RuneScape, Final Fantasy Online แล้ว ก็เหมือนไม่ค่อยมีอะไรใหญ่ ๆ ให้เล่นนัก
ช่วงที่เล่าว่าทำโปรเจ็กต์นี้แบบ ๆ หยุด ๆ มา 10 ปี แล้วสุดท้ายเพิ่งทำงานที่ดูไม่มีวันจบให้เสร็จได้เพราะ ความก้าวหน้าของ LLM ช่วงหลัง ทำให้ผมประทับใจมาก
ผมเองก็กำลังทำโปรเจ็กต์ decompile MFC C++ อยู่ และ LLM มีประโยชน์แบบเหลือเชื่อกับงานแนวนี้
เมื่อก่อนผมเล่น Ultima Online เยอะเหมือนกัน
ช่วงหลังมานี้ผมสนุกกับการเขียนสคริปต์ Python ในเกมไคลเอนต์ TazUO มาก มันเป็น Python 3 เวอร์ชันค่อนข้างเก่า แต่ก็ยังดีกว่าการเขียนสคริปต์บน Razor หรือ SteamUO มาก
ถ้าใครอยากลองทำอะไรเงียบ ๆ บนชาร์ดซิงเกิลเพลเยอร์ Memento ก็โอเคดี
ผมกำลังตามหา เวอร์ชันมือถือที่แปลเป็นสเปนหรือฝรั่งเศส ของ Ultima 4 ฉบับ NES รวมถึงภาคอื่น ๆ ด้วย
อยากได้ในรูปแบบที่จัดการคล้าย Pixel Remaster ของซีรีส์ FF
ตอนนี้ยังเล่นได้ผ่าน emulator เท่านั้น
RPG ที่มีข้อความเยอะและผ่านการแปลแล้วเป็นวิธีที่ง่ายมากในการ “เรียนภาษาต่างประเทศผ่านการเล่น” และยังเหมาะกับการอ่านด้วย
คงดีมากถ้ามีคนทำสิ่งนี้ขึ้นมา
อา UO… เป็นความทรงจำที่ดีจริง ๆ ผมยังจำได้ว่าตอนนั้นยังไม่ถึงวัยที่จะมีบัตร เลยปั่นจักรยานไปที่ Cybersmith ใน Palo Alto เพื่อซื้อ เวลาแบบเติมเงินล่วงหน้า
สมัยก่อนผมเล่นจริงจังพอสมควรบนชาร์ด Napa Valley แต่ไม่กล้าพอจะไป Catskills
ทุกวันนี้ยังคิดถึงประสบการณ์แบบ UO อยู่ แต่ก็ไม่มีเวลาทุ่มให้เกมแนวนั้นเลยจริง ๆ