1 poin oleh GN⁺ 1 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 1 jam lalu
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

    • UO Outlands rasanya bahkan dikelola lebih baik daripada UO asli. Discord-nya juga cukup aktif dan penggunanya sekitar 20 ribu orang
  • 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

    • Mirip juga, saya mulai dengan membantu membuat situs web dan mengurus instalasi forum, lalu orang-orang yang menjalankan shard itu akhirnya mempercayakan kode emulator kepada saya juga
      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
    • Kalau saya, semuanya dimulai dari alat bantu bernama UOInject untuk mengotomatisasi penambangan bijih. Sepertinya bahasanya Visual Basic
      Saya mulai belajar pemrograman murni karena kebutuhan
    • Kalau itu MMO atau game online, komunitas server privat selalu terus bermunculan
      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 ;)
    • Pencapaian pemrograman pertama saya yang benar-benar nyata juga adalah situs web shard Ultima Online
      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
    • Situs web pertama saya adalah untuk guild saya di Chesapeake, dan proyek “pemrograman sungguhan” pertama saya adalah script seadanya untuk menaikkan berbagai skill dengan macro
      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

    • Sayangnya, dua hal ternyata benar
      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
    • Beberapa MMORPG 3D lama memang mencoba memasukkan mekanisme seperti itu
      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
    • Mungkin masih ada peluang di sana. Sejujurnya, saat ini tidak banyak pergerakan di pasar MMO
      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

    • Saya penasaran apakah LLM dipakai dengan cara yang terotomatisasi untuk pekerjaan ini. Juga penasaran apakah dijalankan secara lokal atau di cloud
  • 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

    • Saya penasaran kenapa bukan Catskills. Apakah berbeda? Atau mungkin yang Anda maksud sebenarnya Siege Perilous, yang punya ruleset lebih sulit?