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.

Berikutnya adalah stats armor. Stats armor ini sama dengan stats senjata, tapi ada dua perbedaan: armor nggak punya MinAtk dan MaxAtk, tapi MinDef dan MaxDef. Fungsi dua stats ini mirip dengan stats senjata tapi digunakan sewaktu bertahan.

Selanjutnya aku akan membahas soal perhitungan-perhitungan apa aja yang terjadi sewaktu karakter menyerang musuh (atau sebaliknya). Secara umum, perhitungan yang terjadi adalah: kemungkinan kena --> kemungkinan critical --> perhitungan damage (fisik/sihir).

Kemungkinan kena:
ACC penyerang * rand(6) - EVA yang diserang * rand(6)
kalau hasilnya lebih dari atau sama dengan 0, berarti serangan kena, selain dari itu berarti serangan meleset. Fungsi rand(6) berarti mengambil angka random antara 0 sampai 6

Perhitungan critical:
Game akan mendapatkan angka acak dari 1 sampai 300, kalau angka acaknya kurang dari atau sama dengan LUK, maka serangannya critical, selain itu nggak.

Perhitungan damage fisik:
(ATK penyerang + rand(mintAtk, maxAtk) - (DEF yang diserang + rand(minDef, maxDef))
kalau hasilnya 0 atau kurang, akan diubah menjadi 1, supaya tetap ada damage. Kedua fungsi random ini mengambil angka antara kekuatan serang terendah senjata dan kekuatan serang tertinggi senjata yang di-equip, dan mengambil nilai antara nilai pertahanan terendah armor dan pertahanan tertinggi armor yang di-equip

Perhitungan damage sihir:
(INT penyerang + rand(minMag, maxMag) - (RES yang diserang)
untuk sihir ada property minMag dan maxMag, ini ada di definisi / deskripsi masing-masing sihir. Pertahanan terhadap serangan sihir berbeda dengan terhadap serangan fisik, karena armor yang meningkatkan RES aku buat supaya nggak ada jarak seperti MinDef dan MaxDef. Tapi sebagai gantinya, armor yang meningkatkan RES akan memberikan pertahanan terhadap elemen tertentu, yang kalau benar, bisa mengurangi serangan sihir musuh.

Tabel elemen:
Berikut adalah daftar elemen-elemen dalam game dan hubungannya. Cara membacanya adalah dari baris dulu baru kemudian lihat kolomnya, baru diaplikasikan ke nilai damage. Misalnya: baris api kolom air adalah 50 %, berarti serangan api hanya akan memberikan 50% dari damage total ke sasaran berelemen air.


Api
Air
Angin
Tanah
Petir
Cahaya
Gelap
Api

50%





Air
200%






Angin







Tanah







Petir







Cahaya







Gelap







Nantinya tabel ini akan aku lengkapi, dan juga mungkin aku akan menambahkan elemen baru ke dalam tabel, dan dalam code nanti jangan sampai lupa untuk memasukkan perhitungan elemen ini sesudah menghitung damage tapi sebelum mengurangi currentHP target serangan.

Sebenarnya tulisan ini masih bisa dilanjutkan, karena masih banyak yang belum aku bahas, misalnya saja penggunaan limit break / mystic skill / terserah nanti namanya apa. Tapi untuk sementara, ini saja sepertinya sudah cukup. Tadinya aku ingin menulis code dalam post kali ini, tapi sepertinya belum sempat, mungkin di post berikutnya. See you until then.