إعادة إنشاء لعبة DOS قديمة في C ++ 17

في عام 2016 ، بدأت العمل في مشروع هواية للهندسة العكسية للعبة Duke Nukem II وأعد إنشاء محركها من الصفر. يسمى المشروع Rigel Engine وهو متاح في المصادر المفتوحة ( صفحته على جيثب ). اليوم ، بعد مرور أكثر من عامين ونصف على محركي ، يمكنك بالفعل الانتقال إلى حلقة برنامج كومبيوتري بأكملها من اللعبة الأصلية مع شبه متطابق مع اللعبة الأصلية. هنا شريط فيديو مع مرور المستوى الأول:


ماذا يمكن أن يفعل؟ يعمل Rigel Engine كبديل كامل NUKEM2.EXE DOS الأصلي ( NUKEM2.EXE ). يمكنك نسخها إلى دليل اللعبة وتأخذ في الاعتبار جميع البيانات منه ، أو تحديد المسار إلى بيانات اللعبة كوسيطة إلى سطر الأوامر. تم بناء المحرك وتنفيذه تحت أنظمة Windows و Mac OS X و Linux. يستند إلى SDL و OpenGL 3 / OpenGL ES 2 ، وهو مكتوب بلغة C ++ 17.

ينفذ منطق اللعبة لجميع الأعداء وميكانيكا اللعبة من حلقة برنامج كومبيوتري ، بالإضافة إلى معظم نظام القائمة. بالإضافة إلى ذلك ، يمكنك استيراد الألعاب المحفوظة وجدول درجات عالية من اللعبة الأصلية إلى ذلك.

علاوة على ذلك ، يتمتع المحرك بمزايا أكثر من الأصل:

  • لا يوجد محاكي أو الأجهزة القديمة المطلوبة ، لا الإعدادات اللازمة
  • لا توجد شاشات تحميل - حدد "لعبة جديدة" في القائمة ، واضغط على Enter ، وابدأ اللعبة فورًا
  • يمكن تشغيل العديد من المؤثرات الصوتية في نفس الوقت ، وهو ما كان مستحيلًا في الأصل
  • لا توجد قيود على عدد التأثيرات المتزامنة للجزيئات والانفجارات وما إلى ذلك.
  • حفظ الملفات وقوائم أعلى الدرجات لكل لاعب
  • القوائم أكثر استجابة بكثير

حتى الآن ، لا أعتبر محرك ريجل جاهزًا تمامًا. ولكن هذه مرحلة رائعة في التطوير وفرصة جيدة للكتابة عن المحرك مرة أخرى (المنشورات القديمة المنشورة هنا وهنا ). لنبدأ بإلقاء نظرة على الحالة الحالية للرمز ومعرفة كيف وصلت إليه.

كم رمز في المحرك؟


في وقت كتابة هذا التقرير ، يتكون RigelEngine من 270 ملف مصدر يحتوي على أكثر من 25 ألف سطر من التعليمات البرمجية (بدون تعليقات / أسطر فارغة). من هذه ، 10 ملفات و 2.5 ألف سطر هي اختبارات وحدة. يتوفر تفصيل تفصيلي للخطوط الفارغة والتعليقات هنا .

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

  • المحللون / التنزيلات لـ 14 تنسيقًا مختلفًا للملفات المستخدمة في اللعبة الأصلية - ألفي سطر من الشفرة (LOC)
  • منطق السلوك / منطق اللعبة لـ 24 أعداء / كائنات معادية - 3.8 كيلو LOC
  • منطق اللعبة لمدة 14 عناصر تفاعلية وميكانيكا اللعبة - 2K LOC
  • منطق تحكم اللاعب - 1.2 كيلو LOC
  • 154 إدخالات التكوين (القيمة الصحية لكل عدو ، وعدد النقاط المستلمة للعناصر التي تم جمعها ، وما إلى ذلك) - 1K LOC
  • 31 مواصفات لآثار التدمير (الآثار الناجمة عن تدمير العدو أو أي جسم آخر قابل للتدمير) - 254 LOC
  • رمز التحكم في الكاميرا - 159 LOC
  • لغة اللعبة وصف القائمة مترجم / cutscene - 643 LOC
  • هود ورمز واجهة المستخدم الأخرى هو 818 LOC
  • 5 شاشات / أوضاع خارج القائمة ، على سبيل المثال ، الرسوم المتحركة الأولية ، وشاشة المكافآت ، إلخ. - 789 LOC

بالطبع ، كل هذا الرمز يحتاج إلى كتابته ، وهذا يقودنا إلى السؤال التالي.

كم العمل استغرق الأمر؟


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


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

يجب أن أقول أيضًا أن كتابة الكود لم يكن الجزء الوحيد من المشروع - الهندسة العكسية كانت جزءًا مهمًا آخر. لقد أمضيت ساعات قليلة في دراسة الكود المفكك للملف القابل للتنفيذ الأصلي في Ida Pro (في الإصدار المجاني) ، وتدوين الملاحظات وكتابة الكود الشفهي والتخطيط لتنفيذ عناصر الإصدار الخاص بي. بالإضافة إلى ذلك ، قمت باختبار اللعبة الأصلية بفاعلية ، وقمت بتشغيلها في DOSBox وعلى المعدات الأصلية (تم شراء أجهزة مختلفة 386 و 486 على eBay). جمعت مستويات اختبار لملاحظة منفصلة لأعداء محددين ودراسة ميكانيكا اللعبة ، وسجلت مقاطع فيديو باستخدام DOSBox ، ونظرت من خلال إطارات كل إطار على حدة لتأكيد استنتاجاتي التي تم التوصل إليها أثناء دراسة كود المجمع. بعد تحقيق ميكانيكيات العدو أو اللعبة ، قمت عادةً بتسجيل مقطع فيديو من الإصدار الخاص بي وقارنته بالإطار مع الإطار الأصلي للتأكيد على دقة عملي.

فيما يلي بعض صور ملاحظاتي:


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


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


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


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

في النهاية ، اتضح أن العمل في المشروع مثير للغاية ، وتعلمت الكثير منه: حول الهندسة العكسية ، مجمّع 16 بت x 86 ، برمجة VGA منخفضة المستوى ، وقيود شديدة واجهها مطورو ألعاب الكمبيوتر الشخصي في أوائل التسعينيات ؛ بالإضافة إلى ذلك ، لقد اكتشفت العديد من الاكتشافات حول الميزات الداخلية للعبة الأصلية وكيف تم تنفيذ بعضها غريب وغريب - هذا الموضوع في حد ذاته يستحق سلسلة منفصلة من المشاركات.

ما التالي


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

بالنسبة للتحسينات المستقبلية ، إليك بعض النقاط التي فكرت في تنفيذها:

  • حركة سلسة مع الاستيفاء. تقوم اللعبة بتحديث منطقها حوالي 15 مرة في الثانية ، وفي اللعبة الأصلية ، يكون أيضًا معدل الإطارات للتقديم. من ناحية أخرى ، يمكن لمحرك ريجل العمل بسهولة بتردد 60 إطارًا في الثانية وأعلى. في الوقت الحالي ، لا تعطي هذه الإطارات الإضافية أي مزايا ، لكنني أعتقد أنه يمكن استخدامها للإطارات المتوسطة من أجل تحقيق التمرير السلس وحركة الكائنات. سيظل منطق اللعبة يعمل بنفس السرعة ، لكن الكائنات ستتحرك بسلاسة ، ولن "تقفز" بزيادة قدرها 8 بكسل ، كما تفعل الآن. في وقت سابق ، قمت بإنشاء نموذج أولي لمثل هذا النظام ، ويبدو رائعًا ، رغم أنه يحتاج إلى تحسين.
  • دعم غمبد. في اللعبة الأصلية ، يوجد دعم لعصا التحكم ، ويمكن لـ DosBox تقليدها على لوحات الألعاب الحديثة ، ولكن قد يكون إعدادها صعباً - يلزم إعداد التهيئة والمعايرة في اللعبة. ناهيك عن أنه لا يتم دعم جميع أزرار التحكم ، ولكن لاستخدام القائمة لا يزال يتعين عليك استخدام لوحة المفاتيح. لذلك ، أعتقد أن دعم وحدة التحكم الأصلية سيحسن بشكل كبير من طريقة اللعب.
  • تعزيز الصوت. حاليا ، جميع المؤثرات الصوتية لها نفس الصوت. الكائنات المنتجة للصوت ، على سبيل المثال ، فرض الحقول ، تصبح مسموعة بحدة عندما تضغط على الشاشة ، وتنقطع بنفس الحدة. كنت فضوليًا كيف سيكون صوتهم إذا تلاشى حجم التأثيرات في المسافة. على سبيل المثال ، بالكاد كان بوسعنا سماع مجال القوة عندما لا يكون ذلك معروضًا على الشاشة ، وعند الاقتراب يصبح الصوت أعلى.
  • الكاميرا عن بعد / عرض معظم المستوى. لم يتم تصميم اللعبة من أجل هذا ، لذا فإن هذه الإمكانية يمكن أن تلحق الضرر باللعب - سيبدأ اللاعب في رؤية الأعداء الذين لا ينشطون خارج الشاشة ، وما شابه ذلك. لكن ما زلت أتساءل كيف سيبدو ويلعب. في النهاية ، اشتكى اللاعبون في كثير من الأحيان من هذه اللعبة لعدم قدرتهم على رؤية جزء كافٍ من المستوى. سيكون من المثير للاهتمام إضافة خيار لإيقاف تشغيل HUD أو استبداله بأكثر حد أدنى باستخدام الشفافية.
  • زيادة دقة الرسومات. غالبًا ما توجد هذه الميزة في العديد من المنافذ / إعادة إنشاء الألعاب ، وسيكون من الرائع إضافتها هنا. يسمح لك المحرك بالفعل باستبدال الرسومات العفوية بصورك الخاصة ، لكن حتى الآن لا يمكن أن تكون ذات دقة أعلى ، لأن كل شيء يتم تحويله إلى مخزن مؤقت صغير مع زيادة لاحقة في الحجم. أولاً ، تحتاج إلى استبدال هذا النهج بحيث يمكن إجراء القياس للكائنات الفردية.

ليس لدي أي خريطة طريق للمستقبل ، لذلك يمكنني تنفيذ هذه النقاط بأي ترتيب. ولكن قبل كل هذا ، ستكون الخطوة التالية هي دمج Dear ImGui لزيادة تجميع قائمة الخيارات ، التي لم تدخل اللعبة بعد ؛ بالإضافة إلى ذلك ، سيتم تمكين أو تعطيل التحسينات المذكورة أعلاه. في النهاية ، سأقول أنني سأكون ممتنًا لأي مساعدة في العمل على جيثب !

Source: https://habr.com/ru/post/ar454570/


All Articles