- OUO adalah proyek yang sepenuhnya merekayasa balik server demo
Ultima Online tahun 1998, membongkar sekitar 5.000 fungsi dari biner MSVC x86 dan memindahkannya ke C99 yang portabel
UoDemo.exe adalah demo mandiri yang disertakan dalam rilis pertama Ultima Online: The Second Age, dan berisi klien bersama seluruh kode serta data server yang telah di-port ke Windows
- Setiap fungsi dibandingkan dengan biner asli pada tingkat instruksi, lalu ditransformasikan secara manual agar mempertahankan hierarki kelas dan layout vtable yang sama, serta alur kontrol, layout struct, dan percabangan yang identik dengan aslinya
- Hasil restorasi ini sangat dekat dengan kode server
Ultima Online live sungguhan pada pertengahan 1998, tetapi masalah stabilitas seperti crash, overflow, dan variabel yang tidak diinisialisasi, serta masalah gameplay seperti kenaikan skill dan kepadatan spawn, telah diperbaiki dengan tag penanda
- Demo asli hanya mendukung klien 1.25.33, tetapi hasil restorasi mendukung klien dari 1.25.30 hingga 5.0.9.1 baik dengan maupun tanpa enkripsi, dan juga sedang mencari file data server dari 1997~2003
Asal dan cakupan file demo
- Setiap fungsi dibandingkan dengan biner asli pada tingkat instruksi, dan pekerjaan yang berlangsung secara terputus-putus selama 10 tahun ini akhirnya dapat diselesaikan berkat perkembangan LLM belakangan ini
- Tanggal
UoDemo.exe adalah 1998-09-02, dan data servernya diekstrak dari server operasional pada 2 Juni 1998
- Untuk keperluan demo, sebagian fitur dijadikan stub dan peta yang bisa dimainkan dipersempit menjadi pulau Ocllo, tetapi selebihnya adalah kode server produksi yang benar-benar berjalan di
Ultima Online live pada pertengahan 1998
Ultima Online adalah MMORPG tahun 1997 yang dikembangkan oleh Origin Systems Inc., dan merupakan salah satu MMORPG awal yang sukses secara komersial
- Klien berjalan di Windows, sedangkan server yang disebut “shards” berjalan di beberapa mesin Solaris, dengan peta yang dibagi per wilayah
- Demo ini menawarkan quest sederhana untuk membunuh naga di pulau Ocllo, dan dirancang agar pemain bisa menjelajahi mekanik dasar game seperti percakapan, perdagangan, dan pertarungan
- Beberapa emulator server
UO memang menggunakan kembali sebagian demo ini, tetapi sampai sekarang belum ada yang merekayasa baliknya secara lengkap
UoDemo.exe dikompilasi dengan Microsoft Visual C++ 5.0, yaitu Visual Studio 97, dan menargetkan dialek C++ sebelum C++98
Metode rekayasa balik
-
Disassembly dan perkiraan simbol
- radare2 digunakan untuk disassembly
- Nama simbol diturunkan dari klien
UO port Linux eksperimental versi 1.25.37 yang masih menyertakan simbol C++
-
Konversi manual ke C99
- Setiap fungsi diterjemahkan secara manual ke C99 agar mempertahankan alur kontrol, layout struct, dan percabangan yang sama seperti biner asli
- Bagian yang berbeda merupakan perbaikan bug nyata pada demo atau penyesuaian platform, dan semuanya ditandai di dalam source
-
Cara verifikasi
- Hasil build C didisassemble ulang dengan
r2 lalu dibandingkan dengan aslinya
- Fungsi hanya ditandai selesai ketika kedua hasil itu cocok
- Fungsi helper hanya dipakai untuk pola inline berulang, dan hanya digunakan bila helper tersebut bisa diekspansi kembali menjadi kode yang sama dengan versi inline-nya
-
Pemulihan hierarki kelas
- Salah satu pekerjaan paling penting pada tahap awal adalah mencocokkan hierarki kelas secara akurat
- Hierarki intinya adalah
CEntity (0x10) -> CResourceEntity (0x1C) -> CItem (0x50) -> CContainer (0x5C) -> CMobile (0x37C) -> CPlayer (0x458)
- Dispatch virtual dilakukan melalui slot vtable; misalnya
vtable[0x18] adalah IsPlayer, [0xD0] adalah IsMobile, dan [0xE4] adalah IsNPC
- Setelah layout ini dipastikan, sebagian besar biner bisa diterjemahkan dengan cukup langsung
Hasil restorasi dan perbedaannya dengan versi asli
- Hasil akhirnya sangat mendekati replika nyaris sempurna dari server
Ultima Online tahun 1998, meskipun ada beberapa perbedaan
- Dibandingkan kode asli, masalah stabilitas seperti crash, overflow, dan variabel yang tidak diinisialisasi telah diperbaiki
- Masalah gameplay seperti kenaikan skill, arah fame/notoriety, dan kepadatan spawn juga telah dibetulkan
- Setiap perbaikan diberi tag di source, sehingga siapa pun yang membandingkannya dengan
UoDemo.exe bisa melihat dengan tepat apa yang berubah dan alasannya
- Beberapa fitur seperti sistem spawn dan sistem decay sempat rusak, dan kemungkinan sebagian dinonaktifkan atau dijadikan stub untuk rilis demo
- Kode untuk fitur-fitur tersebut masih ada, tetapi titik pemanggilan aktifnya tidak bisa dicapai; fitur itu bisa dihidupkan kembali hanya dengan mendekompilasi secara terpisah lalu menyambungkan ulang dispatch-nya
- Sebagian data memang hilang, misalnya peta game hanya memuat pulau Ocllo
- Telah dibuat seperangkat alat lengkap untuk memanipulasi format data server, dan berhasil merekonstruksi sepenuhnya pintu, papan tanda, dekorasi, teleporter, jebakan, peti, dan lokasi spawn untuk seluruh dunia yang tersisa
Sistem ekologi yang masih tersisa
- Ecology system yang terkenal dan kini telah ditinggalkan masih tetap ada di dalam kode, meskipun rantai pemanggilan fungsinya sudah terputus
- Sistem predator, mangsa, dan pemakan bangkai berhasil disambungkan kembali sehingga kini bisa terlihat serigala memburu kelinci atau gagak memakan item
- Namun, karena data yang akurat tidak cukup, sistem sumber daya dan produksi secara penuh belum diimplementasikan
- Sebagai latar belakang terkait, turut ditautkan tulisan Raph Koster tentang ecology system
UO serta artikel tentang sistem sumber daya UO 1, 2, 3
Fitur tambahan dan kompatibilitas klien
- Skill Meditation, Stealth, dan Remove Trap yang ditambahkan OSI pada Februari 1999 ikut dimasukkan
- Sebagian jejak awal fitur-fitur ini sebenarnya sudah tersisa di dalam kode
- Sebagian besar fitur baru bisa diaktifkan atau dinonaktifkan saat startup melalui parameter
-features
- Karena server demo sama sekali tidak memiliki sistem akun, sistem itu diimplementasikan ulang dalam bentuk yang sedikit dimodernisasi berdasarkan perkiraan cara pengembang aslinya akan membuatnya
- Server demo asli hanya mendukung klien 1.25.33, tetapi kini diperluas agar mendukung semua klien dari 1.25.30 hingga 5.0.9.1, yaitu sampai 2007-03-27, baik dengan maupun tanpa enkripsi
- Karena ada lima skema enkripsi yang benar-benar berbeda selama rentang beberapa tahun itu, masing-masing harus direkayasa balik dari biner klien
Asli 32-bit dan build default 64-bit
- Biner aslinya adalah 32-bit, tetapi build default saat ini menargetkan 64-bit
- Hierarki kelas direproduksi melalui embedding struct C untuk meniru pewarisan C++ aslinya
- Pendekatan ini memungkinkan
CMobile* diteruskan ke tempat yang membutuhkan CContainer*
- Karena lebar pointer yang lebih besar pada 64-bit bisa menggeser posisi field turunan, beberapa struct sengaja diberi padding agar layout pewarisan dan vtable tetap cocok dengan biner baik di 32-bit maupun 64-bit
Sumber daya publik
- https://github.com/draxinar/ouo: kode
- https://github.com/draxinar/rundir: data berbasis
UoDemo.dat, modifikasi, data lengkap, dan fitur baru
- https://uo.serpent-isle.com/: Test Center, bukan shard sungguhan, melainkan lingkungan untuk menguji rekreasi server
Ultima Online 1998 yang sangat setia
- UO:98: proyek Batlin dan Derrick yang menjadi sumber inspirasi untuk memulai pekerjaan ini pada 2016
OUO masih berada pada tahap awal dan mungkin masih menyisakan masalah
- Masalah yang ditemukan bisa dilaporkan melalui issue, dan kontribusi juga disambut
Permintaan kepada komunitas Ultima Online
- Siapa pun yang memiliki file
dynamic0.mul, dynamic0.bkp, regions.txt, atau resbank.mul dari server Ultima Online asli sekitar 1997~2003 diminta untuk membagikannya
dynamic0.mul dan dynamic0.bkp adalah file penyimpanan server, regions.txt berisi definisi spawn, dan resbank.mul adalah file definisi sumber daya
- Kemungkinan file asli
dynamic0.mul atau dynamic0.bkp benar-benar hilang tampaknya kecil
- Alat untuk menghapus data pemain dari file
dynamic0.mul demi menjaga privasi sebelum didistribusikan sudah tersedia
- File-file ini sangat berharga untuk merekonstruksi konten dunia
Ultima Online dengan akurasi sangat tinggi
1 komentar
Komentar Hacker News
Kalau ada yang punya file dynamic0.mul, dynamic0.bkp, regions.txt, atau resbank.mul dari server Ultima Online asli, saya akan sangat berterima kasih jika bisa mengirimkannya
Itu adalah file save game server, definisi spawn, dan definisi resource dari sekitar 1997–2003, dan terutama dynamic0.mul atau dynamic0.bkp kemungkinan pernah dibackup di banyak tempat aman, jadi rasanya sulit percaya semuanya benar-benar hilang
File-file ini sangat bernilai untuk merekonstruksi konten dunia Ultima Online dengan sangat akurat
Keren sekali. Kebetulan saya sedang mendengarkan soundtrack game Ultima lama saat melihat ini
Saya penasaran apakah pernah dipertimbangkan untuk menulis hasil disassembly dalam dialek C++ pra-C++98 yang dipakai aslinya dan menargetkan compiler originalnya
Saya pernah mendisassembly biner yang berjalan di sistem lawas, dan kalau memungkinkan rasanya saya akan menargetkan toolchain aslinya. Ini pertanyaan filosofis yang cukup menarik
Sebagai pengembang terakhir yang masih bertahan dari eqclassic, saya membacanya dengan antusias, tetapi berharap ada cerita yang lebih mendalam tentang alat yang dipakai dan seperti apa keseluruhan prosesnya. Meski begitu, tulisannya tetap bagus
Waktu itu belum ada LLM, tetapi ada sedikit bantuan dari beberapa debug symbol yang keluar dari biner PowerPC tiga tahun kemudian
Nama file seperti packet_handler atau entitylist terasa anehnya familiar :D
Gerbang terakhirnya adalah memiliki kode jaringan yang pada dasarnya sempurna sebelum merapikan sisanya, dan saya sudah menghabiskan ratusan jam di sini
Saya cuma sempat melihat sekilas source-nya, tetapi semuanya tampak berbasis TCP, jadi sepertinya tidak ada mekanisme reliability terpisah di atasnya. Kalau begitu, itu terasa seperti pilihan yang cukup “lambat” untuk MMO pada masa itu, dan itu menarik
Bagi yang ingin mencoba UO, game ini masih punya basis pemain aktif. Server pihak ketiga seperti UO Outlands lebih dekat ke gameplay aslinya, tetapi menurut standar pemain MMO masa kini cukup keras
Pemain lain bisa datang, melakukan gank, dan Anda bisa kehilangan perlengkapan
Bahkan sekarang masih ada lebih dari 2500 pemain yang sedang online di server itu, jadi masih sangat hidup
Pencapaian pemrograman pertama saya yang benar-benar nyata adalah membuat situs web shard Ultima Online
Saya memakai PHP dan HTML yang buruk, tetapi setelah itu tetap berjalan lebih dari 20 tahun. Kenangan yang indah
Saya kaget masih ada komunitas aktif di sekitar UO, dan bagaimanapun proyek ini benar-benar keren
Waktu itu saya berusia 12–13 tahun, akhir 90-an sampai awal 2000-an. Saya sudah tidak ingat nama emulatornya, tetapi kemungkinan besar POL
Tujuan shard itu adalah sedekat mungkin dengan server resmi sebelum UO:Renaissance, jadi kami banyak bekerja agar tampil dan terasa seperti T2A
Saya belajar banyak, dan setelah RunUO muncul dan mulai agak stabil sekitar 2003, saya juga membantu memindahkan hal-hal yang kami buat di POL menjadi kode C# untuk RunUO, dan saya harus belajar lebih banyak agar bisa mengikuti
Orang-orang yang bekerja dengan saya di shard itu semuanya kuliah ilmu komputer atau sudah bekerja sebagai programmer, sementara saya cuma anak kecil yang bisa menulis beberapa script
Saya rasa pengalaman ini sangat menentukan hingga saya akhirnya menjadi profesional. Pekerjaan pertama saya di perusahaan teknologi sungguhan juga saya dapat karena salah satu dari mereka merekomendasikan saya saat ada posisi magang
Dalam arti tertentu, UO dan shard privat itulah yang membentuk karier saya sekarang
Saya mulai belajar pemrograman murni karena kebutuhan
Saya lupa nama gamenya, tetapi mungkin City of Heroes, dan setelah ditutup selama beberapa tahun, suatu hari seseorang menyalakan lagi server privatnya
Game online Shockwave lama juga punya komunitas niche yang membangun ulang server, runtime Shockwave, dan decompiler
Karena mereka memecahkan masalah yang mirip, komunitas antargame pun saling tumpang tindih ;)
Yang kedua adalah mengubah peta, seperti menghapus item statis dan menambahkan pulau serta bangunan baru
Yang ketiga adalah memodifikasi verdata.mul untuk menambahkan animasi baru dan grafis item
Bermain Ultima Online di server POL tidak resmi benar-benar membawa saya masuk ke dunia IT. Sebelumnya saya sedang belajar untuk menjadi akuntan
Gara-gara itu saya pertama kali masuk IRC, lalu belakangan sampai ke freenode
Scene emulator UO yang membawa saya ke network programming
Saya belum pernah melihat game online lain yang berhasil menangkap begitu banyak mekanisme gameplay sampingan, emergent, dan kebetulan seperti ini
MMO 3D setelahnya tampaknya banyak menurunkan elemen ekonomi, pembangunan, dan eksplorasi menarik yang dulu ditawarkan UO
PvP atau hal-hal seperti quest mungkin dilakukan lebih baik oleh game lain, tetapi UO tetap memikat karena Anda bisa bermain sendiri, dalam grup, atau berinteraksi santai dengan orang asing lalu berpindah secara alami sesuai suasana hati
Kebanyakan orang tidak menginginkan ini dan lebih suka berada di atas rel yang sudah ditentukan
Dan dua kelompok yang paling tertarik pada game seperti ini cenderung masuk ke dinamika di mana kehadiran satu pihak membuat pihak lain meninggalkan game. Padahal kelompok kedua membutuhkan kelompok pertama agar mau bermain
Misalnya Asheron's Call punya komunitas mod yang sangat aktif dan sekarang juga ada scene emulator. Hanya saja, popularitas servernya tampaknya tidak sebesar UO
Shadowbane sangat berpusat pada guild, tetapi ada keseruan tersendiri dalam bermain agak seperti penjahat dan melakukan PvP dengan orang atau guild secara acak
Selain WoW, Old School RuneScape, dan Final Fantasy Online, rasanya tidak banyak yang benar-benar besar untuk dimainkan
Bagian tentang mengerjakan proyek ini secara berkala selama 10 tahun, lalu akhirnya bisa menyelesaikan pekerjaan yang sebelumnya terasa tak berujung berkat kemajuan LLM baru-baru ini, sangat berkesan
Saya juga sedang mengerjakan proyek dekompilasi MFC C++, dan LLM luar biasa berguna untuk pekerjaan seperti ini
Dulu saya menikmati Ultima Online
Belakangan ini saya senang membuat script Python di klien game TazUO. Versi Python 3-nya memang agak tua, tetapi jauh lebih baik daripada menulis script di Razor atau SteamUO
Kalau ingin mencoba-coba berbagai hal di shard single-player yang tenang, Memento lumayan bagus
Saya sedang mencari versi mobile berlokalisasi bahasa Spanyol atau Prancis untuk Ultima 4 versi NES. Juga untuk judul-judul lainnya
Saya ingin bentuk penanganan seperti Pixel Remaster pada seri FF
Saat ini hanya bisa dimainkan lewat emulator
RPG berlokalisasi dengan banyak teks adalah cara yang sangat mudah untuk “belajar sambil bermain” bahasa asing, dan juga enak untuk membaca
Akan bagus kalau hal seperti ini dibuat
Ah, UO… benar-benar kenangan yang indah. Saya masih ingat bersepeda ke Cybersmith di Palo Alto untuk membeli waktu prabayar karena saya belum cukup umur untuk punya kartu
Dulu saya cukup serius bermain di shard Napa Valley. Saya tidak cukup berani untuk pergi ke Catskills
Sekarang saya merindukan pengalaman seperti UO, tetapi sama sekali tidak punya waktu untuk mencurahkan diri ke game seperti itu