Menulis arena PvP berbasis giliran dengan gerakan simultan

Dalam artikel ini saya akan berbicara tentang apa yang mendorong pembuatan game dalam genre yang tidak biasa, genre apa itu, bagaimana perkembangannya berkembang, kesulitan apa yang kami temui, dan bagaimana kurang dari satu tahun bekerja di malam hari kami berhasil membuat prototipe yang dapat dimainkan sepenuhnya.



Pada musim semi 2017, saya menemukan insentif Reaktor Atlas . Permainan itu semacam campuran liar catur, poker, dan massa, dan kombinasi genre yang tidak biasa benar-benar menarik perhatian saya. Dia menjadi permainan favorit saya, saya berpartisipasi dalam turnamen dan acara online, dan semuanya akan baik-baik saja, tapi ...

Pada musim panas 2019, server ditutup, karena karena popularitas permainan yang rendah, dukungan mereka tidak menguntungkan bagi penerbit. Game ini dibangun berdasarkan model game-as-a-service , jadi mematikan server mengubah klien menjadi potongan-potongan kode.

Karena kombinasi unik dari genre permainan yang sama, tidak ada permainan di pasar, tetapi saya benar-benar ingin memainkan sesuatu seperti itu.

Tidak lama setelah penutupan, saya menemukan sebuah posting di reddit bahwa sekelompok penggemar dari antara mantan pemain memutuskan untuk membuat server pribadi dan menyesuaikan kode klien untuk bekerja dengannya, tetapi saya tidak punya banyak keinginan untuk bergabung dengan mereka. Saya tidak pernah tertarik pada rekayasa terbalik, dan selain itu, kegiatan seperti itu tidak terlihat terlalu legal.

Pada akhirnya, saya memutuskan untuk mengumpulkan orang dan mengatur pekerjaan pada "pewaris spiritual" - untuk membuat permainan dengan mekanik yang sama, tetapi karakter baru, kemampuan, kartu dan THT. Kami mulai bekerja dengan antusiasme murni di malam hari dan di akhir pekan. Kami ingin membawa sesuatu ke genre kami, menambah variabilitas dan kedalaman, dan memperbaiki kekurangan dari aslinya. Sejak awal sudah jelas bahwa permainan itu tidak akan menjadi sangat populer, tetapi saya yakin bahwa setidaknya beberapa ribu orang mungkin tertarik. Setidaknya - penggemar Atlas Reactor tertutup.

Gameplay


Secara umum, aksinya mengingatkan pada multiplayer XCOM, tetapi dengan 100% peluang untuk memukul dan pahlawan (seperti dalam genre MOBA).

Ide dari permainan ini adalah bahwa semua hasil sepenuhnya ditentukan oleh tindakan tetap para pemain. Keacakan benar-benar tidak ada, dan variasinya cukup rendah sehingga pemain yang berpengalaman dapat menghitung semua hasil yang mungkin dan bertindak berdasarkan informasi ini. Untuk mengurangi variabilitas, digunakan lapangan datar yang dibagi ke dalam sel, yaitu, pahlawan hanya bisa berdiri di tengah sel (meskipun kemampuan biasanya diterapkan di mana saja, tanpa merujuk ke grid).

Biasanya 8 orang berpartisipasi dalam pertandingan. Mereka dibagi menjadi 2 tim yang terdiri dari 4 orang, dan masing-masing mengontrol satu karakter. Namun, karena langkah demi langkah, tidak ada yang menghalangi untuk membuat mode di mana hanya 2 orang berpartisipasi, dan masing-masing mengontrol keempat karakter timnya.

Gim ini dibagi menjadi beberapa gerakan. Setiap langkah dibagi menjadi dua tahap - keputusan (pengambilan keputusan) dan resolusi(tampilan hasil tindakan yang dipilih). Dinamika ditambahkan oleh fakta bahwa kedua tahap terjadi untuk kedua tim pada saat yang sama (jenis langkah-demi-langkah ini disebut We-Go) - tidak ada hal yang dipikirkan oleh satu tim dan yang kedua hanya menunggu, melihat layar di mana tidak ada yang terjadi. Alih-alih, kedua tim membuat keputusan dan mengamati hasilnya secara bersamaan. Simultanitas gerakan dan keberadaan bidang pandang karakter mengarah pada fakta bahwa permainan tidak dapat dikaitkan dengan permainan dengan informasi lengkap .

Keputusan- fase di mana pemain memiliki kesempatan langsung untuk memilih tindakan yang diinginkan. Lapangan bermain "membeku" selama beberapa puluh detik, dan para pemain harus memilih tindakan spesifik apa yang harus dilakukan oleh karakter yang dikontrol oleh mereka ketika "waktu berhenti" berakhir. Setiap pemain melihat tindakan apa yang akan dilakukan sekutu-sekutunya, tetapi tindakan yang dipilih oleh lawan tersembunyi.

Resolusi - fase di mana tindakan yang dipilih dilakukan. Pada waktunya, dibutuhkan kira-kira sama dengan Keputusan, atau sedikit kurang. Selama itu, para pemain tidak memiliki kontrol - mereka hanya mengamati apa yang terjadi dan memikirkan tindakan untuk langkah selanjutnya.

Resolusi dibagi menjadi beberapa fase. Fase berjalan berurutan, dan untuk setiap kemampuan para pemain tahu sebelumnya di mana fase itu akan bekerja. Dalam hal ini, urutan pengoperasian kemampuan dalam satu fase tidak masalah.



Sebagai aturan, kerusakan dilakukan pada fase Blast, sehingga kemampuan defensif memicu lebih awal - Anda bisa menerapkan perisai pada fase Prep atau bergerak (menghindar) dalam fase Dash. Tetapi saat menghindar, musuh dapat menerima damage jika melewati jebakan (diatur oleh pemain pada fase Prep). Selain itu, jika musuh tidak mengelak, tetapi tetap berada di tempatnya, maka jebakan tidak akan bekerja dan tidak akan menyebabkan kerusakan padanya. Hal yang sama dengan perisai: jika Anda tidak menyerang karakter yang dilindungi, maka mereka hanya akan terbakar di akhir belokan, tanpa memiliki efek apa pun. Yang menarik di sini adalah bahwa, sebagaimana disebutkan di atas, tindakan lawan pada saat pengambilan keputusan disembunyikan, dan oleh karena itu mereka harus diramalkan.

Nilai kerusakan tipikal tidak melebihi 35 untuk membuatnya lebih mudah bagi pemain untuk menghitung dalam pikiran mereka. Efek dan kemampuan status cukup sedikit untuk alasan yang sama. Mode permainan utama adalah deathmatch biasa, yang mencapai 5 kill atau 20 move.

Penerapan


Saya memutuskan untuk menulis dalam bahasa C # (karena ini adalah bahasa utama saya), dan saya memilih Unity sebagai mesinnya (karena saya tidak memiliki pengalaman sebelumnya dalam membuat game, tetapi secara alami mendukung C # dan cukup ramah untuk pemula).

Permainan berbasis giliran tidak memerlukan banyak sumber daya, jadi sejak awal saya menganggap opsi anggaran paling untuk hosting server utama. Ada ide untuk di-host di heroku (karena umumnya gratis), tetapi memulai ulang aplikasi secara acak setidaknya sekali sehari sangat merepotkan. Dia berhenti di VPS dengan Linux untuk 45 rubel per bulan.

Mengingat sumber daya yang terbatas di hosting (terutama - ruang yang sangat sedikit pada hard drive) dan fakta bahwa semua logika permainan bekerja dalam 2D, saya memutuskan untuk membuatnya di .NET Core (dengan menulis mesin 2d ringan saya untuk menghitung area yang dipengaruhi oleh kemampuan), dan menggunakan Unity murni untuk visualisasi sisi klien. Ini memungkinkan untuk hanya mengontrol bidang tampilan karakter di sisi server, dan mengirimkan klien hanya informasi yang harus mereka ketahui. Tindakan pemain yang dipilih sebelum memproses di server divalidasi, yang sepenuhnya mengecualikan kemungkinan kecurangan.

Demi kenyamanan para pemain, peluncur sederhana untuk WinForms memotongnya, yang, jika perlu, mengunduh versi klien yang diperbarui dari Dropbox.

Sekarang saya akan membahas lebih detail tentang saat-saat paling menarik (atau menyebabkan kesulitan) yang kami temui saat mengembangkan game.

Prosedur untuk menggunakan kemampuan


Seperti disebutkan di atas, hasil yang diperoleh tidak harus bergantung pada urutan penerapan kemampuan dalam fase. Di server, kemampuan digunakan dalam urutan id pahlawan, tetapi pemain tidak boleh memikirkannya. Kondisi ini memaksakan pembatasan pada apa dan dalam fase apa yang dapat terjadi (desainer game dipaksa untuk mempertimbangkan hal ini saat membuat kemampuan).

Misalnya, sekali pada tahap Persiapan Anda dapat menerapkan perisai, maka Anda tidak dapat merusaknya (jika tidak akan tergantung pada id, kerusakan akan beralih ke perisai, atau langsung ke kesehatan sebelum diterapkan). Demikian pula, karena kerusakan dapat ditangani dalam fase Blast, tidak diperbolehkan untuk menerapkan efek status "Perkasa", yang meningkatkan kerusakan yang dilakukan oleh pahlawan. Aturan serupa muncul untuk semua elemen game.

Logika game sederhana


Gagasan utama dari gim ini adalah bahwa pemain dapat menghitung di kepala mereka semua perkembangan acara dalam kursus, dan oleh karena itu logika semua elemen gim harus sederhana dan intuitif. Tetapi dengan implementasi rencana banyak kesulitan muncul.

Pertama, gerakan . Pahlawan dapat bergerak selama fase Dash dan Move, dan gerakan ini harus terjadi secara bersamaan. Dua pahlawan diperbolehkan berada di sel yang sama saat mereka bergerak, tetapi pada akhir fase gerakan, tidak lebih dari satu karakter yang harus tetap di setiap sel.

Aturan paling sederhana untuk menyelesaikan konflik di akhir gerakan adalah "siapa pun yang bangun lebih dulu, itu dan sandal." Jika pahlawan telah melakukan perjalanan jauh sebelum berada di sel "kontroversial", maka dia harus didorong kembali, dan orang yang telah menempuh jalan yang lebih kecil harus dibiarkan di tempatnya. Jika para pahlawan mencapai tujuan mereka, setelah menempuh jarak yang sama, maka dorong mereka berdua. Karena determinisme, diputuskan untuk mendorong para pahlawan kembali di sepanjang lintasan gerakan mereka. Penolakan itu diulang sampai semua konflik diselesaikan.

Masalah kedua adalah kesetaraan . Misalkan kita ingin membuat profil yang, ketika menabrak musuh, memberikan kerusakan padanya dan secara otomatis memantul ke terdekatbaginya sebuah karakter. Masalahnya di sini adalah kombinasi "otomatis" dan "terdekat". Pahlawan terletak di bidang kotak-kotak, yang berarti bahwa di samping target utama pada jarak minimum yang sama mungkin ada beberapa karakter.

Apa yang harus dilakukan?
  • Ricochet di keduanya
  • Sortir Pahlawan secara Abjad
  • Urutkan berdasarkan id pemain
Faktanya, solusinya adalah kita memiliki lebih banyak data - posisi dari mana tembakan dilepaskan. Jika Anda tidak dapat memilih satu target terdekat untuk rebound, maka Anda dapat mengurutkan para pahlawan searah jarum jam, di mana tujuan utama adalah pusat, dan pahlawan yang menerapkan kemampuan adalah posisi awal.

Geometri Jujur


Ternyata, bermain dengan geometri yang jujur ​​tidak menarik. Dindingnya tahan terhadap sebagian besar tembakan dan menghalangi bidang pandang lawan, dan juga berfungsi sebagai tempat berlindung (dan jika kerusakan berasal dari sisi tempat berlindung, maka itu berkurang 50%). Namun, dinding sangat membatasi area yang terkena dampak untuk pahlawan itu sendiri, dan karena ini, para pemain tidak melihat alasan untuk menggunakannya.

Waktu cat

β€” , β€” . ( ) β€” . , 90 .

Diputuskan untuk memeriksa rentang visibilitas tidak hanya antara pusat, tetapi antara beberapa titik tertentu.

Lukis dua


Jadi, penggunaan empat poin tambahan di sepanjang tepi pahlawan mengurangi "zona mati" menjadi 60 derajat (yang sudah menjadi cukup dimainkan).

Hasilnya, dinding menjadi sangat berguna.

Cat tiga

, 50% ( , ).

Poin tambahan terletak tepat di tengah-tengah antara pusat sel dan ujung-ujungnya, dan pilihan ini tidak disengaja. Untuk serangan persegi panjang, sangat penting untuk menembak dari mana (karena titik ini digunakan untuk menghitung rebound dari dinding, ledakan, dan beberapa pengubah serangan lainnya). Algoritma sederhana memungkinkan untuk secara otomatis menggeser titik awal di dalam hero, tergantung pada posisi mouse. Dalam hal ini, titik terletak untuk memaksimalkan kisaran tembakan dekat dengan dinding.

Berikut ini adalah tautan ke gif (20Mb) , tempat Anda dapat melihat bagaimana pergeseran otomatis dari titik pengambilan gambar.

Lokalisasi


Untuk menambahkan pelokalan, saya menggunakan string.Format (agar perubahan yang seimbang pada angka kerusakan tidak membuat garis baru) dan pelat Google. Semua string yang digunakan untuk ditampilkan di layar dibungkus dengan metode yang interpolasi dan memeriksa kamus dari terjemahan yang dikenal. Pada awal versi debut gim, terjemahan dari lempeng Google dimuat ke dalam file teks dalam format json, dan garis-garis dari kode sumber tanpa terjemahan secara otomatis diunduh ke lempeng Google yang sama pada upaya pertama untuk ditampilkan di layar. Dalam versi rilis game, untuk alasan yang jelas, tidak ada fungsi online untuk bekerja dengan tabel, dan terjemahan hanya dimuat dari file teks yang ada saat startup.

Untuk penerjemah, solusinya tidak terlalu nyaman (karena mengubah satu kata mengarah ke pembuatan baris baru dalam tabel), tetapi sangat sederhana untuk diterapkan dan tidak membebani pemrogram dengan bekerja dengan sumber daya. Akan ideal jika garis tidak berubah selama proses pengembangan, tetapi ini tidak terjadi pada kami.

Menyapu


Sekarang - yang paling menarik. Beberapa kiat jelas yang dapat membantu programmer pemula yang memutuskan untuk memotong proyek kesayangan mereka dalam tim yang terdiri dari orang-orang yang berpikiran sama.

  • Jika memungkinkan, jangan menemukan kembali roda.
    Jika masalahnya tersebar luas, maka harus ada banyak solusi yang siap pakai untuk itu. Menemukan solusi siap pakai yang sesuai mungkin membutuhkan waktu lebih sedikit daripada menulisnya sendiri dari awal (terutama jika masalahnya rumit).
    . , . , , . NetworkStream-, TcpClient- Json. , , . 30 ( MagicOnion, )

  • β€” , . β€” . . β€” . β€” .

  • β€” , . - summary readme. .
  • ,
    . . β€” , β€” , , .
  • Git β€” ,
    , . .
  • ,
    . .
  • ,
    . , , , , . , , , .


Ternyata membuat prototipe yang dapat dimainkan dalam waktu kurang dari satu tahun. Sebagian dari komunitas aktif telah bergabung dalam pengembangan atau pengujian, jadi sekarang setidaknya beberapa pertandingan berlangsung hampir setiap hari. Sangat keren melihat bagaimana orang-orang menikmati permainan, di mana saya mengambil bagian aktif.

Secara pribadi, selama bekerja di proyek saya memompa bahasa Inggris yang digunakan (karena komunitas internasional), memperoleh pengalaman bekerja dengan Linux, pemrograman dan menggunakan Unity. Proyek hewan peliharaan itu keren.

Seiring waktu, kami pasti akan menambahkan pelatihan untuk pemain baru, model dan animasi normal, menu yang memadai, dan UI yang lebih nyaman secara keseluruhan. Karena model 3D yang baik sangat mahal, mereka membuat akun di Patreon, dan komunitas mulai mendukung kami secara finansial.

Tautan untuk mereka yang tertarik dengan gagasan itu
β€” Discord-. .

, , - β€” , Atlas Reactor

All Articles