Sistem kemampuan karakter mungkin adalah fleksibilitas yang paling menuntut dalam permainan. Tidak mungkin untuk memprediksi pada tahap desain mana mantra akan muncul di versi final atau di pembaruan berikutnya. Posting ini akan tentang bagaimana saya mengabstraksi proses kemampuan melakukan.
Kemampuan itu sendiri tidak lebih dari serangkaian tindakan. Antarmuka minimum dari kemampuan terdiri dari satu metode: "terapkan", tetapi tidak begitu sederhana tentang kesulitan di bawah cut.

Setiap kemampuan dimulai dengan serangkaian pemeriksaan untuk melihat apakah itu dapat diterapkan. Diantaranya adalah yang biasa, seperti memeriksa isi ulang, ketersediaan mana, jarak pemeriksaan dan lainnya. Sudah terbukti di sini bahwa tidak semua pemeriksaan diperlukan oleh semua kemampuan. Misalnya, ada kemampuan yang diterapkan pada jarak berapa pun. Artinya, kemampuan yang berbeda memerlukan set pemeriksaan yang berbeda sebelum eksekusi. Namun, jelas bahwa banyak pemeriksaan akan diulangi, dan seringkali banyak kemampuan memerlukan set cek yang sama.
Secara total, sebagian dari cek akan diulang secara logis, yang berarti harus diubah sesuai kesepakatan, yaitu, segera di semua tempat. Selain itu, set bagian dari cek dalam kasus umum akan berbeda.
Jika bagian dari pemeriksaan dipilih menjadi objek terpisah yang menerapkan satu antarmuka dan dibangun ke dalam daftar yang ditautkan sendiri, kami mendapatkan rantai templat tanggung jawab.

Jika cek berhasil di tautan, cek di tautan berikutnya akan dimulai, jika tidak ada tautan berikutnya, maka seluruh pemeriksaan dapat dianggap berhasil. Selain tanda centang itu sendiri, tautan itu mungkin juga berisi penangan kesalahan. Misalnya, jika saat memeriksa mana, ternyata itu tidak cukup, maka tautannya dapat memberi tahu pemain tentang hal ini.
Menggunakan rantai tugas, untuk kemampuan [Tembakan yang kuat], kita dapat dengan mudah memasukkan tautan tambahan, memeriksa apakah karakter mengenakan busur atau tautan, memverifikasi bahwa karakter memiliki tingkat kesehatan di bawah 30%, untuk kemampuan [Angin Kedua].
Mari kita mundur dan ingat bahwa ada rantai cek yang sama untuk banyak kemampuan. Mari kita menyoroti esensi dari permintaan pemenuhan kemampuan dan menggambarkan masing-masing jenis rantai tes dengan kelasnya.
Permintaan hanya diperlukan untuk menyusun rantai tugas, meluncurkannya dan membatalkannya ketika pemain memberikan perintah yang sesuai.

Kami akan membuat rantai dalam implementasi kueri.
Saat ini, kami telah belajar bagaimana melakukan tes yang fleksibel dari kemampuan untuk melakukan kemampuan. Sekarang, dalam hal pemeriksaan yang berhasil, masih perlu memenuhi kemampuan.
Saya lebih suka melakukan ini tanpa mengubah antarmuka, menambahkan tautan sukses selalu terakhir yang kemampuannya lakukan sebagai efek samping. Berikut ini adalah contoh penerapannya:
public class TerminalChecker: ICastChecker { CastChecker next { get; set; } ISkill skill; public TerminalChecker(ISkill skill) { this.skill = skill; } public bool check() { skill.cast(); return true; } }
Implementasi ini memungkinkan kami untuk membuat permintaan tidak sinkron. Ini berguna ketika kita membutuhkan informasi tambahan dari pengguna. Misalnya, kemampuan harus diterapkan ke beberapa area yang pemain pilih dengan mouse. Tentu saja, Anda tidak dapat menghentikan permainan saat ini.
Sekarang kita harus mencocokkan permintaan dengan kemampuan. Kami akan melakukan ini, tentu saja, menggunakan polimorfisme dengan menambahkan properti ke antarmuka kemampuan. Pada tahap ini, kami memperluas kemampuan ke antarmuka ini:

Setelah semua pekerjaan selesai, mari kita pikirkan apa itu kemampuan. Dalam implementasi saat ini, ini adalah serangkaian tindakan yang didahului oleh serangkaian pemeriksaan. Perhatikan bahwa pada level tinggi, kita sama sekali tidak bergantung pada logika game tertentu. Dengan ide awal untuk menggambarkan sistem kemampuan sebagaimana diterapkan pada mantra, kami mendapatkan sistem yang, menurut aturan tertentu, memberi atau tidak memungkinkan kami untuk melakukan tindakan sewenang-wenang.
Karena properti ini, sistem ini dapat menjelaskan setiap modifikasi dari dunia game. Misalnya, transaksi penjualan atau tim konstruksi bangunan.
Mari kita lihat semuanya secara umum lagi

Dalam contoh ini, kemampuan Sprint adalah kemampuan normal tanpa target, kelas yang mengimplementasikan permintaan untuk kemampuan tersebut adalah NontargetCastRequest, yang pada gilirannya membentuk rantai pemeriksaan dari ManaChecker, CooldownChecker, dan TerminalChecker.
Kode panggilan tidak tergantung pada detail implementasi sistem ini, yaitu, kami tidak akan merusak logika permainan dengan menambahkan atau mengubah kemampuan.
Ini adalah sistem kemampuan karakter dalam bentuk minimal. Model ini tidak memiliki sarana untuk mengingatkan kode panggilan, mentransfer kemampuan ke antarmuka pengguna, dan detail kehidupan lainnya. Anda bisa memikirkannya sendiri.