Sabtu, 14 September 2013

Construct 2 RPG tutorial part 7: implementing the AI

Selamat datang di bagian ke 7 dari seri tutorial membuat RPG di Construct 2. Kali ini aku akan mencoba mengimplementasikan AI seperti yang sudah aku desain sebelumnya. Aku akan mencoba membuatnya dalam 1 blog post, tapi kalau nggak bisa, berarti blog post ini cuma mencakup AI penyerang fisik.

Pertama-tama aku ingin memastikan bahwa semua petarung di battle scene tahu tentang musuh-musuhnya, karena AI kedua tipe musuh juga akan bergantung dari data ini. Awalnya aku berencana memakai family buat keperluan ini. Tapi ternyata aku nggak bisa menambah / mengurangi member family ini lewat event, padahal buat kebutuhan ini aku harus bisa mengganti member family secara dinamis lewat event (karena tiap battle, musuhnya beda-beda, dan party member pun bisa diganti secara bebas oleh pemain). Jadi untuk mengatasi ini, aku akan membuat array yang berisi data petarung dari party member dan juga dari musuh, array ini bernama enemyPartyArr dan playerPartyArr. Kedua array ini hanya berisi maksimal 4 elemen, karena kita memang membatasi jumlah petarung di sisi player dan musuh dalam battle. Ini juga mengubah fungsi family Friendly, dulunya family ini berisi semua party member yang bertarung, tapi sekarang mungkin lebih cocok berisi semua character dalam game yang bisa bergabung bersama pemain.

Aku mengubah apa yang terjadi di event on start of layout, sekarang kita memberi nama pada battleName musuh dan juga mengisi kedua array petarung, saat ini isinya hanya ada satu tapi nanti isinya akan berbeda-beda.

Kemudian aku membuat instance variable enemySelection di kedua family. Untuk memudahkan kita untuk membedakan nantinya, di family Enemies akan aku namai playerSelection sedangkan di family Friendly aku namai enemySelection. Keduanya memiliki nilai awal "closest". Di bagian bawah, aku membuat function baru bernama "enemySelTarget" yang akan digunakan oleh musuh untuk mencari target pemain. Fungsi ini menerima dua parameter, yaitu nama musuh yang akan mengganti target, dan AI pemilihan target si musuh.

Minggu, 25 Agustus 2013

My published Game: Autobo

Di hari yang cerah (dan panas) ini, aku ingin menulis tentang satu hal bahagia: Game bikinanku sudah dirilis di Blackberry App World! Namanya Autobo, bukan typo dari Autobot tapi memang namanya Autobo. Kenapa dinamai Autobo? karena menurutku nama Autobot sudah umum dan game-ku nggak bisa tampil menonjol kalau nggak punya nama yang unique, karena itu aku sengaja menghilangkan t di akhir namanya, dan jadilah Autobo!

Game ini adalah game stratgi bertipe tower offense, yang awalnya aku buat untuk challenge 7drts, atau membuat RTS dalam tujuh hari. Gameplay yang kubuat sudah selesai dalam satu minggu itu, tapi grafisnya belum cukup polished buat aku masukin sebagai 7drts entry, jadi waktu itu aku sengaja nggak memasukkan ini ke dalam kompetisi 7drts, tapi akan aku buat game sendiri.

Screenshot:

Icon


Jumat, 16 Agustus 2013

Construct 2 RPG tutorial: Mages AI

Baiklah, kita ketemu lagi di blog post yang membahas soal cara membuat RPG. Kali ini aku akan melanjutkan bahasan sebelumnya soal AI, yaitu bagaimana membuat AI penyihir. Sebenarnya membuat AI penyihir ini nggak jauh beda dengan membuat AI untuk petarung, hanya ada sedikit perubahan saja. Ada dua jenis penyihir, yaitu penyihir ofensif / tipe penyerang, dan penyihir suportif, keduanya punya logika sendiri-sendiri.

Pertama-tama kita akan bahas AI dari penyihir ofensif, logikanya adalah seperti ini:
  1. Pilih target
  2. Kalau SP mencukupi untuk men-cast paling nggak satu sihir, pilih sihir
  3. Masuk casting time
  4. Kalau diserang musuh casting time berakhir, sihir gagal di-cast
  5. Kalau bisa casting sampai casting time berakhir, keluarkan sihir dan kurangi current SP
  6. Kalau target masih hidup, kembali ke poin 2
  7. Kalau target sudah mati, kembali ke poin 1
  8. Kalau SP nggak mencukupi, dekati musuh, lalu serang secara fisik.
Aku perlu menambahkan poin terakhir soal kemungkinan kalau ternyata si penyihir nggak punya cukup SP buat mengeluarkan sihir, kalau nggak begitu bisa-bisa penyihir kita cuma berdiri bengong di tengah battle screen. Logika pemilihan target akan kubuat sama seperti penyerang fisik, yaitu menggunakan instance variable enemySelection dan targetName, kalau kamu lupa untuk apa kedua instance variable ini, bisa lihat di blog post sebelumnya.

Berikutnya, penyihir akan memilih sihir apa yang dipakai, untuk sementara aku berencana membuatnya memilih acak, karena aku nggak tahu bagaimana cara membuat AI memilih sihir yang bagus. Sesudah memilih, penyihir akan masuk casting time. Selama casting time ini penyihir nggak bisa berjalan atau melakukan hal yang lain, kalau penyihir dikendalikan oleh pemain maka kita harus mengganti nilai variable state yang sudah aku jelaskan. Semua sihir punya instance variable castTime yang hitungannya dalam detik, nanti kita akan mengurusi variable ini sewaktu kita mulai men-coding sistem penyihir ini. Sepertinya sisa poin-poinnya sudah cukup jelas dan nggak perlu aku jelaskan, kalau belum jelas silahkan tinggalkan komentar.

Kamis, 15 Agustus 2013

Construct 2 RPG tutorial 5: making AI

Jadi sebelumnya aku sudah mulai bikin AI sederhana (sekali) untuk musuh, walaupun hasil akhirnya adalah musuh baru mengikuti pemain saja. Sebelum aku membuat AI dalam bentuk code yang lebih kompleks, aku ingin merancangnya terlebih dulu. Oh iya, walaupun contoh kasusnya untuk musuh, AI ini nantinya bukan cuma untuk musuh saja, tapi juga party member lain dalam kelompok pemain. Dan juga, AI untuk boss juga akan kusamakan dengan AI untuk musuh biasa, hanya saja nilai parameternya kubuat lebih susah.

Baik musuh maupun anggota party member ada yang berperan sebagai penyerang jarak dekat dan penyerang jarak jauh, ada pula penyerang fisik dan penyerang sihir. Jadi dibagi berdasarkan tipenya, musuh dan party member bisa dikategorikan seperti ini:
  • Penyerang fisik jarak dekat
  • Penyerang fisik jarak jauh
  • Penyerang sihir jarak jauh
  • Penyembuh / support
Aku nggak menuliskan penyerang sihir jarak dekat, karena aku menganggap semua penyerang sihir adalah penyerang jarak jauh, lagipula kalau penyerang sihir menyerang dari jarak dekat dia bisa diserang duluan sebelum sempat mengeluarkan sihirnya. Masing-masing penyerang fisik akan punya radius serangan yang jaraknya beda antara jarak dekat dan jarak jauh, penyerang fisik akan mendekat sampai musuh masuk dalam radius serangan sebelum akhirnya menyerang. Penyerang sihir nggak perlu mendekat buat menyerang musuh, jarak jangkau sihirnya adalah seluruh battle screen, jadi mereka bisa menyerang musuh tanpa peduli jarak. Bedanya adalah sihir perlu casting time untuk bisa dirapalkan dan mereka bisa diserang sewaktu ini.

Rabu, 14 Agustus 2013

Construct 2 RPG tutorial 4

Di blog post kali ini aku masih akan membahas tentang battle system. Kalau kalian perhatikan, sewaktu pemain menekan tombol K berulang-ulang (atau tombol serang di gamepad), karakter pemain akan terus-menerus menyerang tanpa henti. Ini akan aku halangi, karena menyerang tanpa henti ini bisa membuat pemain terus menerus menyerang tanpa strategi (atau disebut button mashing). Caranya adalah dengan menambahkan sebuah instance variable attackCount (Number) ke family Friendly, karena aku ingin pembatasan ini juga berpengaruh ke anggota party lainnya nanti. Kemudian di tempat fungsi charaAttacks dipanggil (waktu tombol K di keyboard dan tombol A di gamepad ditekan) tambahkan 1 ke attackCount karakter yang dikendalikan pemain. Kenapa aku tambahkan attackCount di sini dan bukan dalam fungsi charaAttacks? Karena kalau ditambahkan dalam charaAttacks nanti instance variable milik character akan bertambah sewaktu party member yang lain menyerang, atau kita harus mencari cara untuk bisa tahu bahwa yang menyerang adalah karakter dan bukan party member lain. Karena kedua implikasi itu merepotkan, aku memilih untuk menambahkan khusus instance variable character di tempat yang aku yakin pasti karakter yang menyerang. Nantinya kita harus melakukan yang sama pada party member yang lain.



Sesudah itu, tambahkan Timer behaviour ke dalam family Friendly, ini untuk memberi jeda sesudah mereka selesai menyerang sesuai dengan attackCount. Jeda sesudah menyerang ini harus diberi nama, karena aku kesusahan memberi nama, jeda ini aku namai "rest", yang berarti beristirahat sejenak untuk mengatur nafas sesudah menyerang berturut-turut. Untuk memudahkan, aku buat sebuah constant variable berisi "rest". Sekarang, berikan instance variable bernama state ke family Friendly, state ini yang nanti akan aku isi dengan "rest" untuk menandakan karakter ini baru saja menyerang berurutan. Nantinya, variable ini bisa diisi dengan nilai lain seperti: poisoned, stunned, silenced, atau semacamnya.

Rabu, 31 Juli 2013

Construct 2 RPG tutorial: The battle continues...

Sesudah kita membahas tentang battle design di bagian kedua, di bagian ketiga ini aku akan mulai mengimplementasikan apa yang kita desain sebelumnya. Di sini aku mulai memikirkan tentang implementasi stats karakter yang kita desain, dan juga tentang pemakaian equipment / senjata. Pertama-tama mari kita lihat screenshot hasil akhir dari tutorial ini:


Pertama-tama aku akan menambahkan beberapa family baru, family ini adalah fitur construct 2 yang cuma ada di versi berbayar (punyaku versi personal)

Aku akan menjelaskan apa arti dari masing-masing family:
- Enemies: berisi daftar-daftar musuh dalam game
- enemySprites: sprites dari musuh, namanya sama dengan nama musuh
- Friendly: berisi karakter pemain dan party member lain yang bergabung dalam battle. Objek-objek yang ada di family ini nggak bisa dilukai dengan serangan pemain tapi bisa disembuhkan dengan item atau skill penyembuh pemain
- FriendlyAttackFX: efek serangan yang dikeluarkan anggota family Friendly, efek serangan ini yang nanti dites collision detection dengan musuh
- Weapons: daftar senjata yang ada dalam game. Senjata yang ada di sini nggak harus dipakai oleh pemain atau party member yang lain, ini cuma menjadi database senjata.

Minggu, 28 Juli 2013

Game Design: What is fun?

Oke, sudah agak lama nggak nulis blog post kali ini aku mau nulis sesuatu soal salah satu tujuan game dibuat, yaitu memberikan rasa senang kepada pemain. Apa itu fun? Fun adalah perasaan kenikmatan yang kita rasakan ketika kita sedang melakukan aktifitas tertentu, aktifitas ini bisa macam-macam dan dua orang yang melakukan aktifitas yang sama bisa saja merasakan rasa fun yang berbeda. Aktifitas ini bisa berupa menonton film, membaca buku, jalan-jalan, dan berbagai macam. Tapi kali ini, kita akan berbicara soal fun dalam game.

Aku mengelompokkan fun dalam dua macam: Entertaining Fun, dan Challenging Fun. Entertaining fun adalah perasaan senang sewaktu kita merasa rileks dan terhibur, kita tidak perlu bersusah payah untuk mendapatkan perasaan senang macam ini. Game yang memberikan perasaan ini adalah casual game yang sekarang banyak hadir di smartphones. Game tipe ini tidak memberikan banyak tantangan, tantangan yang ada hanyalah tantangan sederhana yang bisa dilalui pemain, baru kemudian tantangan itu diberikan variasi. Contoh yang paling gampang adalah angry birds, tantangan yang diberikan hanyalah satu: membunuh para babi dengan burung yang disediakan. Tantangan ini kemudian divariasikan dengan memberikan beraneka macam burung dengan kemampuan berbeda untuk dilempar, atau diberi penghalang lain dalam satu level (batu sebagai pengganti kayu misalnya). Game semacam ini diberikan untuk pemain yang tidak suka tantangan, dan lebih menginginkan rasa fun yang langsung bisa mereka dapatkan saat itu juga.

Because pigs are too angry birds


Challenging fun adalah kebalikan dari Entertaining fun. Challenging fun tidak membuat pemain merasa senang sewaktu sedang memainkan gameplay dari game, tapi semakin menekan pemain (dalam batas-batas game rules) untuk mengeluarkan kemampuan terbaik mereka untuk mengalahkan tantangan dalam game. Perasaan senang itu baru akan diterima pemain ketika sudah menyelesaikan tantangan itu sendiri. Game yang menggunakan tipe fun seperti ini biasanya adalah game-game yang dirilis di PC, baik itu oleh developer besar atau developer indie. Game ini dibuat untuk gamers yang memang menginginkan tantangan, dan menguji kemampuan mereka dalam mengalahkan tantangan itu.

This is just the easy mode, baby

Jadi ini juga menjadi salah satu bahan pemikiranmu sewaktu kamu membuat game, tipe fun seperti apa yang ingin kamu berikan pada gamers? Sesudah itu terjawab, kamu bisa menentukan challenge & reward yang sesuai dengan tipe gamers yang ingin kamu tuju. Sampai ketemu di blog post berikutnya.