1 पॉइंट द्वारा GN⁺ 1 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • OUO एक ऐसा प्रोजेक्ट है जिसने 1998 के Ultima Online डेमो सर्वर की पूरी तरह रिवर्स इंजीनियरिंग की है, जिसमें MSVC x86 बाइनरी के लगभग 5,000 functions को disassemble करके portable C99 में बदला गया
  • UoDemo.exe Ultima Online: The Second Age की पहली रिलीज़ में शामिल एक standalone demo था, और इसमें client के साथ Windows पर port किया गया पूरा server code और data भी शामिल था
  • हर function की मूल बाइनरी से instruction स्तर पर तुलना की गई, और class hierarchy व vtable layout को मिलाने के बाद इसे हाथ से इस तरह बदला गया कि वही control flow, struct layout और branches बने रहें
  • restored build 1998 के मध्य के वास्तविक live Ultima Online server code के बहुत करीब है, लेकिन stability issues जैसे crash, overflow और uninitialized variables, तथा gameplay issues जैसे skill gain और spawn density को tags के साथ ठीक किया गया है
  • मूल demo केवल client 1.25.33 को support करता था, लेकिन restored build अब 1.25.30 से 5.0.9.1 तक के clients को encryption हो या न हो, support करता है, और 1997~2003 के server data files की भी मांग की गई है

डेमो फ़ाइल की उत्पत्ति और दायरा

  • हर function की मूल बाइनरी से instruction स्तर पर तुलना की गई, और 10 साल तक रुक-रुक कर किए गए काम को हाल की LLM प्रगति की मदद से पूरा किया जा सका
  • UoDemo.exe की तारीख 1998-09-02 है, और server data 2 जून 1998 के live server से निकाला गया था
  • demo के लिए कुछ features को stub किया गया और playable map को Ocllo island तक सीमित कर दिया गया, लेकिन बाकी हिस्सा 1998 के मध्य में वास्तविक live Ultima Online पर चल रहे production server code का था
  • Ultima Online Origin Systems Inc. द्वारा विकसित 1997 का MMORPG था, और यह व्यावसायिक रूप से सफल शुरुआती MMORPGs में से एक था
  • client Windows पर चलता था, जबकि server यानी “shards” कई Solaris machines पर चलते थे और map को क्षेत्रों में बांटा गया था
  • demo में Ocllo island पर dragon को मारने वाला एक सरल quest दिया गया था, और इसे बातचीत, व्यापार, combat जैसी मूल game mechanics देखने के लिए बनाया गया था
  • कई UO server emulators ने इस demo के कुछ हिस्सों का पुन: उपयोग किया, लेकिन अब तक किसी ने इसे पूरी तरह reverse engineer नहीं किया था
  • UoDemo.exe को Microsoft Visual C++ 5.0, यानी Visual Studio 97 से compile किया गया था, और यह pre-C++98 dialect of C++ को target करता था

रिवर्स इंजीनियरिंग की विधि

  • Disassembly और symbol अनुमान

    • disassembly के लिए radare2 का उपयोग किया गया
    • symbol names का अनुमान experimental Linux port UO client 1.25.37 से लगाया गया, जिसमें C++ symbols शामिल थे
  • C99 में manual conversion

    • हर function को हाथ से C99 में इस तरह अनुवादित किया गया कि मूल बाइनरी जैसा control flow, struct layout और branches बने रहें
    • जहाँ अंतर हैं, वे demo के वास्तविक bug fixes या platform adaptation हैं, और source में चिह्नित किए गए हैं
  • सत्यापन की विधि

    • C build को फिर से r2 में disassemble करके मूल से तुलना की गई
    • दोनों परिणाम मेल खाने पर ही किसी function को पूरा माना गया
    • helper functions केवल दोहराए जाने वाले inline patterns के लिए इस्तेमाल किए गए, और तभी जब helper को inline version जैसा ही code बनाते हुए फिर से expand किया जा सके
  • class hierarchy की पुनर्स्थापना

    • शुरुआती चरण में सबसे महत्वपूर्ण काम class hierarchy को सही-सही मिलाना था
    • मुख्य hierarchy CEntity (0x10) -> CResourceEntity (0x1C) -> CItem (0x50) -> CContainer (0x5C) -> CMobile (0x37C) -> CPlayer (0x458) थी
    • virtual dispatch vtable slots के जरिए होता था; उदाहरण के लिए vtable[0x18] IsPlayer था, [0xD0] IsMobile, और [0xE4] IsNPC था
    • यह layout तय हो जाने के बाद बाइनरी के अधिकांश हिस्से का अपेक्षाकृत सीधा अनुवाद किया जा सका

पुनर्निर्माण का परिणाम और मूल से अंतर

  • परिणाम 1998 के Ultima Online server की लगभग पूर्ण प्रतिकृति के बेहद करीब है, लेकिन कुछ अंतर हैं
  • मूल code की तुलना में crash, overflow और uninitialized variables जैसी stability issues को ठीक किया गया है
  • skill gain, fame/notoriety direction और spawn density जैसी gameplay issues भी सुधारी गई हैं
  • हर बदलाव को source में tag किया गया है, ताकि UoDemo.exe से तुलना करने वाला व्यक्ति ठीक-ठीक देख सके कि क्या और क्यों बदला गया
  • spawn system और decay system जैसी कुछ सुविधाएँ टूटी हुई थीं, और संभव है कि demo release के लिए इन्हें आंशिक रूप से disabled या stub किया गया हो
  • इन सुविधाओं का code बचा हुआ था, लेकिन live call sites तक पहुँचा नहीं जाता था; इन्हें अलग से decompile करके dispatch दोबारा जोड़ने भर से चालू किया जा सका
  • game map में Ocllo island ही शामिल था, यानी कुछ data गायब था
  • server data format को संभालने के लिए पूरा tool suite बनाया गया, और बाकी दुनिया के doors, signs, decorations, teleporters, traps, containers और spawn locations को पूरी तरह reconstruct किया गया

बचा हुआ ecology system

  • सेवानिवृत्त लेकिन प्रसिद्ध ecology system function calls से कटा हुआ था, फिर भी code में अब भी मौजूद था
  • predator, prey और scavenger systems को फिर से जोड़कर अब यह देखा जा सकता है कि wolves rabbits का पीछा करते हैं या crows items खा लेते हैं
  • हालांकि सटीक data की कमी के कारण पूरा resource और production system लागू नहीं किया गया
  • संबंधित पृष्ठभूमि सामग्री के रूप में Raph Koster का UO ecology system और UO resource system पर लेख 1, 2, 3 जुड़े हुए हैं

अतिरिक्त सुविधाएँ और client compatibility

  • OSI द्वारा फरवरी 1999 में जोड़े गए Meditation, Stealth और Remove Trap skills को नया जोड़ा गया है
  • इन features के कुछ शुरुआती निशान पहले से code में मौजूद थे
  • ज़्यादातर नए features को startup पर -features parameter से on या off किया जा सकता है
  • demo server में account system पूरी तरह नहीं था, इसलिए original developers इसे कैसे बनाते, इसका अनुमान लगाकर थोड़ा modernized रूप में फिर से लागू किया गया
  • मूल demo server केवल client 1.25.33 को support करता था, लेकिन इसे बढ़ाकर 1.25.30 से 5.0.9.1, यानी 2007-03-27 तक के सभी clients को encryption हो या न हो, support करने लायक बनाया गया
  • कई वर्षों में encryption के पाँच बिल्कुल अलग तरीके रहे, इसलिए हर तरीके की reverse engineering client binary से करनी पड़ी

32-bit मूल और 64-bit default build

  • मूल बाइनरी 32-bit थी, लेकिन वर्तमान default build 64-bit को target करता है
  • class hierarchy को C struct embedding से इस तरह दोहराया गया है कि मूल C++ inheritance पुनर्निर्मित हो सके
  • इस तरीके से CMobile* को वहाँ पास किया जा सकता है जहाँ CContainer* चाहिए
  • 64-bit में pointer width बढ़ने से inherited fields की position खिसक सकती है, इसलिए कुछ structs को जानबूझकर pad किया गया ताकि 32-bit और 64-bit दोनों में inheritance और vtable layout बाइनरी से मेल खाएँ

सार्वजनिक संसाधन

  • https://github.com/draxinar/ouo: code
  • https://github.com/draxinar/rundir: UoDemo.dat आधारित data, modifications, completed data और नए features शामिल
  • https://uo.serpent-isle.com/: Test Center, यह वास्तविक shard नहीं है बल्कि 1998 के Ultima Online server की अत्यंत faithful recreation को आज़माने का वातावरण है
  • UO:98: Batlin और Derrick का प्रोजेक्ट, जिसने 2016 में इस काम को शुरू करने की प्रेरणा दी
  • OUO अभी भी शुरुआती चरण में है और समस्याएँ बाकी हो सकती हैं
  • मिली हुई समस्याओं को issue के रूप में report किया जा सकता है, और contributions का स्वागत है

Ultima Online समुदाय से अनुरोध

  • अगर किसी के पास 1997~2003 के आसपास के मूल Ultima Online server के dynamic0.mul, dynamic0.bkp, regions.txt, resbank.mul files हैं, तो उन्हें साझा करने का अनुरोध किया गया है
  • dynamic0.mul और dynamic0.bkp server save files हैं, regions.txt spawn definitions के लिए है, और resbank.mul resource definition file है
  • ऐसा नहीं लगता कि मूल dynamic0.mul या dynamic0.bkp पूरी तरह खो गए होंगे
  • dynamic0.mul file से player data हटाकर privacy सुरक्षित रखने और फिर इसे distribute करने के लिए tools पहले से तैयार हैं
  • ये files Ultima Online की world content को बहुत सटीक रूप से पुनर्निर्मित करने में बेहद मूल्यवान हैं

1 टिप्पणियां

 
GN⁺ 1 시간 전
Hacker News टिप्पणियाँ
  • अगर किसी के पास मूल Ultima Online server के dynamic0.mul, dynamic0.bkp, regions.txt, resbank.mul फ़ाइलें हों, तो भेज दें तो सच में बहुत आभारी रहूँगा
    ये लगभग 1997~2003 के server save game, spawn definition, resource definition फ़ाइलें हैं, और खासकर dynamic0.mul या dynamic0.bkp शायद कई सुरक्षित जगहों पर backup किए गए होंगे, इसलिए यह मानना मुश्किल है कि वे पूरी तरह गायब हो गए हैं
    ये फ़ाइलें Ultima Online दुनिया के content को बहुत सटीक रूप से दोबारा बनाने में बेहद मूल्यवान हैं

  • यह सच में कमाल का है। मज़े की बात है कि मैं अभी पुराने Ultima game soundtrack सुन रहा था और तभी यह दिख गया
    सोच रहा हूँ कि क्या इन्होंने disassembly के नतीजे को उसी pre-C++98 C++ dialect में लिखने और original compiler को target करने पर विचार किया था
    मैंने vintage systems पर चलने वाले binaries को disassemble किया है, और अगर संभव होता तो शायद मैं original toolchain को target करता। यह काफ़ी दिलचस्प दार्शनिक सवाल है

  • eqclassic का आख़िरी बचे हुए developer होने के नाते इसे दिलचस्पी से पढ़ा, लेकिन मैं यह सुनने की और गहरी कहानी की उम्मीद कर रहा था कि tools कैसे इस्तेमाल किए गए और पूरी process कैसी थी। फिर भी लेख अच्छा है
    उस समय LLM नहीं थे, लेकिन 3 साल बाद के PowerPC binary से निकले कुछ debug symbols थे, इसलिए थोड़ी मदद मिल गई
    packet_handler या entitylist जैसे file names अजीब तरह से परिचित लगते हैं :D
    आख़िरी बड़ी बाधा यह है कि बाकी सब polish करने से पहले लगभग पूरी तरह सही network code हो, और मैं इस पर पहले ही सैकड़ों घंटे झोंक चुका हूँ
    मैंने source को बस थोड़ा-सा देखा है, लेकिन सब कुछ TCP आधारित लगता है, इसलिए ऐसा नहीं लगता कि उसके ऊपर कोई अलग reliability mechanism जोड़ा गया था। अगर ऐसा है, तो उस दौर के MMO के लिए यह काफ़ी “धीमा” विकल्प लगता है, जो दिलचस्प है

  • जो लोग UO आज़माना चाहते हैं, उनके लिए यह अब भी active player base वाला game है। UO Outlands जैसे third-party servers original gameplay के ज़्यादा करीब हैं, लेकिन आज के MMO standards के हिसाब से काफ़ी कठोर लग सकते हैं
    कोई दूसरा player आकर तुम्हें gank कर सकता है और तुम्हारा gear भी छिन सकता है
    अभी भी उस server पर 2500 से ज़्यादा लोग online हैं, इसलिए यह अब भी बहुत सक्रिय है

    • UO Outlands, original UO से भी बेहतर managed लगता है। उसका Discord भी काफ़ी active है और वहाँ लगभग 20,000 users हैं
  • मेरी पहली असली programming achievement Ultima Online shard website बनाना थी
    मैंने बेहद ख़राब PHP और HTML इस्तेमाल किया था, लेकिन वह उसके बाद 20 साल से भी ज़्यादा समय तक चलता रहा। अच्छी यादें हैं
    यह देखकर हैरानी हुई कि UO के आसपास अब भी इतनी सक्रिय community है, और जो भी हो, यह project सच में शानदार है

    • मेरे साथ भी कुछ ऐसा ही था: website बनाने में मदद की, forums install और manage किए, फिर shard चलाने वाले लोगों ने बाद में emulator code का काम भी मुझे दे दिया
      तब मैं 12~13 साल का था, यानी 90 के दशक के आख़िर या 2000 के शुरुआती साल। emulator का नाम अब याद नहीं, लेकिन शायद POL था
      shard का लक्ष्य UO:Renaissance से पहले के official servers के जितना संभव हो उतना करीब जाना था, इसलिए उसे T2A जैसा दिखाने और महसूस कराने के लिए काफ़ी काम किया गया
      मैंने बहुत कुछ सीखा, और बाद में जब RunUO आया और 2003 के आसपास कुछ हद तक stable हुआ, तब POL में बनाए गए हिस्सों को RunUO के C# code में port करने में भी मदद की, और उसके साथ चलने के लिए मुझे और बहुत कुछ सीखना पड़ा
      उस shard पर जिन लोगों के साथ मैं काम करता था, वे सब या तो college में computer science पढ़ रहे थे या पहले से programmer थे, और मैं बस एक बच्चा था जिसे कुछ scripts लिखना आता था
      मुझे लगता है कि बाद में professional बनने में इस अनुभव की निर्णायक भूमिका थी। मेरी पहली असली tech company नौकरी भी उन्हीं में से एक की recommendation से मिली, जब वहाँ internship opening आई
      एक तरह से देखें तो UO और private shards की वजह से ही मेरा आज का career बना
    • मेरे मामले में शुरुआत UOInject नाम के helper tool से हुई, जिससे ore mining automate की थी। मेरा ख़याल है उसकी language Visual Basic थी
      मैंने programming पूरी तरह ज़रूरत के कारण शुरू की थी
    • अगर वह MMO या online game हो, तो private server communities कभी खत्म नहीं होतीं
      game का नाम भूल गया हूँ, लेकिन शायद City of Heroes था, जो कुछ साल बंद रहने के बाद एक दिन किसी ने फिर से private server पर चालू कर दिया
      पुराने Shockwave online games के लिए भी niche communities servers को फिर से बना रही हैं, और Shockwave runtime व decompiler भी तैयार कर रही हैं
      चूँकि सब लोग मिलते-जुलते problems सुलझाते हैं, अलग-अलग games की communities भी अक्सर overlap करती हैं ;)
    • मेरी भी पहली असली programming achievement Ultima Online shard website ही थी
      दूसरी थी map बदलना, जैसे static items हटाना, नए islands और buildings जोड़ना
      तीसरी थी verdata.mul को बदलकर नई animations और item graphics जोड़ना
      अनौपचारिक POL server पर Ultima Online खेलने की वजह से ही मैं सचमुच IT में आया। उससे पहले मैं accountant बनने की पढ़ाई कर रहा था
    • मेरी पहली website Chesapeake पर मेरी guild के लिए थी, और अलग-अलग skills को macro से बढ़ाने वाले कुछ भद्दे scripts बनाना मेरा पहला “असल programming” project था
      इसी वजह से मैं पहली बार IRC पर गया, और बाद में freenode तक पहुँच गया
  • UO emulator scene ने ही मुझे network programming की ओर खींचा
    online games में मैंने शायद ही कोई ऐसा उदाहरण देखा हो जिसने इतने सारे incidental, emergent और accidental gameplay mechanics को इतनी अच्छी तरह समेटा हो
    बाद के 3D MMO शायद UO में मौजूद रोचक economy, building और exploration तत्वों को काफ़ी कम कर बैठे
    PvP या quest जैसी चीज़ों में दूसरे games बेहतर हो सकते हैं, लेकिन UO में अब भी अलग आकर्षण था, और आप अकेले, group में, या अनजान लोगों के साथ हल्की-फुल्की interaction करते हुए अपने mood के हिसाब से सहजता से बदल सकते थे

    • अफ़सोस की बात है कि दो बातें सच साबित हुईं
      ज़्यादातर लोग ऐसा नहीं चाहते और fixed rails पर रहना पसंद करते हैं
      और ऐसे games जिन दो groups को सबसे ज़्यादा खींचते हैं, उनमें एक group की मौजूदगी दूसरे group को game छोड़ने पर मजबूर कर देती है। लेकिन दूसरा group चाहता भी है कि पहला group खेलता रहे
    • कुछ पुराने 3D MMORPGs ने ऐसे mechanics शामिल करने की कोशिश की थी
      उदाहरण के लिए Asheron's Call की modding community बहुत सक्रिय थी और अब उसका emulator scene भी है। हालाँकि server popularity शायद UO जितनी नहीं है
      Shadowbane guild-केंद्रित ज़्यादा था, लेकिन उसमें थोड़ा outlaw बनकर random लोगों या guilds के साथ PvP करने का मज़ा था
    • शायद वहाँ कोई मौका हो सकता है। सच कहूँ तो अभी के MMO market में ज़्यादा हलचल नहीं है
      WoW, Old School RuneScape, Final Fantasy Online के अलावा बहुत कुछ ऐसा नहीं लगता जिसे बड़े उत्साह से खेला जाए
  • यह बात प्रभावशाली लगी कि 10 साल तक बीच-बीच में इस project पर काम करने के बाद, हाल की LLM प्रगति की वजह से वे उस काम को आखिरकार पूरा कर पाए जो पहले अंतहीन लगता था
    मैं भी एक MFC C++ decompilation project पर काम कर रहा हूँ, और ऐसे काम में LLM बेहिसाब उपयोगी हैं

    • यह जानने की जिज्ञासा है कि क्या वे इस काम में LLM को automated तरीके से इस्तेमाल कर रहे हैं। और local है या cloud, यह भी जानना चाहूँगा
  • मैं पहले Ultima Online बहुत खेलता था
    हाल में TazUO game client पर Python scripting के साथ मज़े कर रहा हूँ। यह Python 3 का थोड़ा पुराना version है, लेकिन Razor या SteamUO में scripts लिखने से कहीं बेहतर है
    अगर कोई शांत single-player shard में तरह-तरह की चीज़ें आज़माना चाहता है, तो Memento मुझे अच्छा लगा

  • मैं Ultima 4 के NES version का Spanish या French localized mobile edition खोज रहा था। बाकी titles के लिए भी यही बात है
    कुछ वैसा जैसा FF series के Pixel Remaster के साथ किया गया
    अभी तो इसे सिर्फ emulator पर ही खेला जा सकता है
    text-heavy localized RPGs विदेशी भाषा को “खेलते-खेलते सीखने” का बहुत आसान तरीका हैं, और पढ़ने के लिए भी अच्छे होते हैं
    अच्छा होगा अगर ऐसा कुछ बनाया जाए

  • आह, UO… कितनी शानदार यादें हैं। मेरी उम्र तब card रखने की नहीं थी, इसलिए मैं Palo Alto के Cybersmith तक साइकिल चलाकर जाता था और prepaid time खरीदता था
    पहले मैं Napa Valley shard पर काफ़ी खेलता था। Catskills जाने जितना बहादुर नहीं था
    आजकल UO जैसे अनुभव की कमी महसूस होती है, लेकिन ऐसे game में लगाने के लिए अब बिल्कुल समय नहीं है

    • सोच रहा हूँ Catskills क्यों नहीं? क्या वह अलग था? या तुम शायद Siege Perilous को याद कर रहे हो, जिसमें ज़्यादा कठिन ruleset था?