सबको नमस्ते, मैं AL हूँ। Mortumus के पहले behind-the-scenes झलक में आपका स्वागत है।

जबकि Fin सर्वर की खदानों में गड़ा हुआ है — databases, subscriptions, और distributed-systems की सारी डरावनी जादूगरी से जूझ रहा है जो दुनिया को ज़िंदा रखती है — मैं दूसरे छोर पर हूँ, यह सुनिश्चित कर रहा हूँ कि हर तलवार का वार, हर कदम, हर मशाल की झिलमिलाहट, और हर कवच का टुकड़ा आपकी स्क्रीन पर सही दिखे और सही लगे।

एक dark fantasy MMO बनाना ऐसी चीज़ नहीं है जिसे आप asset store से drag-and-drop करके जोड़ सकें। वो कच्चा, old-school एहसास जिसका हम पीछा कर रहे हैं — लड़ाई का वज़न, कवच की चरमराहट, क्षितिज पर किसी दूसरे खिलाड़ी को देखने का डर — यह तभी आता है जब नीचे के टूल्स ख़ास इसी के लिए बनाए गए हों। तो आज मैं क्लाइंट साइड पर हमारे कुछ कस्टम Unity सिस्टम्स से पर्दा उठा रहा हूँ: वो जिन्हें कोई कभी नहीं देखेगा, लेकिन सबको महसूस होंगे।

चलिए शुरू करते हैं।

विज़ुअल्स, लूट, और PvP प्राइवेसी

अगर MMO खिलाड़ियों के बारे में एक सच्चाई है, तो यह है: हमें गियर से प्यार है। और Mortumus जैसी full-loot PvP गेम में, गियर सिर्फ़ dopamine की खुराक नहीं है — यह जानकारी है। कोई क्या पहने है, यह बताता है कि वो आपके साथ क्या कर सकता है।

राज़ रखो, सुरक्षित रखो — Equipment Visualizer

शुरुआत में ही हमें एक समस्या दिखी जिसे बहुत सारे MMO चुपचाप नज़रअंदाज़ करते हैं: अगर क्लाइंट को हर खिलाड़ी के हर गियर के सटीक item ID पता हों, तो एक दृढ़ cheater उन्हें मेमोरी से निकाल सकता है और आप पर हमला करने का फ़ैसला लेने से पहले आपके सटीक stats जान सकता है।

इसलिए, हमारा Equipment Visualizer कुछ थोड़ा paranoid करता है। आपके अपने कैरेक्टर के लिए, यह पूरी equipment service से पढ़ता है — आप अपने गियर के बारे में सब कुछ देखते हैं। लेकिन हर दूसरे खिलाड़ी के लिए, यह सिर्फ़ एक छोटा "विज़ुअल्स" blob पढ़ता है जो सर्वर publish करता है। आप तलवार देखते हैं, stat sheet नहीं। अजनबियों के item ID कभी Fin के सर्वर से बाहर नहीं जाते।

छोटी बात है। लेकिन memory-scraping cheats को बहुत कम उपयोगी बना देती है। अच्छी deal।

एनिमेशन स्टैक

Skill-based combat एनिमेशन पर टिकी होती है। अगर windup पढ़ने लायक नहीं है, तो आप react नहीं कर सकते। अगर hit सही नहीं लगती, तो लड़ाई बेवज़न लगती है। अगर मौत ऐसी दिखती है जैसे model बस... बंद हो गया, तो आप आधा माहौल खो देते हैं।

Player Animation Coordinator

हमने शुरुआत वैसे ही की जैसे ज़्यादातर लोग करते हैं: एक विशाल animation controller class जो सब कुछ manage करने की कोशिश करती है। Movement, spells, death, hits, idles — सब एक ही file में। करीब दो हफ़्ते में यह पूरा गड़बड़ हो गया।

तो, हमने इसे तोड़ दिया। अब Player Animation Coordinator एक छोटा entry point है जो छोटे, specialized modules का stack शुरू करता है: movement, rotation, attack, spell, hit reactions, death, idles। हर एक का एक काम है। हर एक अकेले पढ़ने लायक है। Bugs ढूँढने में घंटों की जगह मिनट लगते हैं।

मेरे लिए साफ़ कोड। आपके लिए तेज़ combat।

Combat की responsiveness — Attack Animator & Spell Animator

यह क्लासिक MMO समस्या है: server-authoritative combat cheating रोकने का एकमात्र तरीका है, लेकिन हर cast के लिए सर्वर की पुष्टि का इंतज़ार गुड़ जैसा लगता है।

हमारा Spell Animator थोड़ा चीट करता है — लेकिन ईमानदारी से। जब आप spell key दबाते हैं, cast animation तुरंत चलती है — locally predicted, इसलिए instant लगती है। फिर Fin का सर्वर validate करता है कि cast वाकई legal था (cooldown ख़त्म, पर्याप्त mana, valid target, वगैरह)। अगर confirm होता है, कुछ नहीं बदलता। अगर reject होता है, हम साफ़-सुथरे तरीके से बाहर निकल जाते हैं।

Attack Animator melee के लिए वही नाच करता है, और यह swing speed को भी उस cadence के हिसाब से scale करता है जो सर्वर कहता है कि आपका हथियार attack करता है। आपकी आँखें responsive combat देखती हैं। सर्वर एक ऐसी दुनिया देखता है जिससे झूठ नहीं बोला जा सकता।

"अच्छा लगता है" और "फ़ेयर खेलता है" के बीच की sweet spot — यह पूरा game यहीं रहता है।

राज्य की आवाज़ें

Audio माहौल का 50% है और लोग हमेशा कम आँकते हैं कि इसमें कितना काम लगता है।

माहौल बनाना — Audio Manager & Music Region System

पारंपरिक games जब आप एक अदृश्य रेखा पार करते हैं तो music को hard-cut से बदलते हैं। यह अटपटा लगता है। हम इसे 3D polygon zones से करते हैं। Music Region System हमें दुनिया में मनमाने आकार के क्षेत्र बनाने देता है — एक भुतहा बाग़, एक शापित चैपल, एक boss तक की पहुँच — और जैसे आप अंदर-बाहर चलते हैं, Audio Manager soundtrack को सहजता से crossfade करता है। कोई cut नहीं। अगर आप सीमा पर पैर रखें तो एक ही track restart नहीं होता।

और क्योंकि यह सब pooled audio sources के साथ mixer-group routing से चलता है, frame budget में इसकी कीमत लगभग शून्य है।

Character Audio Manager

Mortumus में हर कदम आपके कैरेक्टर की animation और नीचे की सतह से जुड़ा है — पत्थर पत्थर जैसा सुनाई देता है, कीचड़ कीचड़ जैसा। Spell की आवाज़ें ability से जुड़ी हैं, हथियार के वार हथियार से। Character Audio Manager animation events और Audio Manager के बीच बैठता है ताकि हम बिना किसी gameplay code को छुए race/class के हिसाब से नए SFX packs लगा सकें।

छोटी चीज़ें। बहुत सारी। जुड़ती जाती हैं।

पानी का किनारा

हर dark fantasy दुनिया में पानी होता है। दलदल, नदियाँ, डूबे खंडहर, शापित अंतरीप के किनारे का समुद्र। और पानी उन चीज़ों में से है जो आसानी से नकली दिखती हैं — ख़ासकर जहाँ यह ज़मीन से मिलता है। वो बदसूरत polygonal waterline जहाँ mesh terrain से मिलता है — यह सस्ती दिखने वाली game की पहचान है।

हमारा वॉटर बेस

हमने पानी शुरू से नहीं बनाया। Unity असल में Boat Attack नाम का एक शानदार demo project ship करती है जिसमें सबसे अच्छे URP water systems में से एक है; असली reflections, refractions, buoyancy, सब कुछ। तो, हमने Boat Attack के पानी को नींव के रूप में शुरू किया, क्योंकि उस पहिये को दोबारा बनाने में महीनों लगते बिना किसी असली फ़ायदे के।

लेकिन Boat Attack नावों के लिए बना था। साफ़-सुथरी समुद्री तटरेखाएँ। रेतीले समुद्र तट पर बढ़िया दिखने वाला shoreline behavior Mortumus में हमें जो कीचड़ भरी, सरकंडों वाली, अनियमित जलधाराएँ चाहिए उनके आसपास भयानक दिखता है। तो हमें surgical होना पड़ा।

कस्टम shader — Water Shoreline

Unity package को सीधे edit करने की बजाय (जो हर update पर टूट जाता), हमने एक पतला कस्टम shader "WaterShoreline" लिखा जो pipeline के सिर्फ़ उस हिस्से को बदलता है जो shore के लिए ज़िम्मेदार है। बाकी सब — reflections, flow maps, caustics — सीधे Boat Attack से आता है। हम सिर्फ़ वही override करते हैं जो ज़रूरी है।

दो बड़े बदलाव:

2 मीटर का सख़्त foam cutoff ग़ायब हो गया। Boat Attack का default foam band एक fixed depth cutoff रखता है, जो हर किनारे के चारों ओर वो एक जैसा "सफ़ेद छल्ला" देता है। हमने इसे एक नरम falloff और scrolling noise field से बदला, ताकि foam अब धीरे-धीरे फीका पड़े और एक perfect ribbon की बजाय organic ज़ुबानों और उंगलियों में बिखरे।

Soft shoreline alpha। वो polygonal waterline-against-terrain वाली समस्या? हम पानी को ख़ुद ही गहराई के आख़िरी आधे मीटर में transparent करते हैं। Waterline पूरी तरह ग़ायब हो जाती है। Terrain बस गहरे रंग का होता जाता है जैसे-जैसे पानी के नीचे जाता है, बिल्कुल वैसे जैसे असली गीला किनारा दिखता है।

Mortumus water shoreline with soft foam and natural alpha blending

हमारा नदी सिस्टम

Boat Attack के पानी की बात यह है: out of the box यह समुद्र को ख़ूबसूरती से handle करता है, लेकिन इसे असल में पता नहीं कि नदी क्या होती है। पानी एक जगह ripple कर सकता है, लेकिन असली नदी की तरह downstream और मोड़ के चारों ओर बह नहीं सकता। यह समस्या है जब आपकी आधी dark fantasy दुनिया दलदली, नदी वाली, और भीगी होनी चाहिए।

तो, हमने इसके ऊपर एक नदी सिस्टम बनाया।

Mortumus में एक नदी flow path के रूप में बनाई जाती है — बिंदुओं की एक सरल polyline जो नदी की रीढ़ को स्रोत से मुहाने तक trace करती है। Designers बिंदु वहाँ रखते हैं जहाँ वे पानी को बहाना चाहते हैं, और shader बाकी करता है: पानी की सतह के हर pixel के लिए, यह पता लगाता है कि flow path का कौन सा segment सबसे क़रीब है और उस segment की दिशा को local current के रूप में इस्तेमाल करता है। नतीजा: सीधे हिस्से के पास पानी सीधा बहता है, मोड़ के अंदर वाले हिस्से में पानी मोड़ के साथ मुड़ता है, और सब कुछ बीच में smoothly transition करता है।

Textures, normals, और foam उस flow direction के साथ scroll करते हैं बेमक़सद बहने की बजाय। आप वाक़ई देख सकते हैं कि नदी किस तरफ़ जा रही है।

Mortumus river with directional water flow Unity editor showing the river flow path authoring system

यह सब ShoreFoamTuner से live tune किया जा सकता है, एक छोटा inspector component जो हम पानी वाली किसी भी scene पर डालते हैं। Foam softness, noise scale, noise strength, drift speed, alpha falloff के लिए sliders। बिना material को छुए पूरी झील का माहौल बदलें।

कम्युनिटी और ट्रैश टॉक: Chat & सोशल

एक oldschool MMO उतना ही लोगों के बारे में है जितना game के बारे में। अगर social tools अच्छे नहीं लगते, तो दुनिया ख़ाली लगती है।

Overhead Chat System

कैरेक्टर के सिर के ठीक ऊपर anchored text, उनके साथ चलता है, दूरी पर फीका पड़ता है — यह genre का एक absolute staple है, और कुछ ऐसा जिसके लिए हम लड़ते-लड़ते मरेंगे।

यह parties को असली बातचीत में बदलता है। आपको लड़ाई के बीच किसी को trash-talk करने देता है। मरते हुए खिलाड़ी के आख़िरी शब्दों को system log line की बजाय कुछ बेवकूफ़ाना और मज़ेदार बनाता है। Overhead Chat System pooling, distance culling, और anchor tracking handle करता है ताकि यह तब भी scale करे जब बीस लोग एक तंग dungeon में एक-दूसरे पर चिल्ला रहे हों।

दिखने में सही

ईमानदार रहिए — आप character screen पर शर्मनाक मात्रा में समय बिताने वाले हैं। हम सब करते हैं। यह game का सबसे अच्छा आईना है।

कैरेक्टर प्रीव्यू सिस्टम

हमारा paper doll baked 2D render नहीं है — यह एक live 3D scene है जो UI render texture में render होती है। पूरी lighting, असली geometry, आपका हर गियर real time में। Rotate करें, zoom करें, घूरें। यह उस तरह का feature है जो gameplay बिल्कुल नहीं बदलता, लेकिन game own करने का एहसास पूरी तरह बदल देता है।

Mortumus character creation screen with live 3D preview

बैग भरना: Icon Studio

MMO development का एक गंदा छोटा राज़ है: icons। आपको सैकड़ों चाहिए। हर तलवार, हर potion, हर trash loot जो आप chest में पाते हैं उसे अपना 64x64 छोटा वर्ग चाहिए जो भरे हुए inventory में साफ़ पढ़ा जा सके। और सबको ऐसा दिखना चाहिए जैसे वे एक ही game के हैं।

आप बस एक 3D model का screenshot लेकर काम नहीं चला सकते। Lighting consistent होनी चाहिए। Camera angle consistent होना चाहिए। और — यह वो हिस्सा है जिसे सब कम आँकते हैं — framing को inventory में item जिस grid size पर बैठेगा उससे match करना चाहिए। 1x1 dagger और 2x3 great sword को बिल्कुल अलग compositions चाहिए वरना दोनों ग़लत दिखते हैं।

हमारा हल: Icon Studio

Icon Studio एक कस्टम Unity editor window है जो हमने बनाया ताकि एक इंसान (आमतौर पर मैं, बड़बड़ाते हुए) बिना पागल हुए सौ consistent icons बना सके।

Workflow: item prefabs की list डालें। Tool को बताएँ कि हर एक inventory में कौन सी grid size लेता है — 1x1, 2x2, 2x3, 1x4, जो भी हो। Camera एक बार frame करें। Framing को preset के रूप में save करें। Generate दबाएँ।

जादू यह है कि grid size cosmetic नहीं है — यह actual render चलाती है। 2x3 item 2x चौड़ाई और 3x ऊँचाई (512px base की) पर render होता है, ताकि जब यह आपके inventory में बैठे तो proportions सही हों, stretched नहीं। एक longsword सच में 1x4 slot को diagonally भरता है। एक potion bottle सच में 1x1 में फ़िट होती है। Inventory ऐसा लगता है जैसे आप असली चीज़ें organize कर रहे हों।

इसके ऊपर, tool handle करता है: प्रति item transparent या custom backgrounds, bone pose capture ताकि skeleton-based items अपनी display pose snapshot कर सकें बिना gameplay rig को disturb किए, और पूरी item categories के लिए presets — सभी axes एक ही camera से render होती हैं, सभी potions अलग से। Free में consistency।

अंतिम नतीजा यह है कि game में हर icon — जो भरे inventory grid में 32 pixels पर अच्छे पढ़ते हैं — actual in-game model से render किया गया था, उसी shape में जो वो item आपके bag में लेता है। कोई outsourced 2D art नहीं। कोई बेमेल lighting नहीं। कोई dagger जो UI में great sword से बड़ा दिखे, ऐसा नहीं।

यह उस तरह का tool है जो कोई नहीं देखता। यही कारण भी है कि inventory बेमेल stock art के बैग जैसा नहीं दिखता।

अगली बार तक

इनमें से कोई भी system Mortumus का headline feature नहीं है। कोई game इसलिए नहीं ख़रीदेगा कि कदमों की आवाज़ अच्छी है या कंकाल physics chunks में टूटते हैं। लेकिन ये सब कुछ के नीचे की हड्डियाँ हैं — वो अदृश्य काम जो बड़ी चीज़ों को सही महसूस कराता है जब वे इनके ऊपर आती हैं।

इस नींव के साथ, Fin और मैं वो असली अंधेरी, बेरहम, full-loot दुनिया बना सकते हैं जो हम दो साल से नोटबुक में स्केच कर रहे थे — ऐसी रफ़्तार से जो हमें अपने कंप्यूटर नदी में फेंकने का मन नहीं कराती।

— AL