Bagaimana cara merancang formula kerusakan dalam RPG yang membuat senjata dengan kecepatan serangan berbeda seimbang?

8

Saya membuat game rpg mobile, yang tak terbatas di mana ada sistem penjarahan seperti Diablo 3. Senjata memiliki serangan dan kecepatan, potongan baju besi memiliki nilai resistansi (bukan persentase).

Formula yang saya gunakan adalah:

float realDamage = SkillDmg * BaseDamage / ( BaseDamage + Defense )

Hasilnya bagus, kerusakan semakin besar jika pertahanan semakin rendah dan itu tidak naik secara eksponensial karena pembagian antara ( BaseDamage + Pertahanan).

Katakanlah saya memiliki pedang dengan kecepatan serangan 1.0 yang memberikan 50 damage. Itu 50 dps, dan saya memiliki belati yang saya ingin menyerang lebih cepat, tetapi tentu saja menangani lebih sedikit kerusakan, untuk mempertahankan dps logika mengatakan bahwa jika kecepatan serangan belati dua kali lipat, kerusakan perlu setengah (kecepatan 2.0 dengan 25 dmg). Tetapi menggunakan rumus di atas Anda akan melihat bahwa DPS kerusakan nyata sebenarnya lebih rendah dari pedang.

Aku memecahkan ini dengan membuat belati tidak membuat 25 kerusakan tetapi sedikit lebih banyak, melakukan beberapa perhitungan aku bisa membuat dps asli menjadi sama untuk menyeimbangkan hal-hal. Dalam hal ini belati pada kecepatan 2.0 perlu menangani 32 kerusakan agar menjadi kerusakan nyata yang sama dengan pedang.

Namun, saya ingin menampilkan nomor DPS pada senjata. Jika saya hanya menampilkan DPS belati sebagai 32 dmg * 2 attackspeed itu akan menjadi 64 dps, dibandingkan dengan pedang 50 dps, orang akan dengan jelas mengatakan bahwa belati itu lebih baik, tetapi tentu saja tidak.

Solusi yang memungkinkan? Ubah formula kerusakan awal? Kalau begitu yang mana? Mari kita asumsikan saya tidak mengubah formula, apakah ada solusi? Saya benar-benar tidak suka harus menipu belati untuk menghasilkan lebih banyak kerusakan daripada setengahnya untuk membuatnya lebih ...

Saya benar-benar berharap saya tahu rumus kerusakan untuk diablo 3. Saya tahu bahwa diablo 3 senjata DPS itu hanya kerusakan dasar * kecepatan serangan.

Edit:

Lets assume defense = 50 and normal attack (skillDmg = baseDmg)

Sword 1.0 attack speed dealing 50 dmg -> real damage hit=  50 * 50 / ( 50 + 50 ) = **25 dmg** = 25 dps

Dagger 2.0 attack speed dealing 32 dmg -> real damage hit = 32 * 32 / ( 32 + 50 ) = **12.5 dmg** = 25 dps

Sword item, lets display the actual sword dps, 50 * 1.0 = **50 dps**
Dagger item, lets display the dagger dps, 32 * 2.0 = **64 dps** (SHOULD BE THE SAME)
marcg11
sumber
1
Dalam hasil edit Anda, Anda memiliki formula yang saya posting di jawaban saya ( damage * damage / ( damage + defense)), hanya tanpa memperhitungkan kerusakan skill. Alasan perbedaan DPS adalah karena Anda menggunakan pertahanan yang sama. Alasan mengapa Anda mendapatkan hasil yang berbeda adalah karena dengan formula itu, senjata lambat tapi kuat lebih baik melawan musuh def tinggi sementara senjata cepat tapi lemah lebih baik terhadap musuh def rendah (yang tampaknya masuk akal). Anda mengasumsikan musuh def tinggi dan menyeimbangkan kedua senjata melawannya, yang berarti Anda membuat belati dikuasai. Perhitungan DPS menunjukkan kekuatan itu.
Philipp

Jawaban:

20

Masalah yang Anda miliki dengan menghitung DPS dari rumus itu adalah karena apa yang Anda panggil BaseDamagetampaknya bukan itu.

Dengan asumsi bahwa semua angka positif, BaseDamage / ( BaseDamage + Defense )akan selalu menyelesaikan ke angka floating point di suatu tempat antara 1 dan 0. Tidak masalah jika Anda memiliki 10 BaseDamage, 1.000 BaseDamageatau 1.000.000 BaseDamage, Anda akan selalu berada dalam kisaran itu. Di mana dalam kisaran itu tergantung pada bagaimana BaseDamagesenjata dibandingkan dengan Defensetarget. Itu berarti apa yang benar - benar memengaruhi urutan besarnya Kerusakan nyata dari sebuah serangan sebagian besar adalah SkillDmgpengganda.

Melihat sifat-sifat matematika ini, saya tidak akan benar-benar menyebut properti senjata ini BaseDamagemelainkan DefensePenetration, karena ini menggambarkan kemampuan senjata untuk mengatasi pertahanan musuh dan masih melakukan sebagian besar kerusakannya. Ini mungkin benar-benar menjadi mekanik yang menarik untuk dimiliki (atau tidak ... itu sesuatu yang perlu Anda uji coba), tetapi tidak banyak bicara tentang tingkat kekuatan senjata.

Jadi bagaimana kita mengatasi masalah ini?

Ya, tidak ada solusi yang tepat untuk masalah ini. Tetapi perubahan yang mungkin melakukan apa yang ingin Anda lakukan (senjata dua kali lebih kuat = sekitar dua kali lebih banyak kerusakan) adalah menambahkan BaseDamagesebagai faktor multiplikasi lainnya:

float realDamage = SkillDmg * BaseDamage * BaseDamage / (BaseDamage + Defense) 

Jika Anda menyukai mekanik penetrasi pertahanan yang tidak sengaja Anda temukan, beginilah tampilannya dengan Penetrationstat senjata yang terpisah:

float realDamage = SkillDmg * BaseDamage * Penetration / (Penetration + Defense) 

Hal yang menyenangkan tentang formula ini adalah ia berskala cukup baik:

  • Bahkan ketika pertahanannya menyedihkan dibandingkan dengan nilai serangan, tidak pernah ada lebih banyak kerusakan daripada serangan. Ini memberi Anda batas atas pada seberapa banyak kerusakan yang dapat ditimbulkan karakter, yang membuat penyeimbangan jauh lebih mudah.
  • Di sisi lain, tidak peduli seberapa tinggi pertahanan yang didapat, itu tidak akan pernah bisa sepenuhnya mengurangi kerusakan (kecuali melalui kesalahan pembulatan), jadi selalu ada ruang untuk perbaikan bagi bek dan tidak pernah ada serangan yang sama sekali tidak ada gunanya.
  • Ketika Pertahanan dan BaseDamage (dan Penetrasi saat Anda menginginkannya) kira-kira sama, ada kira-kira setengah dari kerusakan Real yang sama seperti BaseDamage. Ini benar, tidak peduli seberapa besar nilainya. Ini juga yang menjadi dasar dasar estimasi DPS Anda. Cukup berasumsi bahwa musuh memiliki pertahanan sebanyak senjata memiliki serangan / penetrasi, yang berarti formula DPS Anda menjadiAttackFrequency * BaseDamage / 2

Sunting: Berikut adalah beberapa tabel dengan nilai contoh:

 Damage by Defense for single attack     

              Defense
          |     0 |   35  | 50   | 100
       ---+-------+------+-------+-------
       35 |    35 | 17.5  | 14.4 |  9.1
Attack 50 |    50 | 29.4  | 25.0 | 16.6
      100 |   100 | 74.0  | 66.7 | 50.0

 Dps assuming HitFrequency = 100 / Attack

              Defense
          |     0 |   35  | 50   | 100
       ---+-------+-------+------+-------
       35 |   100 | 50.0  | 41.1 | 25.9
Attack 50 |   100 | 58.8  | 50.0 | 33.3          
      100 |   100 | 74.0  | 66.7 | 50.0

Seperti yang dapat Anda lihat dari angka-angka ini, senjata kecepatan tinggi kerusakan rendah masih nominal lebih kuat melawan musuh yang sama daripada senjata kecepatan rendah kerusakan tinggi jika mereka memiliki DPS yang sama menurut AttackFrequency * BaseDamage / 2. Tetapi efeknya lebih terlihat pada musuh def tinggi daripada pada musuh def rendah. Keduanya sama-sama bagus pada musuh 0-def. Itu berarti senjata serangan cepat tidak terlalu buruk pada musuh dengan def rendah daripada pada musuh def tinggi.

Ini mungkin diimbangi oleh fakta bahwa senjata berkecepatan tinggi memberi pemain lebih banyak fleksibilitas mengenai distribusi kerusakan dan dengan demikian memungkinkan mereka untuk menghindari pemborosan DPS pada overkill. Ketika pemain menghadapi sejumlah besar musuh yang sangat lemah yang semuanya mati dengan satu pukulan, maka senjata 5 serangan per detik dapat membunuh 5 musuh per detik sementara senjata 1 serangan per detik hanya dapat membunuh 1 musuh per detik. Keuntungan lain yang mungkin muncul ketika Anda menambahkan keacakan serangan. Karena hukum angka besar, banyak serangan lemah akan menghasilkan output kerusakan yang lebih halus dan lebih dapat diandalkan daripada beberapa serangan kuat. Pemain biasanya mendapat manfaat dari keandalan. Tetapi ketika pertimbangan seperti itu tidak relevan karena mekanisme permainan Anda dan / atau desain pertemuan, Anda harus membuat senjata yang lebih cepat sedikit lebih kuat daripada yang seharusnya untuk mengimbanginya.

Salah satu cara untuk meningkatkan senjata kecepatan tinggi adalah pengenalan efek yang memicu dengan peluang x% per serangan dan tidak bergantung pada kerusakan. Ini akan jauh lebih kuat dengan senjata serangan cepat karena mereka akan memicu jauh lebih sering.

Philipp
sumber
Terima kasih @ Pilip, saya pikir itu akan menyelesaikannya. Kerusakan akan terlalu tinggi saat ini tetapi saya akan men-tweak itu.
marcg11
@ marcg11 Untuk apa kisaran Anda SkillDmg? Saya menganggapnya sebagai faktor multiplikasi. Jadi serangan dasar telah 1.0dan serangan spesial double-damage akan terjadi 2.0. Jika Anda lebih suka ini menjadi bilangan bulat, Anda mungkin ingin menambahkannya BaseDamagedaripada mengalikannya.
Philipp
Saya menyadari bahwa formula yang Anda berikan persis sama dengan milik saya jika saya menetapkan skillDamage sebagai pengganda. Jadi saya masih tidak bisa setengah dari kerusakan belati jika saya menggandakan kecepatan serangan untuk mempertahankan kerusakan.
marcg11
@ marcg11 Tidak, tidak sama. Perbedaan utama adalah bahwa saya mengalikan dengan BaseDamage kuadrat ( BaseDamage * BaseDamage), Anda hanya mengalikannya dengan BaseDamage sekali (yang berarti BaseDamage berkurang dalam rumus).
Philipp
Tapi skillDmg saya tidak pernah persen, skill serangan normalDmg sama dengan baseDmg, jadi itu sama.
marcg11
0

Jika Anda bermaksud senjata dengan "kekuatan" yang sama untuk menghasilkan DPS yang sama, solusi mudahnya adalah dengan menetapkan DPS secara langsung dan menghitung kerusakan per serangan dari itu, misalnya

float realDamage = (SkillDmg * DPS / ( DPS + Defense )) / AttackSpeed

Dalam contoh ini, pedang Anda akan memiliki kecepatan serangan DPS dan 1.0 dan kecepatan belati akan memiliki kecepatan serangan DPS dan 2.0. Jika Anda ingin menampilkan damage per hit, itu hanya DPS dibagi dengan kecepatan serangan (yaitu 50 untuk pedang dan 25 untuk belati).

Perhatikan bahwa ini menghilangkan mekanik "senjata yang lebih lambat lebih baik vs pertahanan tinggi", yang saya asumsikan adalah yang Anda inginkan.

Ruther Rendommeleigh
sumber
Ya itu kurang lebih idenya, tetapi alih-alih DPS saya menggunakan nilai yang sama untuk semua senjata level x
marcg11