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.

Rabu, 17 Juli 2013

Construct 2 RPG tutorial: battle design!

Baik, sekarang kita memasuki bagian kedua dari tutorial membuat RPG dengan Construct 2!  Kali ini aku ingin melanjutkan membuat battle system, tapi sebelum itu aku harus menyentuh ke desain pertarungannya dulu, supaya kita punya dasar ketika coding nanti. Jadi untuk sekarang ini aku akan menulis soal game design dari sisi pertarungan.

Yang pertama-tama akan aku bikin adalah stats. Entah stats ini singkatan dari apa, tapi dalam RPG sudah sering kita temui stats, baik stats musuh ataupun stats pemain. Stats yang aku bicarakan ini beda dengan status dalam artian status effect, karena status effect adalah efek buff (baik) atau debugg (buruk) yang mengenai pemain / monster. Stats-stats ini adalah sebagai berikut:

  • HP: Health point. Total health, kalau pemain / monster disembuhkan, nilai currentHP ngga bisa melewati ini.
  • CurrentHP: Health saat ini, kalau turun sampai 0 maka pemain / monster mati.
  • SP: Spirit point. Dipakai untuk menggunakan skill / sihir, nilai currentSP ngga bisa melewati ini.
  • CurrentSP: Spirit point saat ini, berkurang tiap kali memakai skill / sihir. Kalau jumlahnya kurang dari yang dibutuhkan untuk menggunakan skill / sihir, maka skill / sihir itu ngga terpakai.
  • ATK: Attack. Nilai serangan karakter, digunakan untuk menentukan besaran kekuatan serangan fisik / skill bersama dengan kekuatan senjata.
  • DEF: Defense. Nilai pertahanan karakter, dipakai untuk menentukan pertahanan terhadap serangan fisik yang juga dihitung bersama dengan pertahanan armor.
  • ACC: Accuracy. Kemungkinan serangan kena atau nggak. Serangan jarak dekat, jarak jauh, dan sihir /skill dihitung pakai stats ini.
  • EVA: Evasion. Kemungkinan menghindari serangan.
  • INT: Intelligence: Tingkat kecerdasan, dipakai untuk menentukan kekuatan serangan sihir
  • RES: Resistance. Ketahanan terhadap serangan sihir.
  • LUK: Luck. Menentukan tingkat critical dan mungkin hal-hal lain yang bergantung pada keberuntungan (item drop misalnya).

Baik karakter pemain ataupun monster memiliki stats yang sama, yang membedakan adalah nilainya. Monster akan memiliki lebih banyak HP dibandingkan dengan karakter pemain, karena nantinya monster nggak akan menyerang seagresif pemain, dan kebanyakan monster nggak punya skill / sihir seperti pemain (kecuali tentunya boss).

Berikutnya adalah stats yang diberikan dari senjata. Sudah umum kita temui dalam RPG, semua senjata punya atribut seperti ATK dan semacamnya, jadi senjata dalam game ini pun juga seperti itu. Di bawah ini adalah stats dari senjata:


  • MinAtk: Kekuatan serang terendah senjata ini
  • MaxAtk: kekuatan serang tertinggi senjata ini.
  • StatsMod: Modifier dari stats tertentu dari pengguna senjata, kalau ada. Stats ini boleh kosong.
  • Elemen: Elemen senjata, boleh kosong.

MinATK dan MaxAtk adalah bonus serangan yang didapat karakter dari senjata, nantinya sewaktu menyerang karakter akan mendapat bonus ATK yang berkisar antara MinAtk dan MaxAtk, sehingga tiap serangan akan menghasilkan damage yang bervariasi seperti RPG pada umumnya. StatsMod adalah tambahan stats tertentu yang didapat karakter sewaktu sedang meng-equip senjata ini. Nggak semua senjata punya StatsMod jadi boleh kosong. Contoh dari StatsMod ini adalah senjata yang punya kekuatan spiritual sehingga meningkatkan SP pemain yang memakainya. Kemudian elemen adalah elemen senjata, ini nggak perlu dijelaskan pasti sudah jelas, elemen ini bisa saja dimiliki senjata sejak awal, atau ditambahkan dari proses crafting. Ini masih belum seluruhnya dari atribut senjata, masih ada yang belum aku bahas seperti nama senjata, definisi, harga beli, dan harga jual. Tapi di sini aku lebih fokus ke stats senjata dalam battle, jadi ini aja cukup.