Come sviluppare formule di danno RPG?


117

Sto sviluppando un classico gioco di ruolo in 2D (simile a Final Fantasy) e mi chiedevo se qualcuno avesse qualche consiglio su come fare formule di danno / collegamenti a risorse / esempi? Spiegherò la mia configurazione attuale. Spero di non esagerare con questa domanda e mi scuso se le mie domande sono troppo grandi / ampie

Le statistiche dei miei personaggi sono composte da quanto segue:

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,
};

La vitalità è fondamentalmente la difesa dagli attacchi fisici e lo spirito è la difesa dagli attacchi magici.

Tutte le statistiche hanno fissato massimi (9999 per HP, 999 per MP / SP e 255 per il resto). Con le abilità, i massimi possono essere aumentati (99999 per HP, 9999 per HP / SP, 999 per il resto) con valori tipici (a livello 100) abilità prima / dopo + equipaggiamento + ecc sarà 8000 / 20.000 per HP, 800 / 2000 per SP / MP, 180/350 per altre statistiche

La fine del gioco Enemy HP sarà in genere tra i milioni inferiori (con un super boss con un massimo di ~ 12 milioni).

Mi chiedevo come le persone sviluppano effettivamente le formule di danno adeguate che si ridimensionano correttamente? Ad esempio, sulla base di questi dati, l'utilizzo delle formule di danno per Final Fantasy X come base sembrava molto promettente. Un riferimento completo qui http://www.gamefaqs.com/ps2/197344-final-fantasy-x/faqs/31381 ma come esempio rapido: Str = 127, comando 'Attack' usato, nemico 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

Ho semplicemente modificato i divisori per includere il grado di attacco delle armi e il grado di armatura dell'armatura.

Il danno magico viene calcolato come segue: Mag = 255, viene utilizzata Ultima, MDef nemico = 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

Il problema è che le formule si sfaldano completamente quando le statistiche iniziano a superare 255. In particolare i valori di Difesa oltre 300 iniziano a generare comportamenti davvero strani. Le statistiche ad alta resistenza + difesa portano ad esempio a valori negativi enormi. Mentre potrei essere in grado di modificare le formule per funzionare correttamente per il mio caso d'uso, probabilmente sarebbe più semplice usare una formula completamente nuova. In che modo le persone sviluppano effettivamente formule di danno? Stavo pensando di aprire Excel e provare a costruire la formula in quel modo (mappando le statistiche di attacco contro le statistiche di difesa per esempio) ma mi chiedevo se ci fosse un modo più semplice? Mentre non riesco a trasmettere qui le meccaniche di gioco complete del mio gioco, qualcuno potrebbe essere in grado di suggerire un buon punto di partenza per la costruzione di una formula di danno?

Grazie


1
Penso che tu abbia fatto la cosa giusta per prima cosa che tipo di statistiche, HP ecc vuoi. Questo fa parte dell'esperienza del giocatore e la matematica dovrebbe adattarsi "a questi" valori. Con così tante statistiche, il giocatore dovrebbe intuitivamente sapere quali statistiche influenzeranno i suoi attacchi magici, fisici, ecc. Quindi la prima grande domanda è quali statistiche corrispondono a un attacco e quali statistiche difendono da queste statistiche (per esempio, PhDef difende solo contro PhAtk).
Jonathan Connell,

La cosa enorme è l'equilibrio, probabilmente sarebbe una buona idea creare un programma interattivo (diciamo in C # o qualcosa di veloce) in cui puoi cambiare le statistiche e vedere che tipo di risultati ottieni. Se puoi modificare le formule in fase di esecuzione, ciò aiuterebbe anche :)
Jonathan Connell,

4
Prendi in considerazione l'utilizzo di Excel per farlo. Sembra adatto all'attività e non dovresti scrivere una riga di codice.
Alex Schearer,

2
La domanda più importante è: quale formula offre ai giocatori il massimo divertimento ? (cercato nella pagina per "divertimento" e non delle risposte menzionate: P) Se le sue statistiche o danni aumentano troppo velocemente i giocatori vengono insensibilizzati, se sale lentamente si annoiano. I giocatori devono sentirsi felici quando guadagnano un livello, quindi devono sentirsi come se ci mettessero del lavoro e anche che avrà un effetto notevole sulle loro prestazioni di gioco. (Sono i miei 2 pence)
Annan,

3
"(Def - 280.4) ^ 2" eh? Bene, mi aspetto che le cose diventino strane non per Def> 255 o Def> 300 ma praticamente esattamente per Def> 280,4;) Dopodiché, una def più alta significherà effettivamente una def più bassa a questo punto della formula continuando a comportarsi come previsto in altri punti. A proposito, puoi semplicemente tramare queste cose con Wolfram Alpha o giù di lì. Correggi abbastanza variabili da mantenerne solo due e otterrai un bel diagramma di superficie.
Christian,

Risposte:


140

La creazione di formule come questa richiede la conoscenza di funzioni matematiche elementari - le cose che hai imparato in Algebra e nella classe Pre-calcolo.

Una volta che hai padroneggiato, chiediti (sostituisci "valore" con "danno", "salute" o "velocità" o altro) :

  • Vuoi che il valore cresca a un ritmo costante? Utilizzare una funzione lineare .
  • Vuoi che il valore cresca lentamente all'inizio, ma velocemente dopo? Utilizzare una funzione polinomiale o esponenziale .
  • Vuoi che il valore cresca rapidamente all'inizio e rallenti in seguito? Utilizzare una funzione nth-root o logaritmica .
  • Vuoi che il valore cresca lentamente all'inizio / alla fine ma velocemente nel mezzo? O vuoi che cresca rapidamente ma abbia ancora un limite superiore? Utilizzare una curva sigmoidea , come atan o la funzione logistica .
  • Vuoi che il valore oscilli? Usa un peccato o qualche altra onda.

Quindi modificalo (aggiungi / moltiplica cose, modifica il valore di base, ecc.) Finché non ti sembra giusto. Un calcolatore grafico ti aiuterà a visualizzare come le modifiche ai parametri influenzeranno la funzione.


A proposito, i problemi che si verificano sono dovuti a overflow di numeri interi .

Usa tipi di variabili sufficientemente grandi da contenere i numeri con cui stai lavorando. Le dimensioni differiscono per piattaforma in C ++, ma l'utilizzo del compilatore Visual Studio a unsigned int32 bit, è a 32 bit, mentre unsigned __int64 (specifico per MS) è a 64 bit. Considera anche l'utilizzo di a double.

Inoltre, prova a riorganizzare le tue operazioni in modo da non incontrare numeri così grandi in primo luogo (ad esempio, anziché MDef * MDef / 110farlo (int)((float)MDef / 110 * MDef)) .


3
Se si verificano overflow di numeri interi, la conversione in float - che supporta in modo affidabile solo 24 bit di parte intera - avrà una serie diversa di problemi di precisione.

@Joe: ho ripristinato la tua modifica; In particolare ho scelto __int64sopra uint64_tperché stdint.hnon è disponibile su Visual Studio 2008 e al di sotto, e non volevo confondere il povero ragazzo non più di quanto già non sia.
BlueRaja - Danny Pflughoeft il

1
@BlueRaja: non vedo alcuna prova che il richiedente stia usando Visual Studio ed è presente in ogni altra toolchain standard (incluso Visual Studio 2010).

Anche tu hai lasciato fuori una variante importante, penso: se vuoi che il danno abbia un limite superiore a cui puoi avvicinarti, ma che non raggiungi mai del tutto, puoi usare una funzione sigmoide.
Martin Sojka,

1
user127817: Tutto ciò che è veramente importante è come cresce la funzione. Per il resto, basta provarlo fino a quando non si sente equilibrato. Se ritieni che il personaggio sia troppo potente, riduci il danno. Se ritieni che ci voglia troppo tempo per uccidere un particolare boss o nemico, abbassa la salute o l'armatura di quel nemico. E così via.
BlueRaja - Danny Pflughoeft,

31

Le statistiche dei miei personaggi sono composte da quanto segue:

C'è il tuo vero problema: hai definito le tue statistiche prima di definire cosa significano effettivamente quelle statistiche . Stai mettendo il carrello davanti al cavallo.

Guarda come funziona D&D (da tavolo). "Forza" non significa nulla da solo; significa solo qualcosa perché c'è una regola che dice "Aggiungi il tuo bonus di forza al tuo attacco in mischia". Tale regola fa parte delle regole di combattimento di D&D. Senza le regole di combattimento, "Forza" è generalmente una quantità insignificante.

La prima domanda che devi porsi è questa: quanta differenziazione voglio tra i personaggi? Ancora una volta, guarda D&D. Lì hanno 6 statistiche di base. Queste statistiche definiscono diverse dimensioni di gioco per i personaggi. Un personaggio con una Destrezza elevata avrà opzioni diverse da un personaggio con una Destrezza bassa.

Ma la ragione di tale differenza ritorna tutto alle regole. Un'alta Destrezza significa bonus agli attacchi a distanza; puoi colpire più spesso con attacchi a distanza. Quindi, solo tra Forza e Destrezza, hai due dimensioni di gioco: a distanza contro mischia.

Anche l'intelligenza e la saggezza formano una sorta di accoppiamento, ma interagiscono maggiormente con classi specifiche. Int rende maghi e altri incantatori arcani migliori (o possibili con alcune regole), la saggezza è vitale per i chierici e altri incantatori divini. Poiché gli incantesimi divini e arcani hanno elenchi di incantesimi diversi, queste due statistiche sono coinvolte in diverse dimensioni di gioco.

È necessario definire le regole di base attorno alle statistiche prima di poter definire le funzioni di progressione della crescita e simili. Non hai bisogno di dettagli; non è necessario dire che "ogni punto di forza viene aggiunto nel tiro casuale per determinare se un attacco in mischia colpisce". Ciò di cui hai bisogno sono meta-regole come "la destrezza migliora gli attaccanti a distanza". Puoi capire esattamente come li migliorerà in seguito.

Esistono diversi modi per far avanzare i personaggi. Un comune trucco di Final Fantasy della vecchia scuola era semplicemente usare il livello del personaggio come parte del calcolo del danno. Questo potrebbe semplicemente moltiplicare il livello per la statistica appropriata, o potrebbe significare applicare una funzione al livello del personaggio. Diciamo, una progressione quadratica, in modo che il tasso di danno di un personaggio aumenti per livello.

Comunque tu voglia che le tue funzioni di combattimento funzionino, devono tener conto della progressione. Le tue funzioni hanno bisogno di ganci per la progressione.

D&D ha un modo divertente di progressione. È basato in parte sulla classe; ogni volta che sali di livello, ottieni nuove funzionalità di classe e un bonus piatto per il tuo colpo, in base alla classe del tuo personaggio. Tuttavia, alcune funzionalità di classe sono migliorate da sole. Gli incantesimi in D&D avrebbero incorporato la progressione. Un incantesimo può infliggere 1d4 danni per 2 livelli di un incantatore al di sopra del primo. Quindi ogni altro livello di maghi rende l'incantesimo migliore.

D&D ha anche usato pesantemente la progressione basata sugli oggetti. Fino alla 4a edizione, la progressione basata sugli oggetti era principalmente per i personaggi di combattimento, ma anche nelle edizioni più vecchie, gli incantatori avevano oggetti che davano loro buff di stat o altri aggiustamenti (o flat out dava loro degli incantesimi).

Quindi gli oggetti sono un'altra cosa di cui le tue funzioni di combattimento devono tener conto. Gli oggetti potenziano solo una o più statistiche mentre sono equipaggiati o fanno anche altre cose? D&D era un po 'strano, in quanto le statistiche cambiavano raramente; le armi hanno semplicemente fatto danno XdY, possibilmente con un bonus basato su una delle tue statistiche. E quello era quello. Quindi il tuo unico modo di fare più danni in battaglia era trovare un'arma migliore. In molti giochi di ruolo, prendono in considerazione il livello oltre a un'arma.


6
" C'è il tuo vero problema: hai definito le tue statistiche prima di definire cosa significano quelle statistiche. Stai mettendo il carrello davanti al cavallo. ". Sono fortemente in disaccordo; i numeri in sé sono solo un modo per informare il giocatore del suo potere, ecc. fa parte del design del gioco. Se procedi al contrario, potresti finire con un boss finale con 147 CV ... chi lo vuole davvero?
Jonathan Connell,

8
Beh, Sarevok (in Baldurs Gate) aveva solo 135 CV ...
Martin Sojka,

12
@ 3nixios: Cosa importa se il boss finale ha 147Hp? Ciò che conta è se l'ultimo boss sia stimolante, interessante e soprattutto gratificante per la sconfitta. Un boss con un sacco di Hp non è interessante; è una perdita di tempo. Un boss che può fare casino con la tua squadra, che richiede tattiche speciali che cambiano di momento in momento, che richiede che tu debba usare ogni abilità che hai al suo massimo potenziale, questo è ciò che rende un grande capo finale. Prenderò l'interessante capo da 147Hp sul noioso blocco di Hp ogni giorno.
Nicol Bolas,

@Nicol Bolas Sono pienamente d'accordo con te, stavo cercando di sostenere il motivo per cui credo che il punto di partenza debba essere dalle statistiche. Le statistiche con cui un giocatore inizia sono l'indicazione principale e il gameplay con cui il giocatore gioca durante il gioco. Sono d'accordo che non sono necessarie enormi barre HP per i boss, che danno al giocatore un'indicazione migliore di quale sia la migliore configurazione contro il boss, quali statistiche statistiche ecc. Siano più efficaci. L'importo del corso è irrilevante per il modo in cui lo calcoli, perché puoi semplicemente dividere o moltiplicare i tuoi calcoli finali per una costante c ed essere fatto con esso.
Jonathan Connell,

2
@ 3nixios: Ma questo fa parte del mio punto. La destrezza in D&D esiste per consentire una differenziazione tra personaggi specialisti in mischia e specialisti a distanza. Se non ci fosse il concetto di mischia e attacchi a distanza (e in molti giochi FF per esempio, non esiste), allora questa distinzione non dovrebbe esistere. Potresti cavartela con 5 statistiche invece di 6. Definire una gamma Hp è una cosa, ma definire quali statistiche di base hai un'altra. Le statistiche richiedono regole prima di poterne dare un senso e devi sapere cosa intendi fare una statistica prima di poter dire che avere quella statistica è una buona idea.
Nicol Bolas,

22

Le tue formule sembrano piuttosto complicate. Non sono sicuro di come gestiscano gli sviluppatori di giochi di ruolo professionali, ma consiglierei di concentrarmi sulla semplicità. Cerca di trovare la formula più semplice possibile che includa ancora l'intervallo di statistiche che desideri utilizzare. Ad esempio, potresti fare in modo che le statistiche si modifichino reciprocamente prima del calcolo del danno, piuttosto che modificare il danno durante il calcolo? Una volta che hai in mente una formula, proverei a rappresentarla per una vasta gamma di possibili valori per vedere come si comporterà quando i giocatori saliranno di livello. Ovviamente meno variabili hai, più sarà fattibile.

Inoltre, BlueRaja ha fornito un'importante spiegazione del motivo per cui potresti vedere valori imprevisti a livelli di statistiche più elevati. Sarà importante utilizzare tipi non firmati e verificare la presenza di overflow.


10
+1 per semplice. Chiunque può fare cose rigorosamente complicate, ma non è un buon gioco.
aaaaaaaaaaaa,

8
@Randolf a meno che tu non stia eseguendo un Apple 2 o qualcosa del genere, è altamente dubbio che la rimozione di un moltiplicatore o di una divisione qui e lì influenzerà le prestazioni in qualsiasi modo misurabile.
Tetrad,

8
@Randolf Una grande battaglia in un gioco di ruolo potrebbe significare qualcosa come 10 calcoli di danno al secondo, una CPU moderna può fare diversi miliardi di operazioni al secondo. Puoi tranquillamente supporre che l'impatto sulle prestazioni di tali matematiche "visibili" sia trascurabile. Semplice in questo caso è per il bene di chi progetta e per chi gioca, non per i nostri computer.
aaaaaaaaaaaa,

6
@Randolf Richardson: penso solo che in questo caso potresti perdere un po 'l'obiettivo. Per un MMO è fondamentale un buon protocollo veloce senza grassi e compiti pesanti come la fisica devono essere progettati tenendo conto delle prestazioni. Ma il calcolo del danno è un gameplay di base, dovrebbe essere progettato tenendo presente il gameplay, se porti problemi di prestazioni in una domanda del genere rischi di compromettere la parte di gioco. Parlare di prestazioni quando è importante, rischi di dare l'impressione che questa sia un'area importante da ottimizzare, rubando così l'attenzione dei veri peccatori delle prestazioni.
aaaaaaaaaaaa,

5
@Randolf: non sto insinuando nulla; Sto dicendo che l'ottimizzazione di qualcosa che non è un collo di bottiglia è una perdita di tempo.
Nicol Bolas,

11

La fine del gioco Enemy HP sarà in genere tra i milioni inferiori (con un super boss con un massimo di ~ 12 milioni).

Questo ho un problema con. Dovresti costruire i tuoi boss attorno a ciò che pensi che i tuoi giocatori dovrebbero essere in grado di gestire. Stai costruendo i tuoi giocatori e combattendo la formula attorno a come vuoi che siano i tuoi capi.

Una volta che hai costruito la tua meccanica di combattimento e i ruoli, puoi decidere come vuoi progettare i tuoi boss in quanto dovrebbe essere un buon equilibrio tra il danno che i giocatori possono infliggere / assorbire rispetto a ciò che il boss può infliggere / assorbire.


4
+1 la salute del nemico dovrebbe essere basata su ciò che il giocatore può ragionevolmente gestire a quel punto, non viceversa.
BlueRaja - Danny Pflughoeft,

7

Quei numeri che hai citato sono probabilmente derivati ​​da una semplice modifica di una simulazione, su migliaia di corse.

Quindi dovresti scrivere una simulazione per creare un personaggio di livello 20 e vedere come percorre circa 200 battaglie contro i tipi di nemici che dovrebbe combattere in quel momento. Fallo di nuovo per un personaggio di livello 30 (presumibilmente nella prossima sezione del mondo).

Ci vorrà un po 'per avere ragione, ma scrivere simulazioni automatiche renderà sicuramente molto più semplice la semplice supposizione e la riproduzione manuale.


5

Penso che tu faccia l'errore di voler creare una formula senza avere in mente un design adeguato.

Innanzitutto inizia con un disegno, quindi inizia a pensare a rappresentare il disegno in formule. Più chiaro è il tuo design, più facile dovrebbe essere trovare formule semplici e / o precise.

Cerca di implementare "tipi" di nemici, ad esempio "corazzato" => l'attacco di un giocatore se è di tipo fisico è ridotto del 50%. Non rendere un flusso di battaglie astratto, pensa a ciò che è rilevante e ciò che non lo è.

Se il tuo progetto dice che "nemici corazzati" sono deboli contro la magia ma forti contro i danni fisici, rappresentalo nel codice. Ma ricorda che hai fatto molti test, perché i valori non funzioneranno magicamente la prima volta che scrivi il codice. Prova a creare un design, inserisci la logica nel codice, controlla sempre se questa è la rappresentazione tecnica di ciò che avevi in ​​mente e se non cambia i valori fino a quando non lo è.


Stavo già includendo quel genere di cose - la valutazione dell'armatura diminuisce il danno di attacco fisico a meno che l'attacco non sia contrassegnato come perforazione dell'armatura o usi una formula di danno basata su%
user127817

5

Sebbene il mio progetto non abbia lasciato la fase di foglio di calcolo, sono giunto a una conclusione sulla progettazione della matematica per i giochi di ruolo:

Mantenerli il più semplice possibile. Nel design su cui sto lavorando, ho usato formule molto semplicistiche, adeguate al sistema senza semi-classe. Vale a dire. Fireball Spell ha un danno di 30. Il forum è:

BaseSpellDamage * Attribute (5 * 6)

Possiamo anche aggiungere modificatori come questo:

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

Quindi il risultato finale sarebbe 45 danni. Ho scoperto che l'uso di moltiplicatori di precentage è una soluzione molto semplice e molto scalabile con cui lavorare. Invece di venire con alcuni numeri dispari con matematica complessa per capire il risultato che vogliamo.

Ora possiamo annullare la resistenza ai danni, che calcolerà semplicemente la difesa contro il tipo di danno stabilito. Ci sono due approcci e sinceramente non ho deciso quale sarebbe meglio, ma entrambi sono semplici e fattibili:

DamageResult = Resistance * Damage ( 50% * 45)

Quindi il risultato finale sarà 22 danni rilevati (ho appena tagliato il risultato parziale).

Altra formula:

DamageResult = Damage - Resistnace (45 - 22).

Quindi il risultato finale sarà 23. Se accade che la resistenza è maggiore del danno subito, il personaggio non riceve alcun danno. Naturalmente spetta a te assicurarti che tale situazione non abbia spazio, tranne quando vuoi che sia così.

Anche se devo ammettere che il ridimensionamento del precentage è un po 'più facile da bilanciare e ridimensionare. Ma questo dipende anche dai tuoi numeri di base. Il ridimensionamento precentage funzionerà meglio se inizi da 100 in poi. Se stai operando su piccoli numeri (qualcosa al di sotto di 100 per essere onesti), può diventare imbarazzante poiché inizierai a ottenere risultati in virgola mobile, che sarà difficile bilanciare e effettivamente fare qualcosa di interessante con loro.

Probabilmente la soluzione ottimale in quel caso è usare entrambi gli approcci quando vedono che si adattano. O se sei un fan dei grandi numeri inizia da 1000.

E alle estremità finali. Non sono giunto a queste conclusioni completamente da solo. In realtà ho trascorso parecchio tempo a leggere vari manuali di giochi di ruolo (Hero, DnD). Soprattutto DnD è stato utile, poiché opera su principi simili ma invece di attributi utilizza livelli per le sue formule, possono essere a volte più complessi. Di quello che ho presentato qui.

In ogni caso, il miglior consiglio è: cerca di renderli il più semplici possibile. Non usare matematica avanzata o lunghe equazioni, poiché sono soggette a errori, difficili da individuare, quando devi affrontare 87234 altre cose contemporaneamente.


3

Come altri hanno già detto, la formula di Final Fantasy X è piuttosto complessa. Generalmente per quella serie più avanti è il gioco, più complicata è la formula. Probabilmente è più facile basare interamente la tua formula di danno su un altro gioco. Ma in generale, penso che valga la pena discutere a livello molto generale che tipo di formule di danno puoi trovare nel mondo e come puoi creare un gioco basato su di esse. La prima cosa che devi decidere è quanti danni vuoi essere in grado di fare alla fine del gioco e che tipo di statistiche vuoi che il giocatore possa avere? Una volta che hai quello, puoi scegliere un sistema di formula e quindi ottimizzare i valori di formula e arma per riflettere tali intervalli nel tempo.

Basati esclusivamente su statistiche

Questa è una buona idea se vuoi che i tuoi personaggi siano flessibili in termini di quali livelli di nemici possono sfidare. Una formula come questa dipenderà solo dalle statistiche del giocatore, dal suo equipaggiamento e dalle statistiche dei nemici. Queste formule sono generalmente abbastanza semplici. Final Fantasy Legend II (vedi http://www.shenafu.com/ffl2/weapon.php per esempio, ha armi che fanno danni in base alla semplice formula:

(Stat+StatBonus)*WeaponStrength - Defense*4

Una formula come questa è buona se si desidera un metodo molto semplice per stimare il danno o un punto di salto rapido per modificare il danno in base ad altri fattori come abilità e debolezze elementali.

Per mostrare quanto può davvero andare avanti questo tipo di formula, considera la formula del danno per Inflation RPG, un gioco per Android e IOS (vedi http://inflation-rpg.wikia.com/wiki/Calculation ). La formula dipende fortemente sia dalle statistiche che dalle attrezzature. Ogni equipaggiamento ha due statistiche: un bonus alla statistica ATK e un valore moltiplicatore. Alcuni equipaggiamenti hanno moltiplicatori bassi, ma bonus alti, altri hanno bonus bassi ma moltiplicatori alti. Per un personaggio con solo 10 ATK, l'ascia da battaglia con il suo bonus di 5000 ATK ma un moltiplicatore basso del 145% è un'ottima scelta. Il danno totale è (10+5000)*1.45 = 7264, ma l'Estoc, con 0 bonus e un moltiplicatore del 300% è una scelta sbagliata - il danno è (10+0)*3 = 30. Più avanti nel gioco, un personaggio con 5000 attacchi preferirebbe cambiare arma.

Basato su statistiche e livelli:

Un buon esempio di questo è Final Fantasy V, VI e Final Fantasy XII (vedi http://www.gamefaqs.com/ps2/459841-final-fantasy-xii/faqs/45900 , per esempio). La formula per le spade in FFXII è:

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

e la formula del danno per le doghe è:

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

Sono molto simili, ma noti che la formula della spada dipende solo dalla forza e dal livello, mentre la formula del bastone dipende dalla forza, dalla magia e dal livello. Il vantaggio di questo tipo di formula è che consente al giocatore due strade di crescita: costruire le proprie statistiche o costruire i propri livelli. Il rovescio della medaglia è che penalizza anche i personaggi in entrambi i modi. Ciò che finisce davvero è consentire al giocatore di salire di livello per aumentare l'output di danno (per FFXII questo aumenta il suo danno di circa il 4% per livello intorno al livello 50 quando si tiene conto dei guadagni delle statistiche) per aiutare a personalizzare la difficoltà in base al proprio livello di comfort.

Danno fisso:

Le formule di danno fisso non dipendono dalle statistiche o dal livello del personaggio, ma solo dalla formula di danno interno dell'arma stessa. Possono comunque variare su un raggio, ma infliggono lo stesso danno indipendentemente dall'utente (salvo eventuali altri effetti speciali o tratti caratteriali). Sono meglio utilizzati se l'arma sta per causare danni fissi e la capacità di equipaggiare l'arma dipende dalle statistiche e / o dal livello. Diablo 2, per esempio, lo fa, così come molti roguelike che hanno armi che dipendono dai tiri di dado. Detto questo, il 'danno fisso' non implica "non casuale" - e in effetti di solito c'è qualche elemento di casualità nel danno fatto.

Questa è una buona metodologia se vuoi avere armi che sono facili da trasferire tra i personaggi o per controllare attentamente l'output di danno che i personaggi in determinati punti del gioco possono fare se sai a quale equipaggiamento hanno accesso (tramite drop table, scrigni e rubare le tabelle).

Un altro posto in cui ti imbatterai è con alcuni tipi di equipaggiamento o oggetti in Final Fantasy. 1000 aghi, ad esempio, infliggono sempre 1000 danni. In Final Fantasy Legend II, le arti marziali infliggono danni in base alla formula:

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

Final Fantasy XII ha anche riparato un po 'i danni per le pistole, infliggendo danni secondo la formula:

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

Sebbene il danno sia in qualche modo casuale, varia solo del 26,5 percento nell'intervallo totale, quindi ti garantirai un certo livello di danno in media nel tempo. Questi tipi di attacchi sono utili per i personaggi che hanno sia statistiche basse sia livelli bassi nei giochi che normalmente tengono conto di quei fattori che infliggono danni. Inoltre, ignorano la difesa del bersaglio (anche se la formula potrebbe essere facilmente rielaborata per adattarsi alla difesa se lo desideri).


2

tutti i giochi della serie fantasy finale hanno avuto un limite stat di 255 a causa del problema riscontrato. a livello 100 le statistiche sarebbero 255.

dici di aumentare le statistiche con abilità ed equipaggiamento e ricordo di averlo visto nei giochi, ma il modo in cui è fatto è nella formula. c'è un ulteriore passaggio che controlla i modificatori di abilità e equipaggiamento e li applica dopo che le statistiche sono state usate.

nel tuo caso sarebbe il passaggio 21: applica i modificatori di abilità passaggio 22: applica i modificatori di equipaggiamento passaggio23: danno finale.

se sei interessato a google per le formule fantasy finali, sono là fuori. Ho una copia delle attuali meccaniche di battaglia tra cui l'intelligenza artificiale per Final Fantasy 4, 6, 7 e 9. le persone le hanno sottratte ai giochi originali quando creavano rom per emulatori. Non è così difficile da trovare se si guarda abbastanza duro.

la cosa più grande per la creazione di formule è il test. imposta una sceneggiatura per eseguire la tua battaglia con Ai su entrambi i lati ed eseguire diverse centinaia di battaglie. varia i mostri e le statistiche e vedi se funziona o se lv 40 uccide tutto, è del tutto possibile che un boss sia effettivamente impossibile uccidere lol. un suggerimento sarebbe quello di disattivare tutte le animazioni in quanto è impressionante la velocità con cui l'IA può combattere quando nessuno sta guardando.


2

Mi chiedevo come le persone sviluppano effettivamente le formule di danno adeguate che si ridimensionano correttamente?

Le prime 2 cose sono:

  • decidi cosa intendi per "corretto": qual è la tua idea di "danno corretto"?
  • decidi cosa intendi per "scala": quali valori cambieranno e quale effetto vorresti avere su quei cambiamenti?

Una volta che lo sai, hai abbastanza informazioni per usare le formule matematiche che BlueRaja ha menzionato nella sua risposta . Ricorda solo che non esiste una formula di danno "corretta", solo una che corrisponda al tuo design per il tipo di esperienza che desideri che i tuoi giocatori abbiano.


Questo è un commento estremamente inutile. Riassume "Non lo so" e per questo è una perdita di tempo per tutti. Contrassegnare per l'eliminazione.
Krythic,

1

in alternativa, se stai cercando una formula molto semplice, procedi come segue:

(Nota che questa è la mia idea per una formula)

Innanzitutto, per una semplice formula di attacco, avrai bisogno solo di alcune statistiche. Le statistiche di Attacco del giocatore (questa potrebbe essere Forza o Magia, a seconda del tipo di mossa).

Quindi, crea una variabile, chiamata MovePower. Questo dipenderà dalla mossa e mosse migliori avrebbero un MovePower migliore. Per la mia formula, i comandi "Attacco" generali hanno un MovePower di 5.

Quindi, fai della difesa una statistica basata su percentuale (e, ovviamente, rende impossibile ottenere una difesa del 100% sui danni)

Quindi, durante la fase di attacco, moltiplica semplicemente le statistiche di attacco per la potenza di movimento e rimuovi il danno in base alla difesa dei nemici! semplice!

Puoi anche scegliere di avere altri modificatori, come se la mossa colpirà (Precisione), se la mossa ha un altro effetto aggiunto (Biografia, infliggendo veleno) e opta per quello per colpire, (Precisione ancora), ha un miglioramento / declassamento del danno mosse che cambiano le statistiche, ect. Divertiti con esso!


Un'altra opzione che evita l'armatura come problema percentile (permettendo così ai suoi valori di apparire uguali) è di calcolare il danno contro l'armatura come un confronto che diventa un moltiplicatore. Qualcosa come Ln (atk / def) come base. Ciò consente di aumentare le statistiche delle armature difensive man mano che il tempo passa allo stesso modo. Scopri come ottenere il raggio di danno desiderato di base per quando le statistiche danno e armatura sono uguali ed estrapolate da lì. Questo rende gli attacchi "evitamento dell'armatura" un trucco da creare, ma questo fa parte della creatività.
Aviose,

1

In sostanza, devi capire due cose.

  1. Come eseguire correttamente il calcolo con numeri grandi.
  2. Come vuoi e ti aspetti che il danno da attacco si comporti contro avversari più deboli e forti.

1

Puoi sia l'utente doubleche una libreria di grandi numeri. Fare calcoli con numeri grandi (come nei giochi clic / inattivi spesso si basa su librerie di numeri così grandi). Nel tuo caso, i numeri sono relativamente piccoli, quindi l'utilizzo di virgola mobile a 64 bit consentirà la flessibilità necessaria.

2

Come vuoi che il gioco si comporti? qualche esempio:

  • Un approccio è quello ATKdi decidere se colpire o meno e tirare un dado con un danno noto a seconda dell'arma: ad esempio spada lunga 1d8, spada a due mani 1d10, pugnale 1d4. Questo non si ridimensionerà incredibilmente bene se l'HP può crescere ancora e ancora. Se usi ATKper determinare se i personaggi colpiscono o mancano, puoi fare un altro tiro dopo un colpo riuscito con ATK* 80% per determinare i crits.
  • Se vuoi usare una formula di danno, la formula di danno può essere semplice come (ATK - DEF) +/- 20%quella fatta in World's End (un gioco di strategia RPG). Ciò significa che gli attacchi contro un avversario con forza DEFnon possono fare alcun danno. Per instace ATK = 10, ENEMY DEF = 12, (ATK - DEF) = -2e significa anche che l'alta definizione attacco vs leggermente inferiore, poteva fare ben poco danno, rendendo potenzialmente più battaglie con l'aumentare della HP. Ad esempio con ATK = 1010, ENEMY DEF = 1005il danno sarebbe 5. Il danno anche aumentare drammaticamente ora se ATKviene aumentata di una piccola percentuale. Ad esempio ATK = 1055, infliggerà il 900% di danni in più con solo un aumento del ATKvalore di % 5 .
  • Per evitare ciò, puoi fare qualcosa come ATK / DEF * WEAPON_DAMAGEQuesto si ridimensionerà più gradualmente quando ATKo DEFsono aumentati e permetterà a un attaccante debole di danneggiare una creatura con forza DEF.

tl; dr Devi trattare i tuoi numeri in modo responsabile e capire come vuoi che il gioco si comporti in diverse situazioni. Alcune domande da porsi:

  1. Quanti attacchi (turni) dovrebbero essere necessari per sconfiggere quel boss / servitore?
  2. In che modo abilità, buff, debuff diversi dovrebbero influenzare la xbattaglia? Dovrebbe essere senza speranza, vincere dovrebbe essere y%meno / più probabile?
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.