Hierarichal Finite State Machine di Gim Heisters

December 08, 2022

Penggunaan Hierarichal Finite State Machine (HFSM) berdasar apa yang saya ketahui ini adalah kumpulan dari beberapa low-level Finite State Machine (FSM) dengan cabang-cabang kondisi yang menentukan FSM mana yang akan digunakan dan kapan harus transisi ke FSM yang lainnya. Saya belajar tentang HFSM melalui video Youtube dan mengekplorasi program half-life 2 yang ada di github yang telah dibagikan valve secara resmi.

Sebelumnya, game Heisters adalah game mobile 3d pertama saya yang saya dan teman-teman dari uniXcorp dalam inkubasi startup bernama indigo game incubation batch 5. Untuk info lengkap tentang acara tersebut bisa di cek di laman penelusuran. Aku mencoba mengadaptasi HFSM half-life 2 ke program game heisters tersebut. Secara garis besar struktur kode terdapat beberapa bagian penting yaitu MaintainActivity, PrescheduleThink, dan MaintainSchedule. Pada bagian MaintainActivity dimaksudkan untuk mengatur segala urusan animasi karakter. Pada bagian PrescheduleThink berguna untuk mengecek kondisi atau trigger global seperti menemukan musuh dalam jarak tembak. Pada bagian MaintainSchedule memiliki tugas mengelola state, menemukan state yang ideal, dan transisi schedule- schedule. Adapun schedule itu sendiri adalah satu kombinasi beberapa kegiatan/task. Sebagai contoh schedule membuka pintu, terdiri dari task berjalan mendekati pintu, menghadap ke arah pintu, membuka pintu, dan selesai. Ketika satu schedule selesai maka akan dilanjutkan schedule lainnya dalam satu state sesuai kondisi yang dimiliki karakter.

Pada gim heisters ini, aku menggunakan beberapa state diantaranya IDLE sebagai state permulaan, ALERT ketika karakter sadar akan ancaman/bahaya, COMBAT ketika karakter sedang melawan musuh, DEAD ketika karakter mati, SCRIPT digunakan untuk karakter yg diprogram khusus untuk suatu skenario, GUARD ketika karakter diminta untuk menjaga rekan lainnya, INTERACTING ketika karakter sedang melakukan interaksi terhadap objek yang dapat diinteraksi, STANDBY ketika karakter sedang menunggu aksi selanjutnya dari rekan utama, dan KNOCK ketika karakter kehabisan darah sehingga pingsan perlu diselamatkan rekan lainnya. State-state tersebut kemudian disebut sebagai High-State pada gim Heisters. Sebagian besar karakter paling sering menggunakan state COMBAT dan state ALERT dimana pemicu trasisi ke state tersebut apabila karakter melihat musuh atau mendengar sesuatu yang membuat dia curiga dengan daerah sekitar. Sementara state-state seperti INTERACTING, GUARD, dan STANDBY sifatnya lebih cepat usai disebabkan transisi ke high state lain ketika kegiatan/task telah berakhir. Sebagai contoh interaksi/membuka brankas pada state INTERACTING. Setelah brankas telah terbuka kemudian akan transisi ke state ALERT. Dalam sebuah state yang memiliki schedule yang berjalan, memiliki kemungkinan schedule gagal akibat tidak memenuhi kondisi atau karena suatu error. Misalnya saat ini karakter memiliki state COMBAT dan sedang melakukan schedule “menembak”, namun schedule gagal akibat perluru habis dan harus melakukan reload. Sehingga schedule akan bertransisi ke schedule “reloading” dalam satu state yang sama yaitu state COMBAT.

Pada implementasinya, saya mengimitasi half-life 2 dengan membuat enum dari masing-masing schedule. Enum tersebut digunakan sebagai identifier pada suatu schedule. Sehingga untuk mendapat suatu schedule cukup menyimpan identifier schedule itu. Akan tetapi pada half-life 2 menggunakan switch untuk mendapatkan schedule. Hal tersebut akan cenderung lebih lambat jikalau ada ratusan schedule. Akhirnya saya memutuskan untuk mendaftarkan tiap-tiap schedule ke dalam sebuah dictionary static milik kelas karakter dengan key-nya adalah identifier schedule tersebut. Jadi ketika karakter butuh mendapatkan informasi suatu schedule cukup mengambil dari dictionary  tersebut menggunakan idetifier enum.

Rencana kedepannya Hierarichal State Machine akan dibedakan berdasarkan role tertentu. Seperti role medic memiliki behavior untuk selalu di belakan rekan lainnya untuk bersiap melakukan healing. Kemudian juga ada role Guardian yang memiliki behavior untuk selalu menjadi benteng di depan dengan membawa tactical shield. Juga ingin saya tambahkan beberapa parameter seperti aggresiveness, agility, dan endurance. Aggresiveness akan menjadikan aksi lebih berani baku tembak dengan musuh bahkan saat darah minim. Agility akan membuat karakter lebih gesit dan lebih sering berganti-ganti spot tempat berlindung. Dan Endurance akan membuat karakter lebih banyak darah dan mengurangi damage yg diterima.

Itulah gambaran umum dari Hierarichal Finite State Machine yang kami develop dalam game heisters untuk mengatur behavior karakter. Terima kasih sudah repot-repot membaca dan saya terbuka untuk kritik, saran, dan pertanyaan. Mengingat ini merupakan gim pertama kami yang mencoba mengadaptasi HFSM yang mana sebelumnya hanya FSM. Pastinya banyak fase eksperimen saat kami membuatnya.

...

Profile picture

Written by annas nuril iman . You should follow them on Twitter