1 puan yazan GN⁺ 1 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • OUO, 1998 tarihli Ultima Online demo sunucusunu tamamen tersine mühendislikle yeniden oluşturan bir proje; MSVC x86 ikilisindeki yaklaşık 5.000 işlev disassemble edilerek taşınabilir C99 koduna aktarıldı
  • UoDemo.exe, Ultima Online: The Second Age ilk sürümüne dahil edilen bağımsız bir demoydu ve istemciyle birlikte Windows'a taşınmış tam sunucu kodu ve verilerini içeriyordu
  • Her işlev, özgün ikiliyle komut düzeyinde karşılaştırıldı; sınıf hiyerarşisi ve vtable düzeni eşleştirildikten sonra özgünle aynı kontrol akışı, struct düzeni ve dallanmaları koruyacak şekilde elle dönüştürüldü
  • Yeniden oluşturulan sürüm, 1998 ortasındaki gerçek canlı Ultima Online sunucu koduna çok yakın; ancak çökme, taşma ve başlatılmamış değişkenler gibi kararlılık sorunları ile skill artışı ve spawn yoğunluğu gibi oynanış sorunları etiketlenerek düzeltilmiş durumda
  • Orijinal demo yalnızca istemci 1.25.33'ü destekliyordu; yeniden oluşturulan sürüm ise istemcileri 1.25.30'dan 5.0.9.1'e kadar, şifreleme olsun ya da olmasın destekliyor ve ayrıca 1997~2003 dönemine ait sunucu veri dosyaları isteniyor

Demo dosyasının kaynağı ve kapsamı

  • Her işlev özgün ikiliyle komut düzeyinde karşılaştırıldı ve 10 yıla yayılan kesintili çalışmanın ardından süreç yakın dönemdeki LLM gelişmeleri sayesinde tamamlanabildi
  • UoDemo.exe tarihi 1998-09-02, sunucu verileri ise 2 Haziran 1998 tarihli canlı sunucudan alınmıştı
  • Demo için bazı özellikler stub haline getirildi ve oynanabilir harita Ocllo adasına indirildi; bunun dışındaki kısım, 1998 ortasında gerçek canlı Ultima Online üzerinde çalışan üretim sunucu koduydu
  • Ultima Online, Origin Systems Inc. tarafından geliştirilen 1997 çıkışlı bir MMORPG idi ve ticari olarak başarılı ilk MMORPG'lerden biriydi
  • İstemci Windows'ta çalışıyordu, sunucular yani “shard”lar birden fazla Solaris makinede çalışıyordu ve harita bölgelere ayrılmıştı
  • Demo, Ocllo adasında ejderha öldürmeye yönelik basit bir görev sunuyor ve diyalog, ticaret, savaş gibi temel oyun mekaniklerini deneyimlemeye imkân veriyordu
  • Çeşitli UO sunucu emülatörleri bu demonun bazı parçalarını yeniden kullandı, ancak bugüne kadar tamamen tersine mühendisliği yapılmamıştı
  • UoDemo.exe, Microsoft Visual C++ 5.0 yani Visual Studio 97 ile derlenmişti ve C++98 öncesi bir C++ lehçesini hedefliyordu

Tersine mühendislik yöntemi

  • Disassembly ve sembol tahmini

    • Disassembly için radare2 kullanıldı
    • Sembol adları, C++ sembolleri içeren deneysel Linux portu UO istemcisi 1.25.37'den çıkarıldı
  • Elle C99 dönüşümü

    • Her işlev, özgün ikiliyle aynı kontrol akışını, struct düzenini ve dallanmaları koruyacak şekilde elde C99'a çevrildi
    • Farklı olan kısımlar, demonun gerçek hatalarının düzeltilmesi veya platform uyarlamalarıydı ve kaynakta işaretlendi
  • Doğrulama yöntemi

    • C derlemesi yeniden r2 ile disassemble edilip özgünle karşılaştırıldı
    • Yalnızca iki sonuç eşleştiğinde bir işlev tamamlanmış sayıldı
    • Yardımcı işlevler sadece tekrar eden inline kalıplar için kullanıldı ve ancak yardımcı işlev inline sürümle aynı koda yeniden açıldığında kabul edildi
  • Sınıf hiyerarşisinin yeniden kurulması

    • İlk aşamada en kritik iş, sınıf hiyerarşisini tam olarak eşleştirmekti
    • Temel hiyerarşi CEntity (0x10) -> CResourceEntity (0x1C) -> CItem (0x50) -> CContainer (0x5C) -> CMobile (0x37C) -> CPlayer (0x458) idi
    • Sanal dispatch, vtable slotları üzerinden yapılıyordu; örneğin vtable[0x18] IsPlayer, [0xD0] IsMobile, [0xE4] ise IsNPC idi
    • Bu düzen netleştikten sonra ikilinin büyük bölümü nispeten doğrudan çevrilebildi

Yeniden oluşturma sonucu ve özgünle farkları

  • Ortaya çıkan sonuç, 1998 tarihli Ultima Online sunucusunun neredeyse kusursuz bir kopyasına yakın; ancak bazı farklar var
  • Özgün koda kıyasla çökme, taşma ve başlatılmamış değişkenler gibi kararlılık sorunları düzeltildi
  • Skill artışı, fame/notoriety yönü ve spawn yoğunluğu gibi oynanış sorunları da giderildi
  • Her düzeltme kaynakta etiketlendiği için UoDemo.exe ile karşılaştırma yapanlar neyin neden değiştiğini tam olarak görebiliyor
  • Spawn sistemi ve decay sistemi gibi bazı özellikler bozuktu; demo sürümü için kısmen devre dışı bırakılmış veya stub haline getirilmiş olmaları muhtemel
  • Bu özelliklerin kodu duruyordu ancak canlı çağrı noktaları erişilemezdi; ayrı ayrı decompile edilip dispatch yeniden bağlanınca çalıştırılabildiler
  • Oyun haritasında yalnızca Ocllo adasının bulunması gibi bazı veriler eksikti
  • Sunucu veri formatlarını işlemek için tam bir araç takımı oluşturuldu ve dünyanın geri kalanındaki kapılar, tabelalar, süslemeler, teleportlar, tuzaklar, sandıklar ve spawn konumları tamamen yeniden kuruldu

Geriye kalan ekoloji sistemi

  • Emekliye ayrılmış ünlü ecology system, işlev çağrıları kopmuş olsa da kod içinde hâlâ duruyordu
  • Yırtıcı, av ve leşçi sistemi yeniden bağlanarak kurtların tavşanları kovalaması veya kargaların eşyaları yemesi yeniden görülebilir hale geldi
  • Ancak yeterli doğru veri olmadığından tam kaynak/üretim sistemi uygulanmadı
  • İlgili arka plan kaynakları olarak Raph Koster'ın UO ecology system yazısı ile UO kaynak sistemi yazıları 1, 2, 3 bağlantılanıyor

Ek özellikler ve istemci uyumluluğu

  • OSI'nin Şubat 1999'da eklediği Meditation, Stealth ve Remove Trap skill'leri yeni sürüme dahil edildi
  • Bu özelliklerin bazı erken izleri kodda zaten mevcuttu
  • Yeni özelliklerin çoğu başlangıçta -features parametresiyle açılıp kapatılabiliyor
  • Demo sunucuda hesap sistemi tamamen bulunmadığından, özgün geliştiricilerin bunu nasıl yapmış olabileceği tahmin edilerek hafif modernleştirilmiş bir biçimde yeniden uygulandı
  • Orijinal demo sunucusu sadece istemci 1.25.33'ü destekliyordu; ancak bu sürüm, 1.25.30'dan 5.0.9.1'e yani 2007-03-27 tarihine kadarki tüm istemcileri şifrelemeli ya da şifrelemesiz destekleyecek şekilde genişletildi
  • Yıllar içinde tamamen farklı beş ayrı şifreleme yöntemi kullanıldığından, her biri istemci ikilisinden tersine mühendislikle çıkarılmak zorunda kaldı

32 bit özgün ve 64 bit varsayılan derleme

  • Özgün ikili 32 bittiydi, ancak güncel varsayılan derleme 64 biti hedefliyor
  • Sınıf hiyerarşisi, özgün C++ kalıtımını yeniden üretmek için C struct gömme yöntemiyle kuruldu
  • Bu sayede CMobile*, CContainer* beklenen yerlere geçirilebiliyor
  • 64 bitte pointer genişliği arttığında kalıtılan alanların konumu kayabildiği için, bazı struct'lar hem 32 bit hem 64 bitte kalıtım ve vtable düzeni ikiliyle uyumlu olsun diye bilinçli olarak padding ile ayarlandı

Açık kaynaklar

  • https://github.com/draxinar/ouo: kod
  • https://github.com/draxinar/rundir: UoDemo.dat tabanlı veriler, düzeltmeler, tamamlanmış veri setleri ve yeni özellikler
  • https://uo.serpent-isle.com/: Test Center; gerçek bir shard değil, 1998 Ultima Online sunucusunun çok sadık bir yeniden üretimini denemeye yönelik ortam
  • UO:98: Batlin ve Derrick'in projesi; bu çalışmaya 2016'da başlama ilhamını veren kaynak
  • OUO hâlâ erken aşamada ve sorunlar kalmış olabilir
  • Bulunan sorunlar issue olarak bildirilebilir, katkılar da memnuniyetle karşılanıyor

Ultima Online topluluğuna çağrı

  • 1997~2003 civarına ait özgün Ultima Online sunucusunun dynamic0.mul, dynamic0.bkp, regions.txt, resbank.mul dosyalarına sahip olanların bunları paylaşması isteniyor
  • dynamic0.mul ve dynamic0.bkp sunucu kayıt dosyaları, regions.txt spawn tanımları, resbank.mul ise kaynak tanım dosyası
  • Özgün dynamic0.mul veya dynamic0.bkp dosyalarının tamamen kaybolmuş olma ihtimali düşük görünüyor
  • dynamic0.mul içinden oyuncu verilerini kaldırarak gizliliği koruyup dağıtıma uygun hale getiren araçlar zaten hazırlanmış durumda
  • Bu dosyalar, Ultima Online dünyasının içeriğini son derece doğru biçimde yeniden üretmek için büyük değer taşıyor

1 yorum

 
GN⁺ 1 시간 전
Hacker News yorumları
  • Elinde orijinal Ultima Online sunucusunun dynamic0.mul, dynamic0.bkp, regions.txt, resbank.mul dosyaları olan varsa göndermesine gerçekten çok minnettar olurum
    Bunlar yaklaşık 1997~2003 dönemine ait sunucu kayıt oyunları, spawn tanımları ve kaynak tanım dosyaları; özellikle dynamic0.mul ya da dynamic0.bkp büyük ihtimalle birden fazla güvenli yerde yedeklenmiştir, bu yüzden tamamen kaybolmuş olduklarını varsaymak zor
    Bu dosyalar Ultima Online dünyasının içeriğini çok doğru biçimde yeniden üretmek için son derece değerli

  • Gerçekten harika. Tam da eski Ultima oyun müziklerini dinlerken bunu görmüş olmam çok ilginç
    Disassembly çıktısını orijinalde kullanılan C++98 öncesi C++ lehçesiyle yazmayı ve asıl derleyiciyi hedeflemeyi düşünüp düşünmediklerini merak ediyorum
    Eski sistemlerde çalışan binary’leri daha önce disassemble etmiştim; mümkün olsaydı ben de muhtemelen orijinal toolchain’i hedeflerdim. Oldukça ilginç, felsefi bir soru

  • eqclassic’in hayatta kalan son geliştiricisi olarak bunu ilgiyle okudum ama araçları nasıl kullandıkları ve sürecin genel olarak nasıl ilerlediği hakkında daha derin bir hikâye bekliyordum. Yine de güzel bir yazı
    O zamanlar LLM yoktu ama 3 yıl sonraki bir PowerPC binary’sinden çıkan bazı debug symbol’ları vardı, biraz yardımcı olmuştu
    packet_handler ya da entitylist gibi dosya adları tuhaf şekilde tanıdık geliyor :D
    Son eşik, geri kalanı cilalamadan önce fiilen kusursuza yakın bir ağ koduna sahip olmak oluyor; ben buna şimdiden yüzlerce saat harcadım
    Kaynağa sadece biraz göz attım ama her şey TCP tabanlı görünüyor; üstüne ayrı bir güvenilirlik mekanizması bindirilmişe benzemiyor. Eğer öyleyse, döneminin MMO’ları için oldukça “yavaş” bir tercih gibi hissettirdiğinden ilginç

  • UO’yu denemek isteyen biri için hâlâ aktif bir oyuncu kitlesi olan bir oyun. UO Outlands gibi üçüncü taraf sunucular orijinal oynanışa daha yakın ama günümüz MMO’larına alışkın ölçütlerle bakınca oldukça acımasız
    Başka oyuncular gelip sizi gank’leyebilir ve ekipmanınızı kaybedebilirsiniz
    Şu anda bile o sunucuda 2500’den fazla kişi çevrimiçi, yani hâlâ çok canlı

    • UO Outlands, orijinal UO’dan daha iyi işletiliyor gibi hissettiriyor. Discord’u da oldukça aktif ve yaklaşık 20 bin kullanıcısı var
  • İlk gerçek programlama başarım, bir Ultima Online shard web sitesi yapmaktı
    Berbat PHP ve HTML kullanmıştım ama sonrasında 20 yıldan uzun süre çalıştı. Güzel anılar
    UO etrafında hâlâ canlı bir topluluk olması beni şaşırttı ve her durumda bu proje gerçekten harika

    • Benzer şekilde, web sitesi yapımına yardım edip forum kurulumlarını yönetiyordum; sonra shard’ı işletenler emulator kodunu da bana emanet etmeye başladı
      O zamanlar 12~13 yaşındaydım, 90’ların sonu ile 2000’lerin başıydı. Emulator’un adını artık hatırlamıyorum ama muhtemelen POL’dü
      Shard’ın amacı resmi sunucuları UO:Renaissance öncesi hâline olabildiğince yaklaştırmaktı; bu yüzden T2A gibi görünmesi ve hissettirmesi için epey uğraştık
      Çok şey öğrendim; sonra RunUO çıkıp 2003 civarında biraz istikrar kazanınca, POL’de yaptığımız şeyleri RunUO için C# koduna taşımaya da yardım ettim ve ayak uydurmak için daha çok şey öğrenmem gerekti
      O shard’da birlikte çalıştığım insanların hepsi ya üniversitede bilgisayar bilimi okuyordu ya da zaten programcı olarak çalışıyordu; ben ise birkaç script yazabilen bir çocuktum
      Bence bu deneyim sonradan profesyonel olmamda belirleyici oldu. Gerçek bir teknoloji şirketindeki ilk işimi de o kişilerden biri staj pozisyonu açılınca beni tavsiye ettiği için aldım
      Bir bakıma bugünkü kariyerim UO ve özel shard’lar sayesinde oluştu
    • Benim için başlangıç, UOInject adlı yardımcı araçla cevher madenciliğini otomatikleştirmek olmuştu. Dili sanırım Visual Basic’ti
      Programlamaya tamamen ihtiyaçtan başladım
    • MMO ya da çevrimiçi oyun oldu mu, özel sunucu toplulukları bitmek bilmeden ortaya çıkıyor
      Oyunun adını unuttum ama sanırım City of Heroes’tu; yıllarca kapalı kaldıktan sonra bir gün biri özel sunucuyu yeniden ayağa kaldırdı
      Eski Shockwave çevrimiçi oyunları için de niş topluluklar sunucuları yeniden kuruyor, Shockwave runtime’ı ve decompiler’lar geliştiriyor
      Benzer sorunları çözdükleri için oyunlar arası topluluklar da birbiriyle örtüşüyor ;)
    • Benim de ilk gerçek programlama başarım bir Ultima Online shard web sitesiydi
      İkincisi haritayı değiştirmekti; statik öğeleri kaldırıyor, yeni adalar ve binalar ekliyordum
      Üçüncüsü ise verdata.mul dosyasını değiştirip yeni animasyonlar ve eşya grafikleri eklemekti
      Resmî olmayan bir POL sunucusunda Ultima Online oynamam sayesinde kelimenin tam anlamıyla BT’ye girdim. Ondan önce muhasebeci olmak için okuyordum
    • İlk web sitem Chesapeake’deki guild’im içindi; çeşitli yetenekleri makrolarla kasmak için alelacele script’ler yazmam da ilk “gerçek programlama” projem olmuştu
      Bu sayede ilk kez IRC’ye girdim, oradan da zamanla freenode’a uzandı
  • UO emulator sahnesi beni ağ programlamasına yöneltti
    Çevrimiçi oyunlar içinde bu kadar çok yan, ortaya çıkan ve tesadüfi oynanış mekaniğini bu kadar iyi yakalayabilen başka bir örnek görmedim
    Sonraki 3D MMO’lar, UO’nun sunduğu ilginç ekonomi, inşa ve keşif unsurlarının çoğunu büyük ölçüde azalttı gibi geliyor
    PvP ya da görev tarzı içerikleri başka oyunlar daha iyi yapıyor olabilir ama UO hâlâ cezbediciydi; tek başına, grupla ya da yabancılarla hafif etkileşim içinde oynayıp ruh hâline göre bunlar arasında doğal biçimde geçiş yapabiliyordunuz

    • Ne yazık ki iki şeyin doğru olduğu ortaya çıktı
      İnsanların çoğu bunu istemiyor; önceden belirlenmiş raylarda olmayı tercih ediyor
      Bir de bu tür oyunlara en çok çekilen iki grup arasında, biri varsa diğerinin oyunu bırakmasına yol açan bir dinamik oluşuyor. Üstelik ikinci grup, ilk grubun oyunda kalmasına ihtiyaç duyuyor
    • Bazı eski 3D MMORPG’ler bu tür mekanikleri eklemeye çalışmıştı
      Örneğin Asheron's Call’un mod topluluğu çok hareketliydi ve şimdi bir emulator sahnesi de var. Yine de sunucu popülaritesi UO seviyesinde değil gibi
      Shadowbane daha çok guild odaklıydı ama biraz haydut gibi davranıp rastgele kişilerle ya da guild’lerle PvP yapmanın eğlencesi vardı
    • Belki orada bir fırsat vardır. Açıkçası şu an MMO pazarında pek hareket yok
      WoW, Old School RuneScape ve Final Fantasy Online dışında gerçekten uğraşmaya değer çok az şey var
  • Bu projeyi 10 yıl boyunca aralıklı olarak yürütüp, sonrasında LLM’lerdeki ilerleme sayesinde sonu gelmeyecek gibi görünen işi sonunda bitirebildiğini anlatan kısım etkileyiciydi
    Ben de bir MFC C++ decompilation projesi üzerinde çalışıyorum ve bu tür işlerde LLM’ler inanılmaz derecede faydalı

    • Bu işte LLM’leri otomatikleştirilmiş biçimde kullanıp kullanmadığını merak ediyorum. Lokal mi bulut mu, onu da merak ediyorum
  • Eskiden Ultima Online oynardım
    Son zamanlarda TazUO oyun istemcisinde Python script yazmakla eğleniyorum. Biraz eski bir Python 3 sürümü kullanıyor ama Razor ya da SteamUO’da script yazmaktan çok daha iyi
    Sessiz, tek oyunculu bir shard’da bir şeyler denemek isterseniz Memento bana gayet iyi gelmişti

  • Ultima 4’ün NES sürümünün İspanyolca veya Fransızca yerelleştirilmiş mobil sürümünü arıyordum. Diğer oyunlar için de aynı durum geçerli
    FF serisinin Pixel Remaster’ı gibi ele alınmış bir sürüm istiyorum
    Şu anda sadece emulator ile oynanabiliyor
    Metni bol yerelleştirilmiş RPG’ler, yabancı dili “oynayarak öğrenmek” için çok kolay bir yol ve okumak için de iyi
    Böyle bir şeyin yapılmasını isterdim

  • Ah, UO… gerçekten harika anılar. Kredi kartı yaşında olmadığım için Palo Alto’daki Cybersmith’e bisikletle gidip ön ödemeli süre satın aldığımı hatırlıyorum
    Eskiden Napa Valley shard’ında epey ciddi oynardım. Catskills’e gidecek kadar cesur değildim
    Bugünlerde UO gibi bir deneyimi özlüyorum ama böyle bir oyuna ayıracak vaktim kesinlikle yok

    • Neden Catskills’e gitmediğini merak ettim. Farklı mıydı? Yoksa kuralları daha sert olan Siege Perilous’u mu düşünüyorsun?