#3 माउस से जेल बनाइए, और ऐसे कमरे जो ख़ुद को ढूँढ लेते हैं
· Nick
दूसरा माइलस्टोन पूरा हो गया है, और पहली बार देखने को कुछ है। Godot क्लाइंट अब सिमुलेशन कोर के ऊपर बैठा है, और आप माउस से एक मंज़िला जेल बना सकते हैं: फ़र्श बिछाइए, दीवारें खींचिए, दरवाज़े लगाइए, कमरे चिह्नित कीजिए, चीज़ें गिराइए। सब कुछ सादे क्यूब्स और सपाट रंगों में है, और अभी इसमें कोई लोग नहीं हैं। लेकिन यह एक जगह है, और ऐसी जगह जिसके चारों ओर आप कैमरा घुमा सकते हैं।
अब आप क्या कर सकते हैं
आप नया गेम शुरू करते हैं, नक़्शे का आकार चुनते हैं (64, 128 या 256 टाइल चौकोर) और चाहें तो सीड, और एक ख़ाली ग्रिड मिलता है। कैमरा ऑर्थोग्राफ़िक है और उसका झुकाव तय है। वह सख़्ती से 90° के क़दमों में घूमता है, कर्सर की ओर ज़ूम करता है, कीबोर्ड या बीच वाले बटन से खिसकता है, और निर्माण के लिए ऊपर से देखने का मोड है। खुलकर घूमने वाले कैमरे से दीवारें कमरों को ढक लेतीं, इसलिए वह खुलकर नहीं घूमता।
फ़र्श और तोड़-फोड़ एक आयत लेते हैं। दीवारें एक रूपरेखा पर चलती हैं (या Shift दबाए रखने पर सीधी रेखा पर)। दरवाज़ा एक क्लिक है, और वह पड़ोसी दीवारों से अपनी दिशा चुनता है, घुमाने के लिए एक कुंजी है। खींचते समय कर्सर के नीचे का इलाक़ा परछाईं की तरह दिखता है: हरी टाइलें बनेंगी, लाल छोड़ दी जाएँगी, और एक लेबल बताता है कितनी और क्यों। जब तक आप छोड़ते नहीं, दुनिया को कुछ नहीं भेजा जाता, और अगर कोर कहे कि एक भी टाइल नहीं बदलेगी, तो कुछ भी नहीं भेजा जाता। राइट क्लिक या Escape रद्द करता है।
दुनिया के मॉडल में कई मंज़िलें हैं, इसलिए मंज़िल चुनने का विकल्प है, और मौजूदा मंज़िल के ऊपर की मंज़िलें छिपा दी जाती हैं। कमरों का अपना टूल है, जिसके बारे में नीचे है। एक डीबग ओवरले चंक की सीमाएँ, चलने-योग्य टाइलें, कर्सर के नीचे की टाइल और एक टाइमिंग पैनल दिखाता है। इंटरफ़ेस का हर शब्द अंग्रेज़ी में है।
प्रीव्यू ही असली चीज़ है
जो परछाईं नतीजे से मेल न खाए, वह परछाईं न होने से भी बुरी है। इसलिए क्लाइंट अंदाज़ा नहीं लगाता कि निर्माण कमांड क्या करेगा। कोर उसी इलाक़े के लिए बता सकता है “अगर आप इसे चलाएँ तो क्या होगा”, टाइल-दर-टाइल, और हर उस टाइल की वजह के साथ जिसे वह मना करेगा। प्रीव्यू भरने वाली जाँच वही नियम है जिसे कमांड सच में चलते समय इस्तेमाल करता है, इसलिए दोनों अलग नहीं हो सकते। क्लाइंट सिर्फ़ जवाब को बनाता है। वह कोर से दोबारा तभी पूछता है जब जवाब पर असर डालने वाली कोई चीज़ बदले: टूल, खींचा गया इलाक़ा, मंज़िल, या ख़ुद नक़्शा।
यही सिद्धांत क्लाइंट के बाक़ी हिस्से को भी आकार देता है: वह दुनिया की स्थिति पढ़ता है और कमांड भेजता है, उसका अपना कोई सिमुलेशन लॉजिक नहीं है। अभी कोर मुख्य थ्रेड पर टिक करता है, और क्लिक से आया कमांड अगले फ़्रेम की शुरुआत में, दुनिया के टिक से पहले, लागू होता है। अगर दुनिया लोगों से भर जाने पर कभी टिक के समय उछलने लगे, तो योजना कोर को उसके अपने थ्रेड पर ले जाने की है, और कब ले जाना है इसके लिए एक मापी हुई सीमा होगी।
ऐसे कमरे जो ख़ुद को ढूँढ लेते हैं
मैंने कमरे बनाने के दो तरीक़े देखे। Prison Architect आपको एक ज़ोन बनाने देता है, जो फिर अपनी टाइलों वाली एक अलग चीज़ बन जाता है। यह समझना आसान है, लेकिन जेल में गड़बड़ हो जाती है: एक पूरा सेल ब्लॉक एक ही ज़ोन होगा, और दीवार दोबारा बनाने के बाद उसे फिर से रंगना पड़ेगा। दूसरा तरीक़ा है बंद इलाक़ों को अपने-आप ढूँढना, लेकिन तब आप ऐसा आँगन चिह्नित नहीं कर सकते जिसके चारों ओर दीवारें न हों।
मैंने दोनों का मेल चुना। सहेजी जाने वाली इकलौती चीज़ हर टाइल पर कमरे का प्रकार है: सेल, कैंटीन, स्नानघर, दवाख़ाना, मुलाक़ात कक्ष, कसरत का आँगन, वग़ैरह। बाक़ी सब दीवारों से निकाला जाता है। एक स्पेस एक ही स्तर पर किनारों से जुड़ी खुली टाइलों का समूह है, और वह बंद है अगर वह नक़्शे के किनारे या किसी ख़ाली गड्ढे को न छुए। एक कमरा एक स्पेस के भीतर एक प्रकार की सारी टाइलें हैं। दीवारें और दरवाज़े सीमाएँ हैं, और दीवार के नीचे रंगा गया प्रकार बना रहता है पर अनदेखा होता है, इसलिए दीवार गिराने पर वह लौट आता है।
इससे ऐसा व्यवहार मिलता है जो बिना बताए सही लगता है। किसी कमरे के बीच से दीवार निकालिए, वह एक ही प्रकार के दो कमरे बन जाता है। दीवार हटाइए, वे मिल जाते हैं। जहाँ दीवार थी वहाँ दरवाज़ा लगाइए, कुछ नहीं बदलता। अमान्य कमरा हटाया नहीं जाता, क्योंकि वह “बिना झंझट” का उलटा होगा; वह वजहों के साथ लाल दिखता है: बंद नहीं, दूसरे प्रकार के साथ साझा, बहुत छोटा, या दरवाज़ा नहीं। आप एक आयत रंग सकते हैं, एक क्लिक में पूरा बंद स्पेस भर सकते हैं, या उसे साफ़ कर सकते हैं।
कमरों की सूची व्युत्पन्न डेटा है, इसलिए न वह सहेजी जाती है और न दुनिया के हैश का हिस्सा है; सिर्फ़ हर टाइल का प्रकार है। उसे कमांड के बाद और सिस्टम के बाद फिर से बनाया जाता है, और बिना बदली दुनिया की जाँच में कोई लागत नहीं। इस माइलस्टोन में बदला हुआ स्तर पूरा दोबारा गिना जाता है, जिसमें 256×256 के नक़्शे पर लगभग आधा मिलीसेकंड लगता है; चंक-दर-चंक गिनती तब तक इंतज़ार कर सकती है जब तक पाथ रीजन को यही व्यवस्था न चाहिए। मैं जिस नियम पर टिका हूँ: इंक्रीमेंटल रीबिल्ड का नतीजा पूरे रीबिल्ड जैसा ही होना चाहिए।
सिर्फ़ बदला हुआ दोबारा बनाइए, मंज़िलें मुफ़्त में काटिए
नक़्शा हर स्तर के हर चंक के लिए एक मेश के रूप में बनता है, हर दीवार के लिए एक ऑब्जेक्ट के रूप में नहीं। कोर में हर चंक का एक वर्शन काउंटर है, और रेंडरर याद रखता है कि उसने आख़िरी बार कौन-सा वर्शन बनाया। दुनिया बदलने पर सिर्फ़ नए वर्शन वाले चंक एक कतार में जाते हैं, और कतार को हर फ़्रेम के समय-बजट के साथ निपटाया जाता है, ताकि एक बड़ा बदलाव एक फ़्रेम जमा देने के बजाय कुछ फ़्रेम में फैल जाए। कमरे का प्रकार रंगने से नक़्शे का वर्शन नहीं बढ़ता, इसलिए वह मेश बनाने वाले को कभी जगाता ही नहीं।
मंज़िल-कटाई भी कम करने के उसी विचार पर चलती है। मौजूदा मंज़िल के ऊपर की मंज़िलें बस छिपा दी जाती हैं। मौजूदा मंज़िल की दीवारों को एक शेडर एक मीटर तक दबा देता है, एक साझा मटीरियल और एक ऊँचाई मान के साथ, इसलिए मंज़िल बदलने या पूरी दीवारें दिखाने से कुछ दोबारा नहीं बनता। चार स्तरों से गुज़रने पर एक भी मेश दोबारा नहीं बनता।
दस सेंटीमीटर का गैप
आख़िरी जाँच में जब मैंने पहली एक मंज़िला जेल आज़माई, तो ऊपर के स्तर पर एक फ़र्श था, और बगल से दीवार के ऊपरी सिरे और उसके ऊपर की स्लैब के बीच एक पतली रोशन लकीर दिख रही थी। एक कोने पर फ़र्श हवा में लटका दिखता था। मुझे पहले मंज़िल-कटाई पर शक हुआ, फिर z-fighting पर, फिर किनारों की स्मूदिंग पर।
इनमें से कुछ नहीं। फ़र्श बिना मोटाई का एक सपाट चतुर्भुज था, जो अपने स्तर की ऊँचाई से दस सेंटीमीटर ऊपर बनाया गया था। नीचे के स्तर की दीवारें ठीक तीन मीटर तक जाती थीं। अगले स्तर का फ़र्श तीन मीटर दस पर शुरू होता था। गैप दस सेंटीमीटर चौड़ा था, और उसके बीच से दीवार का रोशन ऊपरी हिस्सा दिखता था। क्षैतिज रूप से सब कुछ एकदम सही बैठा था, इसलिए इसे देखने में समय लगा।
समाधान यह है कि फ़र्श अब असली मोटाई वाली स्लैब है, जो नीचे अपने स्तर की शुरुआत तक जाती है। ऊपरी सतह उसी ऊँचाई पर रहती है, इसलिए माउस से टाइल चुनना और सारे ओवरले नहीं बदले। जहाँ एक ही चंक में फ़र्श या दीवार मिलते हैं वहाँ बगल के फ़ेस छोड़ दिए जाते हैं और चंक की सीमाओं पर बनाए जाते हैं, ताकि किसी चंक का मेश कभी अपने पड़ोसियों पर निर्भर न हो। इससे स्लैब के सिरे पर दस सेंटीमीटर का गहरा किनारा रह जाता है। मैंने पहले और बाद के स्क्रीनशॉट देखे और उसे रखने का फ़ैसला किया। वह फ़र्श के किनारे जैसा दिखता है, और वह है भी।
क्या यह टिकता है
माइलस्टोन का आख़िरी काम था माउस से एक मंज़िला जेल बनाकर देखना कि क्या यह तकलीफ़ देता है। ज़्यादातर नहीं। ऊपर वाले गैप के अलावा इस रन में छोटी और खिझाने वाली चीज़ें मिलीं: माउस से दूसरा टूल चुनने पर टूल बटनों की हाइलाइट नहीं हटती थी, और New Game डायलॉग से Escape दबाकर बाहर निकलने का कोई रास्ता नहीं था। दोनों ठीक कर दिए गए हैं। पॉज़ मेन्यू बाद के लिए विचारों की सूची में है।
आगे
आगे M2 है, आवाजाही और दिनचर्या। दुनिया को रीजन और पहुँच-योग्यता मिलेगी, मंज़िलों के पार काम करने वाली पाथफ़ाइंडिंग, और भीड़ के लिए फ़्लो फ़ील्ड। आख़िरकार कोर के पास हर टिक पर असली काम होगा, इसलिए बेंचमार्क की शर्त सोना बंद कर देगी। देखें रोडमैप।