KATA PENGANTAR
Sebenernya tutorial ini sebagian hanya merupakan terjemahan dari tutorial Fomar0153 yang ternyata saya rasakan sangat berguna untuk diterapkan. Mungkin banyak member yang sudah tahu masalah penggunaan damage formula ini. Akan tetapi tutorial ini memang ditujukan kepada para New RMer.
PART I
Langsung ke pokok masalah, coba agan buka tab Skill Attack lalu lihat di formulanya. Nah di situ kan ada tulisan:
- Code:
-
a.atk * 4 - b.def * 2
Kali ini saya akan mencoba share knowledge tentang bagaimana menyiasati damage formula ini agar lebih bervariasi.
Sebelum masuk ke materi, ada baiknya kita mengetahui salah satu cara membuat conditional if then else end dalam satu line.
- Code:
-
if a == 10
puts "true"
else
puts "false"
end
Line di atas dapat disingkat menjadi:
- Code:
-
if a == 10;puts "true"; else; puts "false"; end
Tanda titik koma menunjukkan end of line
atau
- Code:
-
a == 10 ? puts "true" : puts "false"
nah, jadi formatnya
- Code:
-
condition <spasi>?<spasi> true <spasi>: <spasi> false
Erik punya skill Slime Destroyer. Kalo dihit ke Slime maka damage Erik ATK * 100, selain itu hanya 50.
maka situasi di atas dapat ditulis di kolom formula menjadi
- Code:
-
b.id == 1 ? a.atk * 100 : 50
Dari contoh di atas, ternyata monster ID 2 dan 3 juga merupakan marga Slime:
- Code:
-
(b.id==1 || b.id == 2 || b.id == 3) ? a.atk * 100 : 50
*note: tanda || sama artinya dengan "or"
Skill Gravity memiliki damage 1/2 current HP
- Code:
-
b.hp/2
Erik punya skill di mana dia meminjam kekuatan serang Terrance * 5
- Code:
-
$game_actors[3].atk * 5
Damage serangan = a.atk * 8 jika kondisi switch 1 on. Kalo switch 1 off damage a.atk * 20
- Code:
-
$game_switches[1] ? a.atk * 8 : a.atk * 20
*Note: dapat dilihat di sini bahwa switch itu sebuah boolean. Kalo on berarti true, kalo off berarti false.
Damage serangan = Variable nomer 1 * a.atk
- Code:
-
$game_variables[1] * a.atk
Diingetin sama Rian01
- Code:
-
v[1] * a.atk
Ada gambler yang melempar 2 dadu. Kalo 2 dadu nilainya 6 maka damagenya 10.000 Kalo angkanya sama damagenya 1000, kalo ga ada yang sama, nilainya jumlah angka di kedua dadu tersebut * 10
- Code:
-
c=rand(6);d=rand(6);if c==6&&d==6;10000;elsif c==d;1000;else;(c+d)*10;end
*di sini saya tidak memberikan spasi biar lebih irit tempat
*variable a dan b sudah di "book" sama system, jadi untuk membuat local variable lain, gunakan huruf alfabet yang lain.
Ada skill yang menyebabkan musuh dan caster keracunan (misal poison itu state ID 4)
- Code:
-
a.add_state(4);b.add_state(4);a.atk*4-b.def*2
Damage weapon bertambah saat mengenakan weapon tertentu
- Code:
-
a.weapons.include?($data_weapon[1]) ? a.atk * 1000 : a.atk * 100
Apabila skill ini digunakan oleh Eric dan Natalie ada di party, damage 1000. Kalo yang menggunakan orang lain cuma 100
- Code:
-
a==$game_actors[1]&&$game_party.members.include?($game_actors[2]) ? 1000 : 100
yang di atas emang agak advanceNambah
Dengan asumsi belum tau penggunaan max sama min di array, model begini bisa jadi pilihan
Limit damage minimal 1
- Code:
-
[a.atk * 4 - b.def * 2, 1].max
Limit damage max 200
- Code:
-
[a.atk * 4 - b.def * 2, 200].min
== *** ==
PART II
Berhubung saat ini sedang hujan lebat sehingga saya ada alasan untuk telat ngantor, maka saya memutuskan untuk melanjutkan curhat tentang custom formula ini.
Sebelum memulai inti curhat, ada baiknya bagi yang belum tahu tentang struktur RGSS3, untuk melihat gambar yang berikut ini:
Gambar di atas adalah silsilah keluarga dari actor dan enemy (ternyata kedua musuh bebuyutan itu eyangnya sama ya?
)
Jadi, apakah fungsi dari mengetahui hierarchy? Saya coba langsung menjelaskan lewat contoh:
class Game_Battler adalah "parent" class (ada juga yang menyebut superclass) dari Game_Battler. Artinya, semua method2 (kalo di script tulisannya def xxx) di Game_BattlerBase dimiliki juga oleh child classnya yaitu Game_Battler. Nah berhubung Game_Actor dan Game_Enemy memiliki parent Game_Battler, berarti baik Game_Actor maupun Game_Enemy memiliki semua method2 dari Game_BattlerBase dan Game_Battler.
OK, langsung contoh. Coba lihat di formula bar:
- Code:
-
a.atk * 4 - b.def *2
*di sini a dan b adalah "caster" dan "target" dari suatu skill yang memiliki class "Game_Actor" ataupun "Game_Enemy"
Coba sekarang silakan anda cari di Game_Actor maupun Game_Enemy line yang berbunyi
def atk. Tidak ada bukan? Sekarang coba cari
def atk di Game_BattlerBase. nanti akan ketemu line yang berbunyi.
- Code:
-
def atk; param(2); end
- Quote :
- Lah, methodnya ada di Game_BattlerBase kok bisa dipanggil dari Game_Actor/Game_Enemy?
Ingat! Children class mewarisi semua method dari Parentnya. Berhubung Game_BattlerBase adalah "kakek"
dari Actor dan Enemy, makanya method
atk yang di declare di Game_BattlerBase bisa dipanggil dari Actor maupun Enemy.
- Quote :
- OK, ane dah paham. Trus gunanya buat apa?
Sabar bung, coba sekarang tulis ini di bawah Material dan di atas main
- Code:
-
class Game_Battler < Game_BattlerBase
def my_skill(a,b)
return 20 if a.is_a?(Game_Actor)
return 10 if a.is_a?(Game_Enemy)
end
end
Lalu coba buat skill dengan nama "My Skill" yang formulanya berisi
- Code:
-
a.my_skill(a,b)
Karena method tersebut dibuat di Game_Battler, maka Skill tersebut bisa dipanggil oleh Actor maupun Enemy.
Sekarang coba di test di game. Buat enemy yang action listnya hanya menggunakan My Skill, masukkan formula
- Code:
-
a.my_skill(a,b)
Dan lakukan batle test (jangan lupa di save dulu
)
Nanti akan terlihat ketika Actor menggunakan "My Skill", dia akan menimbulkan damage 20.
Sedangkan saat Enemy menggunakannya, hanya akan menimbulkan damage 10.
Apabila tadi anda buat method my_skill di Game_Actor, maka saat Enemy menggunakan skill tersebut akan muncul "No-Method Error" karena memang tidak ada method my_skill di Game_Enemy.
Mari kita coba melihat skil lempar 2 dadu di part 1 dan mengubahnya sedikit.
- Seorang gambler melempar 2 dadu.
- Jika kembar 6, maka damage = 100 * a.atk - b.def
- Jika kembar selain 6, maka damage = 20 * a.atk -b.def
- Kalo ga ada yang kembar, maka damage = (jumlah dadu) * atk - def
- Code:
-
class Game_Battler < Game_BattlerBase
def lempar_dadu(a,b)
c = rand(6)
d = rand(6)
if c == 6 && d == 6
return 100 * a.atk - b.def
elsif c == d
return 20 * a.atk - b.def
else
return (c+d) * a.atk
end
end
Dengan begini jauh lebih mudah dibaca daripada formula satu line di Skill Editor standard.
- Quote :
- Udah? cuma bikin simpel doang nih maksudnya?
Dengerin dulu kenapa sih
Ehm, salah satu dari kegunaan yang paling "handy" dari membuat method di Game_Battler/Game_BattlerBase adalah membuat sebuah template di mana ketika kita akan balancing, kita hanya perlu sedikit mengedit di bagian script dan semua skill yang berhubungan dengan method tersebut akan ikut berubah damagenya.
contoh
- Saya punya 4 skill, Sword Heavy Attack, Spear Heavy Attack, Axe Heavy attack, dan Magic Bolt.
- Sword HA, Spear HA, dan Axe HA skill itu punya formula a.atk * 8 - b.def * 2
- Sedangkan Magic Bolt punya formula a.mat * 6 - b.mdf * 2
- Setelah beberapa kali test play, anda berpikir bahwa formulanya perlu diubah jadi a.atk * 30 - b.def * 2 dan a.mat * 20 - b.mdf * 2
- Itu berarti anda harus mengubah 4 (EMPAT) skill formula secara manual.
- Iya kalo cuma 4, kalo ada 500 skill dengan formula yang sama? (kalo ane mah mending bikin project baru
)
sekarang coba tulis ini di script
- Code:
-
class Game_Battler < Game_BattlerBase
def my_skill_tier1(a,b,magical=false)
return a.mat * 6 - b.mdf * 2 if magical
return a.atk * 8 - b.def * 2
end
end
Terus masukkan formula
- Code:
-
a.my_skill_tier1(a,b)
buat Sword Strong Attack, Spear Heavy Attack, Axe Heavy Attack, dan Magic Bolt
Dengan begitu, saat anda ingin melakukan perubahan formula, yang perlu anda lakukan hanyalah mengubah isi method my_skill_tier1 dan VIOLA! secara ajaib ketiga damage Skill tersebut berubah dengan sendirinya
== *** ==
PENUTUP
buset panjang bener ternyata- Puji syukur saya panjatkan kehadirat Tuhan YME atas segala limpahan rahmat dan hidayah-Nya sehingga saya mempunyai niat untuk menulis tutorial yang panjang ini.
- Mama dan Papa yang telah melahirkan dan membesarkan anak ganteng seperti saya.
- Ibu kos dan bapak kos yang telah memberikan naungan bagi anak rantau seperti saya.
- Seluruh RMID members (terutama member-member yang kembali memunculkan niat saya bikin eroge
)
Basic saya bukanlah seorang programmer, jadi apabila ada kesalahan tulis atau istilah dalam programming, sudilah kiranya saudara maafkan dan doakan saya semoga kesalahan2 saya diampuni
Kiranya cukup sekian tutorial dari saya. Insya Alloh dilanjut (kalo niat)
Semoga membantu
SPECIAL CREDIT
Fomar0153 for his amazing tutorial
DAFTAR PUSTAKA
http://cobbtocs.co.uk/wp/?p=286
http://cobbtocs.co.uk/wp/?p=271
*PS: Di situs om fomar sendiri sebenarnya ada tutorial tentang hierarchy windows. Namun saya belum berani menerjemahkan karena saya sendiri masih mempelajari class Window & Scene. Bagi scripter yang lain, mungkin ada baiknya menerjemahkan tutorial tentang Windows Hierarchy tersebut ke bahasa Indonesia di forum ini.