hrxdev
العربية

#3 ابنِ سجنًا بالفأرة، وغرف تعثر على نفسها

· Nick

اكتمل المَعلم الثاني، ولأول مرة هناك ما يُرى. يقف عميل Godot الآن فوق نواة المحاكاة، ويمكنك أن تبني سجنًا من طابق واحد بالفأرة: تفرش الأرضيات، وترسم الجدران، وتضع الأبواب، وتحدد الغرف، وتهدم. كل شيء مكعبات بسيطة وألوان مسطحة، ولا بشر فيه بعد. لكنه مكان، ومكان يمكنك أن تتجول حوله بالكاميرا.

ما يمكنك فعله الآن

تبدأ لعبة جديدة، وتختار حجم الخريطة (64 أو 128 أو 256 مربعًا في كل جانب) وبذرة اختيارية، فتحصل على شبكة فارغة. الكاميرا متعامدة بميل ثابت. تدور بخطوات صارمة من 90°، وتقترب نحو المؤشر، وتتحرك بالمفاتيح أو بالزر الأوسط، ولها وضع رؤية من الأعلى للبناء. الجدران كانت ستحجب الغرف عن كاميرا تدور بحرية، لذا فهي لا تدور بحرية.

الأرضيات والهدم تأخذ مستطيلًا. الجدران تتبع محيطًا (أو خطًا مستقيمًا إن ضغطت Shift). الباب نقرة واحدة، ويختار اتجاهه من الجدران المجاورة، مع مفتاح لتدويره. أثناء السحب تُعرض المنطقة تحت المؤشر كطيف: المربعات الخضراء ستُبنى، والحمراء ستُتخطى، وتقول لافتة كم عددها ولماذا. لا يُرسل شيء إلى العالم حتى تُفلت، وإذا قالت النواة إنه لن يتغير ولو مربع واحد، فلا يُرسل شيء على الإطلاق. النقر بالزر الأيمن أو Escape يُلغي.

في نموذج العالم عدة طوابق، لذا هناك منتقٍ للطوابق، وتُخفى الطوابق التي فوق الطابق الحالي. للغرف أداتها الخاصة، وسنتناولها أدناه. وتعرض طبقة تصحيح حدود القطع، والمربعات القابلة للمشي، والمربع تحت المؤشر، ولوحة للتوقيت. كل كلمة في الواجهة بالإنجليزية.

المعاينة هي الشيء الحقيقي

الطيف الذي يخالف النتيجة أسوأ من غيابه. لذلك لا يخمّن العميل ما سيفعله أمر البناء. تستطيع النواة أن تجيب عن سؤال «ماذا سيحدث لو نفّذت هذا» للمنطقة نفسها، مربعًا مربعًا، مع سبب لكل مربع سترفضه. والفحص الذي يملأ المعاينة هو القاعدة نفسها التي يستخدمها الأمر حين يُنفَّذ فعلًا، فلا يمكن أن يفترقا. العميل يرسم الإجابة فقط. ولا يسأل النواة مجددًا إلا حين يتغير شيء يؤثر في الإجابة: الأداة، أو المنطقة المسحوبة، أو الطابق، أو الخريطة نفسها.

المبدأ نفسه يشكّل بقية العميل: يقرأ حالة العالم ويرسل الأوامر، وليس فيه منطق محاكاة خاص به. حاليًا تعمل النواة على الخيط الرئيسي، ويُطبَّق الأمر الناتج عن نقرة في بداية الإطار التالي، قبل نبضة العالم. وإذا بدأت أزمنة النبضات تقفز يومًا حين يمتلئ العالم بالناس، فالخطة نقل النواة إلى خيط خاص بها، مع عتبة مقيسة تحدد متى.

غرف تعثر على نفسها

نظرت في طريقتين لصنع الغرف. Prison Architect يتيح لك رسم منطقة تصبح بعدها كائنًا مستقلًا بمربعاته الخاصة. هذا سهل الفهم، لكنه يسوء في السجن: عنبر زنازين كامل سيكون منطقة واحدة، وبعد أن تعيد بناء جدار عليك أن تعيد طلاءها. الطريقة الأخرى أن تُكتشف المساحات المغلقة تلقائيًا، لكن عندها لا يمكنك تحديد ساحة لا جدران حولها.

ما اخترته مزيج من الاثنين. الشيء الوحيد المخزَّن هو نوع الغرفة على كل مربع: زنزانة، أو مقصف، أو حمّام، أو عيادة، أو غرفة زيارة، أو ساحة تريّض، وهكذا. وكل ما عدا ذلك يُستنتج من الجدران. الحيّز مجموعة من المربعات المفتوحة المتصلة بأضلاعها على مستوى واحد، ويكون مغلقًا إن لم يلمس حافة الخريطة أو فراغًا مكشوفًا. والغرفة هي كل مربعات نوع واحد داخل حيّز واحد. الجدران والأبواب حدود، والنوع المطلي تحت جدار يُحفظ لكنه يُتجاهل، فيعود إن أزلت الجدار.

ينتج عن هذا سلوك يبدو صحيحًا دون أن يُشرح. ضع جدارًا عبر غرفة فتصبح غرفتين من النوع نفسه. أزل الجدار فتندمجان. ضع بابًا مكان جدار فلا يتغير شيء. والغرفة غير الصالحة لا تُحذف، فذلك عكس «بلا عناء»؛ بل تُعرض بالأحمر مع الأسباب: غير مغلقة، أو مشتركة مع نوع آخر، أو صغيرة جدًا، أو بلا باب. يمكنك طلاء مستطيل، أو ملء حيّز مغلق كامل بنقرة واحدة، أو مسحه.

قائمة الغرف بيانات مشتقة، فلا تُحفظ وليست جزءًا من بصمة العالم؛ وحده النوع على كل مربع جزء منها. تُعاد بناؤها بعد الأوامر وبعد الأنظمة، وفحص عالم لم يتغير لا يكلّف شيئًا. في هذا المَعلم يُعاد حساب المستوى المتغير كاملًا، وهذا يستغرق نحو نصف مللي ثانية على خريطة 256×256؛ والحساب قطعةً قطعة يمكن أن ينتظر حتى تحتاج مناطق المسارات الآلية نفسها. والقاعدة التي ألتزم بها أن إعادة البناء التدريجية يجب أن تعطي النتيجة نفسها التي تعطيها إعادة البناء الكاملة.

أعد بناء ما تغيّر فقط، وقطّع الطوابق مجانًا

تُرسم الخريطة كشبكة واحدة لكل قطعة في كل مستوى، لا ككائن لكل جدار. لكل قطعة عدّاد إصدار في النواة، ويتذكر العارض أي إصدار رسمه آخر مرة. حين يتغير العالم، لا تدخل الطابور إلا القطع ذات الإصدار الأحدث، ويُعالَج الطابور بميزانية زمنية لكل إطار، فيتوزع التغيير الضخم على بضعة إطارات بدل أن يجمّد إطارًا واحدًا. وطلاء نوع غرفة لا يرفع إصدار الخريطة، فلا يوقظ بانيَ الشبكات أبدًا.

تقطيع الطوابق يتبع فكرة العمل الأقل نفسها. الطوابق فوق الطابق الحالي تُخفى ببساطة. وجدران الطابق الحالي يُقصّرها مظلّل إلى متر واحد، بمادة مشتركة واحدة وقيمة ارتفاع واحدة، فلا يعيد تبديل الطابق أو إظهار الجدران كاملة بناء أي شيء. التنقل عبر أربعة مستويات لا يطلق أي إعادة بناء للشبكات.

فجوة بعشرة سنتيمترات

حين جرّبت أول سجن من طابق واحد في الفحص الأخير، كانت هناك أرضية في المستوى الأعلى، ومن الجانب ظهر خط مضيء رفيع بين قمة جدار والبلاطة التي فوقه. وعند إحدى الزوايا بدت الأرضية معلقة في الهواء. اشتبهت في تقطيع الطوابق، ثم في تعارض العمق، ثم في تنعيم الحواف.

لم يكن أيٌّ منها. كانت الأرضية مستطيلًا مسطحًا واحدًا بلا سماكة، مرسومًا على ارتفاع مستواه مضافًا إليه عشرة سنتيمترات. وجدران المستوى الأدنى ترتفع إلى ثلاثة أمتار بالضبط. وأرضية المستوى التالي تبدأ عند ثلاثة أمتار وعشرة. كانت الفجوة بعرض عشرة سنتيمترات، ومن خلالها يُرى الوجه العلوي المضاء للجدار. أفقيًا كان كل شيء متطابقًا تمامًا، ولهذا استغرق الأمر وقتًا لرؤيته.

الإصلاح أن الأرضية صارت بلاطة بسماكة حقيقية تمتد نزولًا حتى بداية مستواها. يبقى سطحها العلوي على الارتفاع نفسه، فلا يتغير اختيار المربعات بالفأرة ولا أي طبقة عرض. وتُحذف الأوجه الجانبية حيث تتلامس أرضية أو جدار داخل القطعة نفسها، وتُرسم عند حدود القطع، فلا تعتمد شبكة القطعة على جيرانها أبدًا. يترك ذلك حافة داكنة بعشرة سنتيمترات عند طرف البلاطة. نظرت في لقطات الشاشة قبل وبعد، وقررت الإبقاء عليها. فهي تُقرأ كحافة أرضية، وهذا ما هي عليه بالفعل.

هل يصمد؟

كانت آخر مهمة في المَعلم أن أبني سجنًا من طابق واحد بالفأرة وأرى هل يؤلم ذلك. في الغالب لا. وما وجدته التجربة إلى جانب الفجوة أعلاه كان صغيرًا ومزعجًا: لم تكن أزرار الأدوات تفقد تمييزها حين تختار أداة أخرى بالفأرة، ولم تكن هناك طريقة للخروج من نافذة New Game بمفتاح Escape. أُصلح كلاهما. وقائمة الإيقاف المؤقت مدرجة في قائمة الأفكار لوقت لاحق.

التالي

التالي هو M2، الحركة والروتين اليومي. يحصل العالم على المناطق وقابلية الوصول، وعلى إيجاد مسارات يعمل عبر الطوابق، وعلى حقول تدفق للحشود. أخيرًا صار للنواة عمل حقيقي في كل نبضة، فستكفّ بوابة اختبار الأداء عن النوم. انظر خريطة الطريق.

→ #2 · كل إدخالات اليوميات