Come progettare una formula di danno in un gioco di ruolo che mantiene bilanciate le armi con diverse velocità d'attacco?


8

Sto realizzando un gioco rpg mobile, uno infinito in cui esiste un sistema di bottino come Diablo 3. Le armi hanno attacco e velocità, le armature hanno un valore di resistenza (non percentuale).

La formula che sto usando è:

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

I risultati sono buoni, il danno aumenta se la difesa diminuisce e non aumenta esponenzialmente a causa della divisione tra ( BaseDamage + Difesa).

Diciamo che ho una spada con 1,0 velocità d'attacco che infligge 50 danni. Quello è 50 dps, e ho un pugnale che voglio che attacchi più velocemente, ma ovviamente infligge meno danni, per mantenere i dps la logica dice che se la velocità di attacco dei pugnali è raddoppiata, il danno deve essere dimezzato (velocità 2.0 con 25 dmg). Ma usando la formula sopra vedrai che il danno reale reale DPS è inferiore alla spada.

Iv'e risolto facendo in modo che il pugnale non infliggesse 25 danni ma un po 'di più, facendo alcuni calcoli, posso fare in modo che i veri dps siano gli stessi per bilanciare le cose. In questo caso il pugnale alla velocità 2.0 dovrebbe infliggere 32 danni per essere lo stesso danno reale della spada.

Tuttavia, voglio visualizzare il numero DPS sulle armi. Se visualizzo solo il pugnale DPS con una velocità di attacco di 32 dmg * 2 sarà 64 dps, rispetto alla spada 50 dps, si dirà chiaramente che il pugnale è migliore, ma ovviamente non lo è.

Possibili soluzioni? Cambia la formula del danno iniziale? Se sì, quale? Supponiamo che non modifichi la formula, c'è qualche soluzione? Non mi piace davvero ingannare il pugnale per infliggere più danni della metà per renderlo uniforme ...

Vorrei davvero conoscere la formula del danno per diablo 3. So che diablo 3 armi DPS è semplicemente danno base * velocità d'attacco.

Modificare:

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)

1
Nella tua modifica hai la formula che ho pubblicato nella mia risposta ( damage * damage / ( damage + defense)), solo senza tenere conto del danno da abilità. Il motivo della differenza in DPS è perché stai usando la stessa difesa. Il motivo per cui ottieni risultati diversi è perché con quella formula, armi lente ma forti sono migliori contro i nemici ad alta definizione mentre armi veloci ma deboli sono migliori contro i nemici a bassa definizione (che sembra plausibile). Hai assunto un nemico ad alta definizione e bilanciato entrambe le armi contro di esso, il che significa che hai reso il pugnale sopraffatto. Il calcolo DPS mostra che sopraffare.
Philipp

Risposte:


20

I problemi che hai con il calcolo del DPS da quella formula sono perché quello che chiami BaseDamagenon sembra essere quello.

Supponendo che tutti i numeri siano positivi, BaseDamage / ( BaseDamage + Defense )si risolveranno sempre in un numero in virgola mobile compreso tra 1 e 0. Non importa se ne hai 10 BaseDamage, 1.000 BaseDamageo 1.000.000 BaseDamage, sarai sempre in quell'intervallo. La posizione in quel raggio dipende da come BaseDamagel'arma si confronta con quella Defensedel bersaglio. Ciò significa che ciò che realmente influenza l'ordine di grandezza del realDamage di un attacco è principalmente il SkillDmgmoltiplicatore.

Osservando queste proprietà matematiche, non chiamerei davvero questa proprietà dell'arma, BaseDamagema piuttosto DefensePenetration, perché descrive la capacità dell'arma di superare la difesa nemica e fare comunque la maggior parte del suo danno. Questo potrebbe effettivamente essere un meccanico interessante da avere (o no ... è qualcosa che devi testare), ma non dice molto sul livello di potenza di un'arma.

Quindi, come possiamo risolvere questo problema?

Bene, non esiste una soluzione giusta a questo problema. Ma un cambiamento che potrebbe fare quello che vuoi fare (un'arma doppia rispetto al doppio = circa il doppio del danno) è quello di aggiungere BaseDamageun altro fattore moltiplicativo:

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

Se ti piace la meccanica di penetrazione della difesa che hai scoperto per caso, ecco come apparirebbe Penetrationcome un'arma separata:

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

La cosa bella di questa formula è che si adatta abbastanza bene:

  • Anche quando la difesa è patetica rispetto al valore di attacco, non c'è mai più danno dell'attacco. Questo ti dà un limite massimo alla quantità di danni che un personaggio può infliggere, il che rende il bilanciamento molto più semplice.
  • Dall'altro estremo, non importa quanto in alto la difesa arriva, non può mai mitigare completamente il danno (tranne attraverso errori di arrotondamento), quindi c'è sempre spazio per migliorare il difensore e non c'è mai un attacco completamente inutile.
  • Quando Difesa e BaseDamage (e Penetrazione quando lo si desidera) sono all'incirca uguali, c'è circa la metà del danno reale di BaseDamage. Questo è vero indipendentemente dalla grandezza dei valori. Questo è anche ciò su cui puoi basare la tua stima DPS. Supponi semplicemente che il nemico abbia la stessa difesa che l'arma ha in attacco / penetrazione, il che significa che la tua formula DPS diventaAttackFrequency * BaseDamage / 2

Modifica: ecco alcune tabelle con valori di esempio:

 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

Come puoi vedere da questi numeri, le armi ad alta velocità a bassa velocità sono ancora nominalmente più potenti contro lo stesso nemico rispetto alle armi a bassa velocità ad alta velocità se hanno lo stesso DPS secondo AttackFrequency * BaseDamage / 2. Ma l'effetto è più visibile sui nemici ad alta definizione che sui nemici a bassa definizione. Entrambi sono ugualmente buoni su nemici a 0 def. Ciò significa che le armi ad attacco rapido sono meno dannose per i nemici a bassa definizione che per i nemici ad alta definizione.

Ciò potrebbe essere bilanciato dal fatto che le armi ad alta velocità offrono al giocatore una maggiore flessibilità per quanto riguarda la distribuzione del danno e quindi consente loro di evitare di sprecare DPS in overkill. Quando il giocatore deve affrontare un numero molto elevato di nemici molto deboli che muoiono tutti con un colpo, un'arma da 5 attacchi al secondo può uccidere 5 nemici al secondo mentre un'arma da 1 attacco al secondo può uccidere solo 1 nemico al secondo. Un altro possibile vantaggio appare quando aggiungi casualità agli attacchi. A causa della legge di grandi numeri, molti attacchi deboli produrranno un danno più regolare e affidabile rispetto a pochi attacchi potenti. I giocatori di solito beneficiano dell'affidabilità. Ma quando tali considerazioni sono irrilevanti a causa della meccanica del tuo gioco e / o del design dell'incontro, dovrai rendere le tue armi più veloci un po 'più potenti di quanto dovrebbero essere per compensare.

Un modo per dare una spinta alle armi ad alta velocità potrebbe essere l'introduzione di effetti che si innescano con una probabilità x% per colpo e non dipendono dal danno. Questi sarebbero molto più potenti con un'arma ad attacco rapido perché si innescherebbero molto più frequentemente.


Grazie @Philipp, penso che lo risolverà. Il danno sarà troppo alto al momento, ma lo modificherò.
marcg11,

@ marcg11 A cosa serve esattamente la tua gamma SkillDmg? Ho pensato che fosse un fattore moltiplicativo. Quindi ha un attacco base 1.0e un attacco speciale a doppio danno avrebbe 2.0. Se preferisci che questi siano numeri interi, ti consigliamo di aggiungerlo BaseDamageinvece di moltiplicarlo.
Philipp,

Mi sono reso conto che la formula che hai dato è esattamente la mia se stabilisco skillDamage come moltiplicatore. Quindi non posso ancora dimezzare il danno del pugnale se raddoppio la velocità d'attacco per mantenere il danno.
marcg11,

@ marcg11 No, non è lo stesso. La differenza principale è che moltiplico con BaseDamage quadrato ( BaseDamage * BaseDamage), stai moltiplicando per BaseDamage solo una volta (il che significa che BaseDamage viene ridotto nella formula).
Philipp

Ma la mia abilità Dmg non è mai stata una percentuale, una normale abilità di attacco Dmg è la stessa di baseDmg, quindi è la stessa.
marcg11,

0

Se si intende che armi di uguale "potenza" si traducano in DPS uguali, una soluzione semplice sarebbe quella di assegnare direttamente il DPS e calcolare il danno per colpo da quel

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

In questo esempio, la tua spada avrebbe 50 DPS e 1,0 velocità d'attacco e il pugnale avrebbe 50 DPS e 2,0 velocità d'attacco. Se vuoi mostrare il danno per colpo, questo è semplicemente DPS diviso per la velocità d'attacco (cioè 50 per la spada e 25 per il pugnale).

Si noti che questo elimina la meccanica "armi più lente sono migliori vs alta difesa", che presumo sia ciò che desideri.


Sì, è più o meno l'idea, ma invece di DPS sto usando un valore che è lo stesso per tutte le armi di livello x
marcg11
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.