Bagaimana cara mengembangkan Formula Kerusakan RPG?

117

Saya sedang mengembangkan RPG 2d klasik (dalam nada yang mirip dengan fantasi akhir) dan saya bertanya-tanya apakah ada yang punya saran tentang cara melakukan kerusakan rumus / tautan ke sumber daya / contoh? Saya akan menjelaskan pengaturan saya saat ini. Mudah-mudahan saya tidak berlebihan dengan pertanyaan ini, dan saya minta maaf jika pertanyaan saya terlalu besar / luas

Statistik Karakter Saya terdiri dari yang berikut ini:

enum Stat
{
    HP = 0,
    MP = 1,
    SP = 2,
    Strength = 3,
    Vitality = 4,
    Magic = 5,
    Spirit = 6,
    Skill = 7,
    Speed = 8, //Speed/Agility are the same thing
    Agility = 8,
    Evasion = 9,
    MgEvasion = 10,
    Accuracy = 11,
    Luck = 12,
};

Vitalitas pada dasarnya adalah pertahanan terhadap serangan fisik dan roh adalah pertahanan terhadap serangan sihir.

Semua statistik memiliki maksimum tetap (9999 untuk HP, 999 untuk MP / SP dan 255 untuk sisanya). Dengan kemampuan, maksimum dapat ditingkatkan (99999 untuk HP, 9999 untuk HP / SP, 999 untuk sisanya) dengan nilai-nilai tipikal (pada level 100) sebelum / sesudah kemampuan + peralatan + dll akan menjadi 8000 / 20.000 untuk HP, 800 / 2000 untuk SP / MP, 180/350 untuk statistik lainnya

Game Terlambat Musuh HP biasanya akan berada dalam jutaan yang lebih rendah (dengan bos super memiliki maksimum ~ 12 juta).

Saya bertanya-tanya bagaimana orang benar-benar mengembangkan formula kerusakan yang tepat dengan skala yang benar? Misalnya, berdasarkan data ini, menggunakan rumus kerusakan untuk Final Fantasy X sebagai basis tampak sangat menjanjikan. Referensi lengkap di sini http://www.gamefaqs.com/ps2/197344-final-fantasy-x/faqs/31381 tetapi sebagai contoh cepat: Str = 127, perintah 'Attack' digunakan, musuh Def = 34.

1. Physical Damage Calculation:
Step 1 ------------------------------------- [{(Stat^3 ÷ 32) + 32} x DmCon ÷16]
Step 2 ---------------------------------------- [{(127^3 ÷ 32) + 32} x 16 ÷ 16]
Step 3 -------------------------------------- [{(2048383 ÷ 32) + 32} x 16 ÷ 16]
Step 4 --------------------------------------------------- [{(64011) + 32} x 1]
Step 5 -------------------------------------------------------- [{(64043 x 1)}]
Step 6 ---------------------------------------------------- Base Damage = 64043
Step 7 ----------------------------------------- [{(Def - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------ [{(34 - 280.4)^2} ÷ 110] + 16
Step 9 ------------------------------------------------- [(-246)^2) ÷ 110] + 16
Step 10 ---------------------------------------------------- [60516 ÷ 110] + 16
Step 11 ------------------------------------------------------------ [550] + 16
Step 12 ---------------------------------------------------------- DefNum = 566
Step 13 ---------------------------------------------- [BaseDmg * DefNum ÷ 730]
Step 14 --------------------------------------------------- [64043 * 566 ÷ 730]
Step 15 ------------------------------------------------------ [36248338 ÷ 730]
Step 16 ------------------------------------------------- Base Damage 2 = 49655
Step 17 ------------ Base Damage 2 * {730 - (Def * 51 - Def^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ---------------------- 49655 * {730 - (34 * 51 - 34^2 ÷ 11) ÷ 10} ÷ 730
Step 19 ------------------------- 49655 * {730 - (1734 - 1156 ÷ 11) ÷ 10} ÷ 730
Step 20 ------------------------------- 49655 * {730 - (1734 - 105) ÷ 10} ÷ 730
Step 21 ------------------------------------- 49655 * {730 - (1629) ÷ 10} ÷ 730
Step 22 --------------------------------------------- 49655 * {730 - 162} ÷ 730
Step 23 ----------------------------------------------------- 49655 * 568 ÷ 730
Step 24 -------------------------------------------------- Final Damage = 38635

Saya hanya memodifikasi pembagi untuk memasukkan peringkat serangan senjata dan peringkat baju besi baju besi.

Kerusakan Sihir dihitung sebagai berikut: Mag = 255, Ultima digunakan, musuh MDef = 1

Step 1 ----------------------------------- [DmCon * ([Stat^2 ÷ 6] + DmCon) ÷ 4]
Step 2 ------------------------------------------ [70 * ([255^2 ÷ 6] + 70) ÷ 4]
Step 3 ------------------------------------------ [70 * ([65025 ÷ 6] + 70) ÷ 4]
Step 4 ------------------------------------------------ [70 * (10837 + 70) ÷ 4]
Step 5 ----------------------------------------------------- [70 * (10907) ÷ 4]
Step 6 ------------------------------------ Base Damage = 190872 [cut to 99999]
Step 7 ---------------------------------------- [{(MDef - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------- [{(1 - 280.4)^2} ÷ 110] + 16
Step 9 ---------------------------------------------- [{(-279.4)^2} ÷ 110] + 16
Step 10 -------------------------------------------------- [(78064) ÷ 110] + 16
Step 11 ------------------------------------------------------------ [709] + 16
Step 12 --------------------------------------------------------- MDefNum = 725
Step 13 --------------------------------------------- [BaseDmg * MDefNum ÷ 730]
Step 14 --------------------------------------------------- [99999 * 725 ÷ 730]
Step 15 ------------------------------------------------- Base Damage 2 = 99314
Step 16 ---------- Base Damage 2 * {730 - (MDef * 51 - MDef^2 ÷ 11) ÷ 10} ÷ 730
Step 17 ------------------------ 99314 * {730 - (1 * 51 - 1^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ------------------------------ 99314 * {730 - (51 - 1 ÷ 11) ÷ 10} ÷ 730
Step 19 --------------------------------------- 99314 * {730 - (49) ÷ 10} ÷ 730
Step 20 ----------------------------------------------------- 99314 * 725 ÷ 730
Step 21 -------------------------------------------------- Final Damage = 98633

Masalahnya adalah bahwa formula benar-benar berantakan begitu statistik mulai berjalan di atas 255. Khususnya nilai Pertahanan lebih dari 300 atau lebih mulai menghasilkan perilaku yang sangat aneh. Statistik Kekuatan Tinggi + Pertahanan menyebabkan nilai negatif besar-besaran misalnya. Meskipun saya mungkin dapat memodifikasi rumus agar berfungsi dengan benar untuk kasus penggunaan saya, mungkin akan lebih mudah hanya menggunakan rumus yang sama sekali baru. Bagaimana orang mengembangkan formula kerusakan? Saya sedang mempertimbangkan membuka excel dan mencoba membangun formula seperti itu (memetakan Statistik Serangan vs Statistik Pertahanan misalnya) tetapi saya bertanya-tanya apakah ada cara yang lebih mudah? Meskipun saya tidak dapat menyampaikan mekanisme permainan lengkap dari permainan saya di sini, mungkinkah seseorang dapat menyarankan tempat awal yang baik untuk membangun formula kerusakan?

Terima kasih

pengguna127817
sumber
1
Saya pikir Anda telah melakukan hal yang benar pada pengaturan pertama seperti apa statistik, HP dll yang Anda inginkan. Ini adalah bagian dari pengalaman pemain dan matematika harus sesuai 'sekitar' nilai-nilai ini. Dengan begitu banyak statistik, pemain harus secara intuitif tahu statistik apa yang akan memengaruhi sihirnya, serangan fisik, dll. Jadi pertanyaan besar pertama adalah statistik apa yang berhubungan dengan serangan, dan statistik apa yang bertahan melawan statistik ini (Misalnya, PhDef hanya bertahan melawan PhAtk).
Jonathan Connell
Yang paling penting adalah keseimbangan, mungkin ide yang bagus untuk membuat program interaktif (katakanlah dalam C # atau sesuatu yang cepat) di mana Anda dapat mengubah statistik dan melihat hasil seperti apa yang Anda dapatkan. Jika Anda dapat mengubah formula saat dijalankan, itu juga akan membantu :)
Jonathan Connell
4
Pertimbangkan menggunakan Excel untuk melakukan ini. Tampaknya cocok untuk tugas itu dan Anda tidak perlu menulis sebaris kode.
Alex Schearer
2
Pertanyaan yang paling penting adalah: Formula mana yang memberikan pemain paling menyenangkan ? (mencari "kesenangan" di halaman dan tidak ada jawaban yang menyebutkannya: P) Jika statistik atau kerusakan naik terlalu cepat pemain menjadi tidak peka, jika naik perlahan-lahan mereka bosan. Pemain perlu merasa senang ketika mereka naik level, jadi mereka perlu merasa seperti mereka bekerja di dalamnya dan juga bahwa itu akan memiliki beberapa efek nyata pada kinerja permainan mereka. (Itu 2 pence saya)
Annan
3
"(Def - 280.4) ^ 2" huh? Yah, saya akan mengharapkan hal-hal menjadi aneh bukan untuk Def> 255 atau Def> 300 tetapi cukup tepat untuk Def> 280,4;) Setelah itu, def yang lebih tinggi secara efektif akan berarti def yang lebih rendah pada titik formula ini sambil terus berperilaku sebagai diharapkan di titik lain. BTW, Anda bisa merencanakan hal ini dengan Wolfram Alpha atau lebih. Perbaiki cukup variabel agar hanya dua dan Anda akan mendapatkan plot permukaan yang bagus.
Christian

Jawaban:

140

Membuat rumus seperti ini membutuhkan pengetahuan fungsi matematika dasar - hal-hal yang Anda pelajari di kelas Aljabar dan Pra-kalkulus.

Setelah Anda menguasai, tanyakan pada diri sendiri (ganti "nilai" dengan "kerusakan," atau "kesehatan," atau "kecepatan" atau apa pun) :

  • Apakah Anda ingin nilai tumbuh pada tingkat yang konstan? Gunakan fungsi linear .
  • Apakah Anda ingin nilai tumbuh lambat pada awalnya, tetapi cepat nanti? Gunakan fungsi polinomial atau eksponensial .
  • Apakah Anda ingin nilai tumbuh cepat pada awalnya, dan melambat kemudian? Gunakan fungsi n-root atau logaritmik .
  • Apakah Anda ingin nilai tumbuh perlahan di awal / akhir tetapi cepat di tengah? Atau Anda ingin tumbuh cepat tetapi masih memiliki batas atas? Gunakan kurva sigmoid , seperti atan atau fungsi logistik .
  • Apakah Anda ingin nilai berosilasi? Gunakan dosa atau beberapa lainnya gelombang.

Kemudian hanya men-tweak-nya (tambahkan / gandakan item, ubah nilai dasar, dll) sampai terasa benar. Kalkulator grafik akan membantu Anda memvisualisasikan bagaimana perubahan pada parameter akan memengaruhi fungsi.


Omong-omong, masalah yang Anda alami adalah karena bilangan bulat bilangan bulat .

Gunakan tipe variabel yang cukup besar untuk menampung angka yang sedang Anda kerjakan. Ukuran berbeda menurut platform dalam C ++, tetapi menggunakan kompiler Visual Studio unsigned int32-bit, adalah 32-bit, sedangkan unsigned __int64 (spesifik MS) adalah 64-bit. Juga pertimbangkan untuk menggunakan a double.

Selain itu, coba atur ulang operasi Anda sehingga Anda tidak menemukan angka besar di tempat pertama (misalnya, daripada MDef * MDef / 110, lakukan (int)((float)MDef / 110 * MDef)) .

BlueRaja - Danny Pflughoeft
sumber
3
Jika Anda mengalami integer overflow, konversi menjadi float - yang hanya dapat diandalkan mendukung 24 bit bagian integer - akan memiliki serangkaian masalah akurasi yang berbeda.
@ Jo: Saya telah memutar kembali hasil edit Anda; Saya secara khusus memilih __int64lebih uint64_tkarena stdint.htidak tersedia di Visual Studio 2008 dan di bawah, dan saya tidak ingin membingungkan anak miskin lebih dari yang dia sudah ada.
BlueRaja - Danny Pflughoeft
1
@ BlueRaja: Saya tidak melihat bukti penanya menggunakan Visual Studio, dan itu ada di setiap toolchain standar lainnya (termasuk Visual Studio 2010).
Anda meninggalkan satu varian penting juga, saya pikir: Jika Anda ingin kerusakan memiliki batas atas yang dapat Anda dekati, tetapi tidak pernah cukup mencapai, Anda dapat menggunakan fungsi sigmoid.
Martin Sojka
1
user127817: Yang paling penting adalah bagaimana fungsinya tumbuh. Selebihnya, uji saja sampai terasa seimbang. Jika Anda merasa karakternya terlalu kuat, turunkan kerusakannya. Jika Anda merasa perlu waktu terlalu lama untuk membunuh bos atau musuh tertentu, turunkan kesehatan atau pelindung musuh itu. Dan seterusnya.
BlueRaja - Danny Pflughoeft
31

Statistik Karakter Saya terdiri dari yang berikut ini:

Ada masalah nyata Anda: Anda mendefinisikan statistik Anda sebelum menentukan apa yang orang-orang statistik sebenarnya berarti . Anda meletakkan kereta di depan kuda.

Lihatlah bagaimana D & D (meja) bekerja. "Kekuatan" tidak berarti apa-apa dengan sendirinya; itu hanya berarti sesuatu karena ada aturan yang mengatakan, "Tambahkan bonus kekuatan Anda untuk serangan jarak dekat Anda." Aturan itu adalah bagian dari aturan pertempuran D&D. Tanpa aturan tempur, "Kekuatan" umumnya merupakan jumlah yang tidak berarti.

Pertanyaan pertama yang perlu Anda tanyakan pada diri sendiri adalah ini: berapa banyak perbedaan yang saya inginkan antara karakter? Sekali lagi, lihat D & D. Di sana, mereka memiliki 6 statistik dasar. Statistik ini menentukan berbagai dimensi permainan untuk karakter. Karakter dengan Keluwesan tinggi akan memiliki opsi berbeda dari karakter dengan Keluwesan rendah.

Tapi alasan untuk perbedaan itu semua kembali ke aturan. Kecekatan tinggi berarti bonus untuk serangan jarak jauh; Anda dapat memukul lebih sering dengan serangan jarak jauh. Jadi hanya antara Strength dan Dexterity, Anda memiliki dua dimensi permainan: berkisar vs jarak dekat.

Kecerdasan dan Kebijaksanaan juga membentuk sesuatu yang berpasangan, tetapi ini lebih banyak berinteraksi dengan kelas-kelas tertentu. Int membuat Penyihir dan perapal mantra misterius lainnya menjadi lebih baik (atau mungkin berdasarkan beberapa aturan), Kebijaksanaan sangat penting bagi Ulama dan perapal mantra Tuhan lainnya. Karena mantra ilahi dan misterius memiliki daftar mantra yang berbeda, kedua statistik ini terlibat dalam dimensi permainan yang berbeda.

Anda perlu menentukan aturan dasar seputar statistik sebelum Anda dapat menentukan fungsi perkembangan pertumbuhan dan sejenisnya. Anda tidak perlu spesifik; Anda tidak perlu mengatakan bahwa "setiap titik kekuatan ditambahkan ke dalam gulungan acak untuk menentukan apakah serangan jarak dekat hits." Yang Anda butuhkan adalah aturan meta seperti "ketangkasan membuat penyerang jarak jauh lebih baik." Anda bisa mengetahui dengan tepat bagaimana hal itu membuat mereka lebih baik nantinya.

Ada berbagai cara untuk mengembangkan karakter. Trik Final Fantasy jadul yang umum adalah dengan menggunakan level karakter sebagai bagian dari perhitungan kerusakan mereka. Ini bisa saja mengalikan level dengan stat yang sesuai, atau itu bisa berarti menerapkan fungsi ke level karakter. Katakanlah, perkembangan kuadratik, sehingga laju kerusakan karakter akan meningkat per level.

Bagaimanapun Anda ingin fungsi tempur Anda bekerja, mereka harus memperhitungkan perkembangan akun. Fungsi Anda memerlukan kait untuk kemajuan.

D & D memiliki cara perkembangan yang lucu. Itu adalah bagian berbasis kelas; setiap kali Anda naik level, Anda mendapatkan fitur kelas baru dan bonus flat untuk hit Anda, berdasarkan kelas karakter Anda. Namun, beberapa fitur kelas menjadi lebih baik sendiri. Mantra di D & D akan memiliki perkembangan ke dalamnya. Mantra mungkin membuat kerusakan 1d4 per 2 level pemeriksa ejaan di atas yang pertama. Jadi setiap level penyihir lainnya membuat mantra itu lebih baik.

D&D juga menggunakan progresi berbasis item dengan sangat. Hingga edisi ke-4, pengembangan berbasis item terutama untuk karakter bertarung, tetapi bahkan dalam edisi yang lebih lama, perapal mantra memiliki item yang memberi mereka buff stat atau penyesuaian lainnya (atau flat out memberi mereka mantra).

Jadi item adalah hal lain yang perlu diperhitungkan fungsi tempur Anda. Apakah item hanya buff satu atau lebih statistik saat dilengkapi, atau apakah mereka melakukan hal-hal lain juga? D & D agak aneh, karena statistik jarang berubah; Senjata hanya merusak XdY, mungkin dengan bonus berdasarkan pada salah satu statistik Anda. Dan itu tadi. Jadi satu-satunya cara Anda untuk melakukan lebih banyak kerusakan dalam pertempuran adalah menemukan senjata yang lebih baik. Di banyak RPG videogame, mereka memperhitungkan level selain senjata.

Nicol Bolas
sumber
6
" Ada masalah sebenarnya: kamu mendefinisikan statistik sebelum mendefinisikan apa arti statistik itu sebenarnya. Kamu meletakkan kereta di depan kuda. " Saya sangat tidak setuju; angka-angka itu sendiri hanyalah cara untuk memberi tahu pemain tentang kekuatannya, dll. itu adalah bagian dari desain game. Jika Anda melanjutkan sebaliknya, Anda bisa berakhir dengan bos akhir dengan 147hp ... siapa yang benar-benar menginginkannya?
Jonathan Connell
8
Nah, Sarevok (di Gerbang Baldurs) hanya memiliki 135 HP ...
Martin Sojka
12
@ 3nixios: Apa bedanya jika bos akhirnya memiliki 147Hp? Yang penting adalah apakah bos terakhir itu menantang, menarik, dan di atas semua itu bermanfaat untuk dikalahkan. Bos dengan banyak Hp tidak menarik; itu buang-buang waktu. Seorang bos yang dapat mengacaukan pesta Anda, yang memerlukan taktik khusus yang berubah dari waktu ke waktu, yang mengharuskan Anda harus menggunakan setiap kemampuan yang Anda miliki untuk potensi maksimalnya, itulah yang membuat bos akhir yang hebat. Saya akan mengambil bos 147Hp menarik atas blok membosankan Hp setiap hari.
Nicol Bolas
@Nicol Bolas Saya sangat setuju dengan Anda, saya mencoba mendukung mengapa saya percaya bahwa titik awalnya harus dari statistik. Statistik pemain dimulai dengan indikasi utama dan gameplay yang dimainkan pemain selama pertandingan. Saya setuju bahwa bar HP besar untuk bos tidak diperlukan, itu memberi pemain indikasi yang lebih baik tentang apa pengaturan terbaik melawan bos, statistik senjata, dll. Yang lebih efektif. Jumlah tentu saja tidak relevan dengan cara Anda menghitungnya, karena Anda hanya dapat membagi atau mengalikan perhitungan akhir Anda dengan konstanta c dan dilakukan dengan itu.
Jonathan Connell
2
@ 3nixios: Tapi itu bagian dari poin saya. Keterampilan dalam D & D ada untuk memungkinkan diferensiasi antara karakter spesialis jarak dekat dan spesialis jarak jauh. Jika tidak ada konsep serangan jarak dekat dan jarak jauh (dan dalam banyak game FF misalnya, tidak ada), maka perbedaan ini tidak perlu ada. Anda bisa mendapatkan 5 statistik alih-alih 6. Menentukan rentang Hp adalah satu hal, tetapi menentukan statistik dasar yang Anda miliki adalah hal lain. Statistik memerlukan aturan sebelum Anda bisa memahaminya, dan Anda harus tahu apa yang ingin Anda lakukan stat sebelum Anda dapat mengatakan bahwa memiliki stat itu adalah ide yang baik.
Nicol Bolas
22

Rumus Anda sepertinya cukup rumit. Saya tidak yakin bagaimana pengembang RPG profesional menangani ini, tetapi saya akan merekomendasikan untuk berfokus pada kesederhanaan. Cobalah untuk menemukan formula sesederhana mungkin yang masih dapat Anda gunakan dengan kisaran statistik yang ingin Anda gunakan. Misalnya, dapatkah Anda membuat statistik saling memodifikasi sebelum perhitungan kerusakan, daripada memodifikasi kerusakan selama perhitungan? Setelah Anda memiliki formula dalam pikiran, saya akan mencoba membuat grafik untuk berbagai nilai yang mungkin untuk melihat bagaimana itu akan berperilaku sebagai pemain naik level. Jelas semakin sedikit variabel yang Anda miliki, mereka akan lebih layak.

Selain itu, BlueRaja memberikan penjelasan penting tentang mengapa Anda mungkin melihat nilai tak terduga di tingkat stat yang lebih tinggi. Menggunakan tipe yang tidak ditandatangani dan memeriksa luapan akan menjadi penting.

Mitch Lindgren
sumber
10
+1 untuk sederhana. Siapa pun dapat membuat hal-hal yang sangat rumit, itu tidak membuat permainan yang baik.
aaaaaaaaaaaa
8
@ Randolf kecuali Anda menjalankan Apple 2 atau sesuatu, sangat diragukan bahwa menghapus multiply atau membagi di sana-sini akan mempengaruhi kinerja dengan cara yang terukur.
Tetrad
8
@ Randolf Pertempuran besar dalam RPG mungkin berarti sekitar 10 perhitungan kerusakan per detik, CPU modern dapat melakukan beberapa miliar operasi per detik. Anda dapat dengan aman berasumsi bahwa dampak kinerja dari matematika "terlihat" seperti itu dapat diabaikan. Sederhana dalam hal ini adalah demi mereka yang mendesain dan mereka yang memainkan permainan, bukan untuk komputer kita.
aaaaaaaaaaaa
6
@ Randolf Richardson: Saya hanya berpikir Anda mungkin sedikit kehilangan target dalam kasus ini. Untuk MMO, protokol cepat tanpa lemak yang baik adalah yang terpenting, dan tugas berat seperti fisika harus dirancang dengan kinerja dalam pikiran. Tetapi perhitungan kerusakan adalah gameplay inti, itu harus dirancang dengan mempertimbangkan gameplay, jika Anda membawa masalah kinerja ke pertanyaan seperti itu Anda berisiko kompromi bagian gameplay. Bicara tentang kinerja ketika itu penting, Anda berisiko memberi kesan bahwa ini adalah area penting untuk dioptimalkan, sehingga mencuri perhatian dari orang berdosa kinerja nyata.
aaaaaaaaaaaa
5
@ Randolf: Saya tidak menyiratkan apa-apa; Saya mengatakan bahwa mengoptimalkan sesuatu yang bukan hambatan adalah buang-buang waktu.
Nicol Bolas
11

Game Terlambat Musuh HP biasanya akan berada dalam jutaan yang lebih rendah (dengan bos super memiliki maksimum ~ 12 juta).

Ini saya punya masalah dengan. Anda harus membangun bos di sekitar apa yang menurut Anda harus bisa ditangani oleh pemain Anda. Anda sedang membangun pemain dan formula pertarungan sesuai keinginan bos Anda.

Setelah Anda membangun mekanisme dan peran tempur Anda, maka Anda dapat memutuskan bagaimana Anda ingin merancang bos Anda karena itu harus merupakan keseimbangan yang baik antara kerusakan yang dapat ditangani / diserap pemain dibandingkan apa yang bisa ditangani / diserap bos.

Ken
sumber
4
Memberi +1 pada kesehatan musuh harus didasarkan pada apa yang dapat ditangani pemain dengan wajar pada titik itu, bukan sebaliknya.
BlueRaja - Danny Pflughoeft
7

Angka-angka yang Anda kutip kemungkinan berasal dari simulasi hanya tweaker, lebih dari ribuan berjalan.

Jadi, Anda harus menulis simulasi, membuat karakter level 20, dan melihat bagaimana ia bertarung melalui 200 pertempuran atau lebih melawan tipe musuh yang seharusnya ia lawan pada saat itu. Lakukan lagi untuk karakter level 30 (agaknya bagian dunia berikutnya).

Butuh beberapa saat untuk memperbaikinya, tetapi menulis simulasi otomatis pasti akan membuat ini lebih mudah daripada hanya menebak dan secara manual memainkannya.

bobobobo
sumber
5

Saya pikir Anda membuat kesalahan bahwa Anda ingin membuat formula tanpa memikirkan desain yang tepat.

Pertama-tama mulailah dengan desain, lalu mulailah berpikir untuk mewakili desain dalam formula. Semakin jelas desain Anda, semakin mudah menemukan formula yang sederhana dan / atau tepat.

Cobalah untuk mengimplementasikan "tipe" musuh, mis. "Lapis baja" => serangan pemain jika tipe fisiknya dikurangi 50%. Jangan membuat aliran pertempuran menjadi abstrak, pikirkan apa yang relevan dan apa yang tidak.

Jika desain Anda mengatakan "musuh lapis baja" lemah terhadap sihir tetapi kuat terhadap kerusakan fisik, sebutkan itu dalam kode. Tetapi ingat bahwa Anda telah melakukan banyak pengujian, karena nilainya tidak akan berfungsi secara ajaib saat pertama kali Anda menulis kode. Cobalah untuk membuat desain, masukkan logika ke dalam kode, selalu periksa apakah ini representasi teknis dari apa yang ada dalam pikiran Anda dan jika tidak mengubah nilainya sampai sekarang.

daemonfire300
sumber
Saya sudah mencakup hal semacam itu - peringkat baju besi mengurangi kerusakan serangan fisik kecuali jika serangan tersebut ditandai sebagai penindikan baju besi atau menggunakan formula kerusakan berbasis%
user127817
5

Meskipun desain saya belum meninggalkan fase Spreadsheet, saya sampai pada satu kesimpulan tentang merancang matematika untuk RPG:

Buat mereka sesederhana mungkin. Dalam desain yang sedang saya kerjakan, saya menggunakan rumus yang sangat sederhana, yang memadai untuk sistem semi-kurang kelas. Yaitu. Mantra Fireball memiliki kerusakan 30. Forumal adalah:

BaseSpellDamage * Attribute (5 * 6)

Kami juga dapat menambahkan pengubah seperti ini:

Result = (BaseSpellDamage * Attribute) (5*6)
Result = Result + (Result * 50%) (30 = 30 + (30 * 50%))

Jadi hasil akhirnya akan menjadi 45 kerusakan. Saya menemukan bahwa menggunakan pengganda prapentase sangat mudah, dan solusi yang sangat terukur untuk bekerja dengannya. Alih-alih datang dengan beberapa angka ganjil dengan matematika yang rumit untuk mencari tahu hasil yang kita inginkan.

Sekarang kita dapat menghitung reseistance kerusakan, yang hanya akan menghitung pertahanan terhadap jenis kerusakan yang ditetapkan. Ada dua pendekatan dan saya jujur ​​belum memutuskan mana yang lebih baik, tetapi keduanya sederhana dan layak:

DamageResult = Resistance * Damage ( 50% * 45)

Jadi hasil akhirnya akan diambil 22 kerusakan (saya hanya memotong hasil parsial).

Formula lain:

DamageResult = Damage - Resistnace (45 - 22).

Jadi hasil akhirnya akan menjadi 23. Jika itu terjadi bahwa perlawanan lebih besar dari kerusakan yang diambil maka karakter tidak menerima kerusakan. Tentu saja terserah Anda untuk memastikan bahwa situasi seperti itu tidak memiliki tempat, kecuali ketika Anda menginginkannya.

Meskipun saya harus mengakui bahwa penskalaan prosentase agak lebih mudah untuk diseimbangkan dan diukur. Tetapi ini juga tergantung pada angka dasar Anda. Penskalaan persentase akan bekerja paling baik jika Anda mulai dari 100 ke atas. Jika Anda beroperasi pada angka kecil (apa pun di bawah 100 jujur), itu bisa menjadi awkard karena Anda akan mulai mendapatkan hasil floating point, yang akan sulit untuk diseimbangkan dan benar-benar melakukan sesuatu yang menarik dengan mereka.

Mungkin solusi optimal dalam hal ini adalah menggunakan kedua pendekatan ketika mereka cocok. Atau jika Anda penggemar jumlah besar mulai dari 1000.

Dan pada saat penutupan berakhir. Saya belum sampai pada kesimpulan ini secara lengkap. Saya sebenarnya telah menghabiskan beberapa waktu membaca berbagai manual RPG (Hero, DnD). Terutama DnD sangat membantu, karena beroperasi pada prinsip yang sama tetapi alih-alih atribut itu menggunakan level untuk formula itu, mereka kadang-kadang bisa lebih kompleks. Dari apa yang saya sajikan di sini.

Dalam tas apa pun, saran terbaik adalah: cobalah untuk membuatnya sesederhana mungkin. Jangan menggunakan matematika tingkat lanjut, atau persamaan panjang, karena mereka rentan terhadap kesalahan, yang sulit dikenali, ketika Anda harus berurusan dengan 87234 hal lain pada saat yang sama.

Łukasz Baran
sumber
3

Seperti yang telah disebutkan orang lain, rumus Final Fantasy X cukup rumit. Umumnya untuk seri itu nanti gim, semakin rumit rumusnya. Mungkin lebih mudah untuk mendasarkan formula kerusakan Anda pada game lain sepenuhnya. Tapi secara umum, saya pikir ada baiknya membahas dari tingkat yang sangat umum seperti apa formula kerusakan yang dapat Anda temukan di dunia, dan bagaimana Anda bisa membuat game berbasiskannya. Hal pertama yang perlu Anda putuskan adalah berapa banyak kerusakan yang ingin Anda bisa lakukan di akhir pertandingan, dan statistik seperti apa yang Anda inginkan agar pemain dapat miliki? Setelah memilikinya, Anda dapat memilih sistem rumus, dan kemudian mengoptimalkan nilai rumus dan senjata untuk mencerminkan rentang tersebut dari waktu ke waktu.

Berbasis Stat Murni

Ini adalah ide yang bagus jika Anda ingin karakter Anda fleksibel dalam hal level musuh yang dapat mereka tantang. Formula seperti ini hanya akan bergantung pada statistik pemain, peralatan mereka, dan statistik musuh. Formula ini biasanya cukup sederhana. Final Fantasy Legend II (Lihat http://www.shenafu.com/ffl2/weapon.php misalnya, memiliki senjata yang melakukan kerusakan berdasarkan pada rumus sederhana:

(Stat+StatBonus)*WeaponStrength - Defense*4

Formula seperti ini bagus jika Anda menginginkan metode yang sangat sederhana dalam memperkirakan kerusakan, atau titik lompat cepat untuk memodifikasi kerusakan berdasarkan faktor-faktor lain seperti keterampilan dan kelemahan unsur.

Untuk menunjukkan seberapa luas formula seperti ini benar-benar dapat berjalan, pertimbangkan rumus kerusakan untuk Inflasi RPG, sebuah game Android dan iOS (Lihat http://inflation-rpg.wikia.com/wiki/Calculations ). Formula sangat bergantung pada stat dan peralatan. Setiap peralatan memiliki dua statistik - bonus untuk stat ATK, dan nilai pengganda. Beberapa peralatan memiliki pengganda rendah, tetapi bonus tinggi, yang lain memiliki bonus rendah tetapi pengganda tinggi. Untuk karakter dengan hanya 10 ATK, Battle Axe dengan 5000 ATK Bonusnya tetapi pengganda rendah 145% adalah pilihan yang bagus. Kerusakan total (10+5000)*1.45 = 7264, tapi Estoc, dengan 0 bonus dan pengganda 300% adalah pilihan yang buruk - kerusakan itu (10+0)*3 = 30. Kemudian dalam permainan, karakter dengan 5000 serangan akan lebih suka berganti senjata.

Berbasis Stat dan Level:

Contoh yang baik dari ini adalah Final Fantasy V, VI, dan Final Fantasy XII (Lihat http://www.gamefaqs.com/ps2/459841-final-fantasy-xii/faqs/45900 , misalnya). Formula untuk pedang di FFXII adalah:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+STR)/256]

dan formula kerusakan untuk stave adalah:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+MAG)/256]

Mereka sangat mirip, tetapi perhatikan bahwa formula pedang hanya tergantung pada kekuatan dan level, sedangkan formula staf tergantung pada kekuatan, sihir dan level. Keuntungan dari formula semacam ini adalah memungkinkan formulasi pemain dua jalan pertumbuhan - membangun statistik mereka, atau membangun level mereka. The downside adalah bahwa ia juga menghukum karakter kedua cara juga. Apa yang akhirnya dilakukan adalah memungkinkan pemain untuk naik level untuk meningkatkan output kerusakan mereka (untuk FFXII jumlah ini meningkatkan output kerusakan mereka ~ 4% per level di sekitar level 50 ketika Anda memasukkan keuntungan stat) untuk membantu menyesuaikan kesulitan dengan tingkat kenyamanan.

Kerusakan tetap:

Formula kerusakan tetap tidak tergantung pada statistik atau level karakter, mereka hanya bergantung pada rumus kerusakan internal senjata itu sendiri. Mereka masih dapat bervariasi pada rentang, tetapi mereka memberikan kerusakan yang sama terlepas dari pengguna (kecuali efek khusus atau karakter karakter). Mereka paling baik digunakan jika senjata akan melakukan kerusakan tetap dan kemampuan untuk melengkapi senjata tergantung pada statistik dan / atau level. Diablo 2, misalnya, melakukan ini, seperti halnya banyak roguelikes yang memiliki senjata yang bergantung pada gulungan mati. Yang sedang berkata, 'kerusakan tetap' tidak menyiratkan "non-acak" - dan pada kenyataannya biasanya ada beberapa elemen keacakan untuk kerusakan yang dilakukan.

Ini adalah metodologi yang baik jika Anda ingin memiliki senjata yang mudah ditransfer antar karakter atau dengan hati-hati mengontrol hasil kerusakan yang dapat dilakukan karakter pada titik-titik tertentu dalam permainan jika Anda tahu peralatan apa yang mereka miliki aksesnya (melalui drop table, chests , dan mencuri tabel).

Tempat lain yang akan Anda temui adalah dengan jenis peralatan atau item tertentu dalam Final Fantasy. 1000 Jarum, misalnya, selalu memberikan 1000 kerusakan. Dalam Final Fantasy Legend II, seni bela diri menangani kerusakan berdasarkan pada rumus:

Damage = WeaponStrength*(90-UsesLeft) - 4*Defense

Final Fantasy XII memiliki kerusakan yang agak tetap untuk senjata juga, memberikan kerusakan sesuai dengan rumus:

DMG = [ATK x RANDOM(1~1.125)]^2

Meskipun kerusakannya agak acak, itu hanya bervariasi 26,5 persen dari total jangkauan, jadi Anda dijamin akan melakukan tingkat kerusakan rata-rata dari waktu ke waktu. Jenis serangan ini berguna untuk karakter yang memiliki statistik rendah dan level rendah dalam permainan yang biasanya memperhitungkan faktor-faktor tersebut dalam menangani kerusakan. Plus, mereka mengabaikan pertahanan target (meskipun formula dapat dengan mudah dikerjakan ulang agar sesuai dengan pertahanan jika Anda inginkan).

Foo Barrigno
sumber
2

semua gim dalam seri fantasi terakhir memiliki batas stat 255 karena masalah yang Anda temui. pada level 100 statistik akan menjadi 255.

Anda mengatakan tentang peningkatan statistik dengan kemampuan dan peralatan dan saya ingat melihat ini di permainan tetapi cara ini dilakukan adalah dalam formula. ada langkah tambahan yang memeriksa kemampuan dan pengubah peralatan dan menerapkannya setelah statistik digunakan.

dalam kasus Anda itu akan menjadi langkah 21: terapkan pengubah kemampuan langkah 22: terapkan pengubah peralatan step23: kerusakan akhir.

jika Anda tertarik google untuk formula fantasi akhir, mereka di luar sana. Saya memiliki copys dari mekanisme pertarungan yang sebenarnya termasuk AI untuk fantasi final 4, 6, 7 dan 9. orang-orang memecahkannya dari game asli ketika mereka membuat ROM untuk emulator. Tidak ada yang sulit ditemukan jika Anda terlihat cukup keras.

hal terbesar untuk membuat rumus adalah pengujian. membuat skrip untuk menjalankan pertempuran dengan kecerdasan di kedua sisi dan menjalankan beberapa ratus pertempuran. variasikan monster dan statistik dan lihat apakah berhasil atau jika lv 40 membunuh semuanya, sangat mungkin bahwa bos sebenarnya tidak mungkin untuk membunuh lol. tipnya adalah mematikan semua animasi karena mengesankan seberapa cepat AI dapat bertarung ketika tidak ada yang menonton.

Skeith
sumber
2

Saya bertanya-tanya bagaimana orang benar-benar mengembangkan formula kerusakan yang tepat dengan skala yang benar?

2 hal pertama adalah:

  • putuskan apa yang Anda maksud dengan 'benar' - apa ide Anda tentang 'kerusakan yang benar'?
  • putuskan apa yang Anda maksud dengan 'skala' - nilai apa yang akan berubah, dan apa dampak yang Anda inginkan dari perubahan itu?

Setelah Anda tahu itu, Anda memiliki informasi yang cukup untuk menggunakan rumus matematika yang disebutkan BlueRaja dalam jawabannya . Ingat saja tidak ada yang namanya formula kerusakan 'tepat' - hanya satu yang cocok dengan desain Anda untuk jenis pengalaman yang Anda inginkan untuk pemain Anda miliki.

Kylotan
sumber
Ini adalah komentar yang sangat tidak membantu. Itu meringkas "Saya tidak tahu" dan karena itu adalah buang-buang waktu setiap orang. Menandai untuk dihapus.
Krythic
1

secara alternatif, jika Anda mencari formula yang sangat sederhana, Lakukan hal berikut:

(Perhatikan bahwa ini adalah ide saya untuk formula,)

Pertama, untuk formula serangan sederhana, Anda hanya perlu beberapa statistik. Stat Serangan pemain (ini bisa Kekuatan, atau Sihir, tergantung pada jenis gerakan.)

Kemudian, buat variabel, yang disebut MovePower. Ini akan tergantung pada gerakan, dan langkah yang lebih baik akan memiliki MovePower yang lebih baik. Untuk rumus saya, perintah "Serangan" umum memiliki MovePower 5.

Kemudian, buat pertahanan menjadi stat berbasis persen, (dan, tentu saja, buat itu tidak mungkin untuk mencapai pertahanan 100% pada kerusakan)

Kemudian, selama fase serangan, cukup gandakan stat serangan dengan kekuatan bergerak, dan singkirkan kerusakan berdasarkan pertahanan musuh! sederhana!

Anda juga dapat memilih untuk memiliki pengubah lain, seperti jika gerakan akan menekan (Akurasi), jika langkah tersebut memiliki efek tambahan lainnya (Bio, menimbulkan racun,) dan memilih untuk memukul, (Akurasi lagi,) mengalami kerusakan pemutakhiran / penurunan peringkat bergerak yang mengubah statistik, dll. Bersenang-senanglah dengan itu!

AzelfDestin
sumber
Opsi lain yang menghindari armor sebagai masalah persentil (sehingga memungkinkan nilainya terlihat sama) adalah untuk menghitung damage vs armor sebagai perbandingan yang menjadi pengganda. Sesuatu seperti Ln (atk / def) sebagai basis. Ini memungkinkan statistik armor defensif untuk skala seiring berjalannya waktu dengan cara yang sama. Cari tahu cara mendapatkan kisaran kerusakan dasar yang Anda inginkan ketika statistik damage dan armor sama dan memperkirakan dari sana. Ini memang membuat serangan "penghindaran baju besi" memerlukan trik untuk diciptakan, tetapi itulah bagian dari tujuan kreativitas.
Aviose
1

Intinya, Anda perlu memikirkan dua hal.

  1. Cara melakukan praformulasi komputasi dengan benar dalam jumlah besar.
  2. Bagaimana Anda ingin dan mengharapkan kerusakan serangan untuk berperilaku melawan lawan yang lebih lemah dan kuat.

1

Anda dapat pengguna doubleatau pustaka angka besar. Melakukan perhitungan dengan angka besar (seperti mengklik / gim idle sering mengandalkan pustaka angka besar). Dalam kasus Anda, angkanya relatif kecil sehingga menggunakan floating point 64-bit akan memungkinkan fleksibilitas yang dibutuhkan.

2

Bagaimana Anda ingin permainan berperilaku? beberapa contoh:

  • Salah satu pendekatan adalah menggunakan ATKuntuk memutuskan apakah Anda memukul atau tidak dan melempar mati dengan peringkat kerusakan yang diketahui tergantung pada senjatanya: misalnya pedang panjang 1d8, pedang dua tangan 1d10, belati 1d4. Ini tidak akan skala dengan sangat baik jika hp dapat tumbuh dan terus. Jika Anda menggunakan ATKuntuk menentukan apakah karakter mengenai atau gagal, Anda dapat melakukan lemparan lain setelah sukses dengan ATK* 80% untuk menentukan angka.
  • Jika Anda ingin menggunakan rumus kerusakan, rumus kerusakan bisa sesederhana seperti (ATK - DEF) +/- 20%yang dilakukan di World's End (permainan strategi RPG). Ini berarti bahwa serangan terhadap lawan yang kuat DEFtidak akan merusak sama sekali. Untuk instace ATK = 10, ENEMY DEF = 12, (ATK - DEF) = -2dan itu juga berarti bahwa serangan tinggi vs def sedikit lebih rendah, bisa melakukan kerusakan kecil, berpotensi membuat pertempuran lebih lama dengan meningkatnya HP. Misalnya dengan ATK = 1010,, ENEMY DEF = 1005kerusakan akan menjadi 5. Kerusakan juga akan meningkat secara dramatis sekarang jika ATKditingkatkan dengan persentase kecil. Misalnya ATK = 1055, akan melakukan 900% lebih banyak kerusakan dengan hanya peningkatan ATKnilai 5% .
  • Untuk menghindari hal ini, Anda dapat melakukan sesuatu seperti ATK / DEF * WEAPON_DAMAGEini akan meningkatkan skala secara bertahap ketika ATKatau DEFditingkatkan dan memungkinkan penyerang lemah untuk merusak makhluk dengan kuat DEF.

tl; dr Anda perlu memperlakukan nomor Anda secara bertanggung jawab dan mencari tahu bagaimana Anda ingin permainan berperilaku dalam situasi yang berbeda. Beberapa pertanyaan untuk diri sendiri:

  1. Berapa banyak serangan (bergantian), yang harus dilakukan untuk mengalahkan bos / antek itu?
  2. Bagaimana keterampilan, buff, dan debuff yang berbeda memengaruhi xpertempuran? Jika tidak ada harapan, apakah menang lebih y%kecil kemungkinannya?
serigala
sumber