كتابة ساحة PvP مبنية على أساس مع حركات متزامنة

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



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

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

نظرًا للمزيج الفريد من أنواع الألعاب المشابهة ، لم يكن هناك ببساطة أي ألعاب في السوق ، لكنني أردت حقًا لعب شيء من هذا القبيل.

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

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

اللعب


بشكل عام ، يذكرنا الحدث بألعاب XCOM متعددة اللاعبين ، ولكن مع فرصة 100 ٪ للضرب والأبطال (كما هو الحال في نوع MOBA).

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

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

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

القرار- مرحلة تتاح فيها الفرصة للاعبين لاختيار الإجراءات التي يريدونها. يتجمد ميدان اللعب لعدة عشرات من الثواني ، ويجب على اللاعبين اختيار الإجراءات المحددة التي يجب على الشخصيات التي يتحكمون بها القيام بها عند انتهاء "توقف الوقت". يرى كل لاعب الإجراءات التي سيتخذها حلفاؤه ، لكن الإجراءات التي يختارها الخصوم تكون مخفية.

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

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



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

لا تتجاوز قيمة الضرر النموذجي 35 لتسهيل احتساب اللاعبين في أذهانهم. تأثيرات وقدرات الحالة قليلة بما يكفي لنفس السبب. وضع اللعبة الرئيسي هو مباراة الموت المعتادة ، والتي تصل إلى 5 عمليات قتل أو 20 حركة.

التنفيذ


قررت الكتابة في C # (نظرًا لأن هذه هي لغتي الرئيسية) ، واخترت Unity كمحرك (حيث لم يكن لدي خبرة سابقة في إنشاء الألعاب ، ولكنها تدعم C # وهي صديقة تمامًا للمبتدئين).

لا تتطلب الألعاب المستندة إلى الأدوار قدرًا كبيرًا من الموارد ، لذلك منذ البداية نظرت في معظم خيارات الميزانية لاستضافة الخادم الرئيسي. كانت هناك فكرة للاستضافة على heroku (لأنها مجانية بشكل عام) ، ولكن إعادة تشغيل التطبيق في وقت عشوائي مرة واحدة على الأقل في اليوم أمر غير مريح للغاية. توقف عند VPS مع Linux مقابل 45 روبل شهريًا.

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

من أجل راحة اللاعبين ، قام مشغل قاذف بسيط لـ WinForms بإيقاف تشغيله ، والذي يقوم ، إذا لزم الأمر ، بتنزيل الإصدار المحدث من العميل من Dropbox.

الآن سوف أسهب في مزيد من التفاصيل حول اللحظات الأكثر إثارة للاهتمام (أو التي تسبب الصعوبات) التي واجهناها أثناء تطوير اللعبة.

إجراء استخدام القدرات


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

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

منطق لعبة بسيطة


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

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

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

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

ماذا أفعل؟
  • الإرتداد في كليهما
  • فرز الأبطال أبجديا
  • فرز حسب معرف اللاعب
في الواقع ، الحل هو أن لدينا المزيد من البيانات - الموضع الذي أطلقت منه اللقطة. إذا لم تتمكن من اختيار أقرب هدف للارتداد ، فيمكنك فرز الأبطال في اتجاه عقارب الساعة ، حيث يكون الهدف الرئيسي هو المركز ، والبطل الذي طبق القدرة هو موقع البداية.

هندسة صادقة


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

مرات الطلاء

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

تقرر التحقق من مدى الرؤية ليس فقط بين المراكز ، ولكن بين بعض النقاط المحددة.

ارسم اثنين


لذا ، فإن استخدام أربع نقاط إضافية على طول حواف البطل قلل "المنطقة الميتة" إلى 60 درجة (والتي أصبحت قابلة للعب بالفعل).

ونتيجة لذلك ، أصبحت الجدران مفيدة حقًا.

ترسم ثلاثة

يتم تمييز الخلايا باللون الأخضر ، وستتسبب اللقطات منها ضد البطل 50 ٪ فقط من الضرر (لا يمكن إصابة جميع الخلايا بها دون الحاجة إلى اختراق جدران الهجوم).

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

إليك رابط إلى gif (20 ميغابايت) ، حيث يمكنك رؤية كيفية عمل التحول التلقائي لنقطة اللقطة.

الموقع


لإضافة الترجمة ، استخدمت سلسلة. تنسيق (بحيث لا تؤدي التغييرات المتوازنة في أرقام الضرر إلى إنشاء خطوط جديدة) ولوحة Google. يتم لف جميع السلاسل المستخدمة للعرض على الشاشة بطريقة تستكمل وتتحقق من القاموس من الترجمات المعروفة. في بداية الإصدار الأول من اللعبة ، يتم تحميل الترجمات من لوحة Google إلى ملف نصي بتنسيق json ، ويتم تنزيل الأسطر من شفرة المصدر بدون ترجمات تلقائيًا إلى نفس لوحة Google في أول محاولة للعرض على الشاشة. في نسخة إصدار اللعبة ، لأسباب واضحة ، لا توجد وظائف عبر الإنترنت للعمل مع الجدول ، ويتم تحميل الترجمات ببساطة من الملف النصي الموجود عند بدء التشغيل.

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

مجرفة


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

  • إن أمكن ، لا تعيد اختراع العجلة.
    إذا كانت المشكلة واسعة الانتشار ، فيجب أن يكون هناك العديد من الحلول الجاهزة لها. قد يستغرق إيجاد حل مناسب جاهز وقتًا أقل من كتابته بنفسك من البداية (خاصة إذا كانت المشكلة معقدة).
    . , . , , . NetworkStream-, TcpClient- Json. , , . 30 ( MagicOnion, )

  • — , . — . . — . — .

  • — , . - summary readme. .
  • ,
    . . — , — , , .
  • Git — ,
    , . .
  • ,
    . .
  • ,
    . , , , , . , , , .


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

أنا شخصياً ، أثناء العمل في المشروع ، قمت بضخ اللغة الإنجليزية المنطوقة (لأن المجتمع دولي) ، واكتسبت خبرة في العمل مع Linux والبرمجة واستخدام Unity. مشروعات الحيوانات الأليفة رائعة.

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

روابط للمهتمين بالفكرة
Discord-. .

, , - — , Atlas Reactor

All Articles