Como desenvolver fórmulas de dano de RPG?

117

Estou desenvolvendo um RPG 2d clássico (em uma linha semelhante à fantasia final) e fiquei imaginando se alguém teria algum conselho sobre como causar danos às fórmulas / links para recursos / exemplos? Vou explicar minha configuração atual. Espero não estar exagerando nessa questão e peço desculpas se minhas perguntas são muito grandes / amplas

As estatísticas de Meus Personagens são compostas pelo seguinte:

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

Vitalidade é basicamente defesa contra ataques físicos e espírito é defesa contra ataques mágicos.

Todas as estatísticas têm máximos fixos (9999 para HP, 999 para MP / SP e 255 para o restante). Com habilidades, os máximos podem ser aumentados (99999 para HP, 9999 para HP / SP, 999 para o restante) com valores típicos (no nível 100) antes / depois de habilidades + equipamentos + etc serão 8000 / 20.000 para HP, 800 / 2000 para SP / MP, 180/350 para outras estatísticas

No final do jogo, o inimigo HP normalmente fica na casa dos milhões (com um super chefe com no máximo ~ 12 milhões).

Fiquei me perguntando como as pessoas realmente desenvolvem fórmulas de danos adequadas que escalam corretamente? Por exemplo, com base nesses dados, o uso das fórmulas de dano para Final Fantasy X como base parecia muito promissor. Uma referência completa aqui http://www.gamefaqs.com/ps2/197344-final-fantasy-x/faqs/31381, mas como um exemplo rápido: Str = 127, comando 'Attack' usado, inimigo 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

Simplesmente modifiquei os divisores para incluir a classificação de ataque de armas e a classificação de armadura.

O Dano Mágico é calculado da seguinte forma: Mag = 255, Ultima é usado, MDef inimigo = 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

O problema é que as fórmulas desmoronam completamente quando as estatísticas começam a ficar acima de 255. Em particular, valores de defesa acima de 300 ou mais começam a gerar um comportamento realmente estranho. Estatísticas de alta resistência + defesa levam a valores negativos massivos, por exemplo. Embora eu possa modificar as fórmulas para funcionarem corretamente no meu caso de uso, provavelmente seria mais fácil usar uma fórmula completamente nova. Como as pessoas realmente desenvolvem fórmulas de danos? Eu estava pensando em abrir o Excel e tentar criar a fórmula dessa maneira (mapeando as Estatísticas de ataque vs. Estatísticas de defesa, por exemplo), mas estava pensando se há uma maneira mais fácil. Embora eu não possa transmitir toda a mecânica do jogo aqui, alguém poderá sugerir um bom ponto de partida para a construção de uma fórmula de dano?

obrigado

user127817
fonte
1
Eu acho que você fez a coisa certa na primeira configuração que tipo de estatísticas, HP etc você quer. Isso faz parte da experiência do jogador e a matemática deve ajustar-se a esses valores. Com tantas estatísticas, porém, o jogador deve saber intuitivamente quais estatísticas afetarão seus ataques mágicos, físicos, etc. Portanto, a primeira grande questão é quais estatísticas correspondem a um ataque e quais estatísticas defendem contra essas estatísticas (por exemplo, o PhDef defende apenas contra PhAtk).
Jonathan Connell
O grande problema é o equilíbrio, provavelmente seria uma boa ideia criar um programa interativo (digamos, em C # ou algo rápido) onde você pode alterar as estatísticas e ver que tipo de resultados obtém. Se você pode alterar as fórmulas em tempo de execução, que também ajudaria :)
Jonathan Connell
4
Considere usar o Excel para fazer isso. Parece bem adequado para a tarefa e você não precisa escrever uma linha de código.
Alex Schearer
2
A pergunta mais importante é: Qual fórmula oferece aos jogadores a mais divertida ? (procurou na página por "diversão" e nenhuma das respostas mencionou: P) Se estatísticas ou danos aumentam muito rápido, os jogadores ficam insensibilizados, se subir lentamente, eles ficam entediados. Os jogadores precisam se sentir felizes quando ganham um nível, por isso precisam sentir que trabalham nisso e também que isso terá algum efeito perceptível no desempenho do jogo. (essa é a minha 2 pence)
Annan
3
"(Def - 280,4) ^ 2" hein? Bem, eu esperaria que as coisas ficassem estranhas, não para Def> 255 ou Def> 300, mas praticamente exatamente para Def> 280.4;) Depois disso, def maior significa efetivamente um def menor nesse ponto da fórmula, enquanto continua a se comportar como esperado em outros pontos. BTW, você pode plotar essas coisas com Wolfram Alpha ou algo assim. Corrija variáveis ​​suficientes para manter apenas duas e você obterá um bom gráfico de superfície.
Christian

Respostas:

140

Criar fórmulas como essa requer conhecimento de funções matemáticas elementares - o que você aprendeu nas aulas de Álgebra e Pré-cálculo.

Depois de dominar os itens, pergunte a si mesmo (substitua "valor" por "dano" ou "saúde" ou "velocidade" ou o que for) :

Em seguida, basta ajustá-lo (adicionar / multiplicar coisas, alterar o valor base etc.) até que pareça certo. Uma calculadora gráfica ajudará você a visualizar como as alterações nos parâmetros afetarão a função.


A propósito, os problemas que você está enfrentando devem-se a estouros de número inteiro .

Use tipos de variáveis ​​grandes o suficiente para armazenar os números com os quais você está trabalhando. Os tamanhos diferem de acordo com a plataforma no C ++, mas o compilador do Visual Studio de unsigned int32 bits é de 32 bits, enquanto unsigned __int64 (específico do MS) é de 64 bits. Considere também usar a double.

Além disso, tente reorganizar suas operações para não encontrar números tão grandes em primeiro lugar (por exemplo, em vez de MDef * MDef / 110fazê-lo (int)((float)MDef / 110 * MDef)) .

BlueRaja - Danny Pflughoeft
fonte
3
Se você estiver com excesso de números inteiros, a conversão para float - que suporta apenas 24 bits de parte inteira de maneira confiável - terá um conjunto diferente de problemas de precisão.
@ Joe: Voltei sua edição; I escolheu especificamente __int64sobre uint64_tporque stdint.hnão está disponível no Visual Studio 2008 e abaixo, e eu não queria confundir o pobre rapaz mais do que ele já é.
BlueRaja - Danny Pflughoeft
1
@BlueRaja: Não vejo nenhuma evidência de que o solicitante esteja usando o Visual Studio e esteja presente em todas as outras cadeias de ferramentas padrão (incluindo o Visual Studio 2010).
Você também deixou de fora uma variante importante, eu acho: se você deseja que o dano tenha um limite superior ao qual possa se aproximar, mas nunca atingir completamente, você pode usar uma função sigmóide.
Martin Sojka
1
user127817: Tudo o que é realmente importante é como a função cresce. Quanto ao resto, basta testá-lo até parecer equilibrado. Se você sentir que o personagem é muito poderoso, diminua o dano dele. Se você sentir que leva muito tempo para matar um chefe ou inimigo em particular, diminua a saúde ou a armadura desse inimigo. E assim por diante.
BlueRaja - Danny Pflughoeft
31

As estatísticas de Meus Personagens são compostas pelo seguinte:

Esse é o seu verdadeiro problema: você definiu suas estatísticas antes de definir o que essas estatísticas realmente significam . Você está colocando o carrinho na frente do cavalo.

Veja como o D&D (mesa) funciona. "Força" não significa nada por si só; significa apenas algo porque existe uma regra que diz: "Adicione seu bônus de força ao seu ataque corpo a corpo". Essa regra faz parte das regras de combate da D&D. Sem as regras de combate, "Força" é geralmente uma quantidade sem sentido.

A primeira pergunta que você precisa se perguntar é: quanta diferenciação eu quero entre os personagens? Mais uma vez, observe D&D. Lá, eles têm 6 estatísticas básicas. Essas estatísticas definem diferentes dimensões do jogo para os personagens. Um personagem com alta destreza terá opções diferentes de um personagem com baixa destreza.

Mas a razão de toda essa diferença voltar às regras. Uma alta destreza significa bônus para ataques à distância; você pode acertar com mais frequência com ataques à distância. Então, apenas entre Força e Destreza, você tem duas dimensões de jogo: alcance vs. corpo a corpo.

Inteligência e Sabedoria também formam uma espécie de emparelhamento, mas elas interagem mais com classes específicas. Int faz Wizards e outros lançadores de magia arcanos serem melhores (ou possível sob alguns conjuntos de regras); a sabedoria é vital para os clérigos e outros lançadores de magia divinos. Como os feitiços divinos e arcanos têm listas de feitiços diferentes, essas duas estatísticas estão envolvidas em diferentes dimensões do jogo.

Você precisa definir as regras básicas em torno das estatísticas antes de poder definir funções de progressão de crescimento e similares. Você não precisa de detalhes; você não precisa dizer que "cada ponto de força é adicionado ao teste aleatório para determinar se um ataque corpo a corpo atinge". O que você precisa são meta-regras como "a destreza melhora os atacantes à distância". Você pode descobrir exatamente como isso os torna melhores posteriormente.

Existem diferentes maneiras de progredir os personagens. Um truque comum do Final Fantasy da velha escola era simplesmente usar o nível do personagem como parte de seus cálculos de dano. Isso pode ser simplesmente multiplicar o nível pela estatística apropriada, ou pode significar aplicar uma função ao nível do personagem. Digamos, uma progressão quadrática, para que a taxa de dano de um personagem aumente por nível.

Como você deseja que suas funções de combate funcionem, elas precisam levar em consideração a progressão. Suas funções precisam de ganchos para progressão.

D&D tem uma maneira engraçada de progressão. Faz parte da classe; toda vez que você sobe de nível, você obtém novos recursos de classe e um bônus fixo ao seu hit, com base na classe de personagem. No entanto, alguns recursos de classe melhoraram sozinhos. Feitiços em D&D teriam progressão embutida neles. Um feitiço pode causar 1d4 de dano por 2 níveis de um lançador de feitiços acima do primeiro. Portanto, todos os outros níveis de assistente tornam esse feitiço melhor.

O D&D também usou muito a progressão baseada em itens. Até a 4ª edição, a progressão baseada em itens era principalmente para personagens de luta, mas mesmo em edições mais antigas, os conjuradores tinham itens que lhes davam buffs de estatísticas ou outros ajustes (ou flat out lhes davam feitiços).

Portanto, os itens são outra coisa que suas funções de combate precisam levar em consideração. Os itens apenas aumentam uma ou mais estatísticas enquanto estão equipados ou também fazem outras coisas? D&D era um pouco estranho, pois as estatísticas raramente mudavam; As armas simplesmente causaram dano ao XdY, possivelmente com um bônus baseado em uma de suas estatísticas. E foi isso. Portanto, sua única maneira de causar mais dano na batalha era encontrar uma arma melhor. Em muitos RPGs de videogame, eles levam em consideração o nível, além de uma arma.

Nicol Bolas
fonte
6
" Esse é o seu verdadeiro problema: você definiu suas estatísticas antes de definir o que essas estatísticas realmente significam. Você está colocando a carroça na frente do cavalo ". Eu discordo fortemente; os números em si são apenas uma maneira de informar o jogador sobre seu poder, etc. faz parte do design do jogo. Se você seguir o caminho inverso, poderá acabar com um chefe final com 147hp ... quem quer mesmo isso?
Jonathan Connell
8
Bem, Sarevok (em Baldurs Gate) só tinha 135 HP ...
Martin Sojka
12
@ 3nixios: O que importa se o chefe final tiver 147Hp? O que importa é se o último chefe é desafiador, interessante e, acima de tudo, recompensador à derrota. Um chefe com muito HP não é interessante; é uma perda de tempo. Um chefe que pode mexer com seu grupo, que exige táticas especiais que mudam de momento para momento, que exige que você use todas as habilidades que tiver ao máximo potencial, é isso que faz um ótimo chefe final. Vou levar o interessante chefe de 147Hp sobre o bloco chato de Hp qualquer dia.
Nicol Bolas
@ Nicol Bolas Eu concordo totalmente com você, estava tentando apoiar o motivo pelo qual acredito que o ponto de partida deve ser o das estatísticas. As estatísticas com as quais um jogador começa são a principal indicação e jogabilidade com que o jogador joga durante o jogo. Concordo que barras enormes de HP para chefes não são necessárias, isso dá ao jogador uma melhor indicação de qual é a melhor configuração contra o chefe, que estatísticas, armas etc. são mais eficazes. A quantidade de curso é irrelevante para a maneira como você a calcula, porque você pode simplesmente dividir ou multiplicar seus cálculos finais por uma constante c e concluir com ela.
11137 Jonathan Connell
2
@ 3nixios: Mas isso faz parte do meu ponto. Existe destreza em D&D para permitir uma diferenciação entre caracteres especialistas corpo a corpo e especialistas à distância. Se não houvesse conceito de ataques corpo a corpo e de longo alcance (e em muitos jogos FF, por exemplo, não há), essa distinção não precisaria existir. Você pode se dar bem com 5 estatísticas em vez de 6. Definir uma faixa de Hp é uma coisa, mas definir outras estatísticas básicas . As estatísticas exigem regras antes que você possa entendê-las, e você precisa saber o que pretende que uma estatística faça antes de dizer que ter essa estatística é uma boa ideia.
Nicol Bolas
22

Suas fórmulas parecem bastante complicadas. Não tenho certeza de como os desenvolvedores profissionais de RPG lidam com isso, mas recomendo focar na simplicidade. Tente encontrar a fórmula mais simples possível, que ainda incorpore o intervalo de estatísticas que você deseja usar. Por exemplo, você poderia fazer com que as estatísticas se modificassem antes do cálculo do dano, em vez de modificar o dano durante o cálculo? Depois de ter uma fórmula em mente, eu tentaria representar graficamente uma ampla gama de valores possíveis para ver como ela se comportará à medida que os jogadores subirem de nível. Obviamente, quanto menos variáveis ​​você tiver, mais viável será.

Além disso, o BlueRaja forneceu uma explicação importante sobre por que você pode estar vendo valores inesperados em níveis mais altos de estatísticas. O uso de tipos não assinados e a verificação de estouros serão importantes.

Mitch Lindgren
fonte
10
+1 para simples. Qualquer um pode fazer coisas rigorosamente complicadas, mas isso não é um bom jogo.
Aaaaaaaaaaa
8
@ Randolf, a menos que você esteja executando um Apple 2 ou algo assim, é altamente duvidoso que a remoção de uma multiplicação ou uma divisão aqui e ali afete o desempenho de qualquer maneira mensurável.
Tétrada
8
@Randolf Uma grande batalha em um RPG pode significar algo como 10 cálculos de dano por segundo, uma CPU moderna pode fazer vários bilhões de operações por segundo. Você pode assumir com segurança que o impacto no desempenho de qualquer matemática "visível" é insignificante. Simples, neste caso, é para quem cria e quem joga, não para nossos computadores.
Aaaaaaaaaaa
6
@ Randolf Richardson: Eu acho que você pode estar perdendo um pouco o alvo nesse caso. Para um MMO, um bom protocolo rápido e sem gordura é fundamental, e tarefas pesadas como a física precisam ser projetadas com o desempenho em mente. Mas o cálculo de dano é a jogabilidade principal, ele deve ser projetado com a jogabilidade em mente, se você colocar questões de desempenho em uma pergunta que corre o risco de comprometer a parte da jogabilidade. Fale sobre desempenho quando for importante, você corre o risco de dar a impressão de que essa é uma área importante a ser otimizada, roubando a atenção dos pecadores reais de desempenho.
Aaaaaaaaaaaa
5
@ Randolf: não estou implicando nada; Estou dizendo que otimizar algo que não é um gargalo é uma perda de tempo.
Nicol Bolas
11

No final do jogo, o inimigo HP normalmente fica na casa dos milhões (com um super chefe com no máximo ~ 12 milhões).

Eu tenho um problema com isso. Você deve criar seus chefes em torno do que você acha que seus jogadores devem ser capazes de lidar. Você está construindo seus jogadores e fórmula de combate em torno do que você quer que seus chefes sejam.

Depois de criar suas mecânicas e funções de combate, você pode decidir como deseja criar seus chefes, pois deve haver um bom equilíbrio entre o dano que os jogadores podem causar / absorver e o que o chefe pode lidar / absorver.

Ken
fonte
4
+1 na saúde do inimigo deve basear-se naquilo que o jogador pode razoavelmente lidar nesse ponto, e não o contrário.
BlueRaja - Danny Pflughoeft
7

Esses números que você citou provavelmente derivam de apenas uma simulação, em milhares de execuções.

Então, você deve escrever uma simulação para criar um personagem de nível 20 e ver como ele se sai em 200 batalhas ou mais contra os tipos de inimigos que ele deveria estar lutando naquele momento. Faça isso novamente para um personagem de nível 30 (presumivelmente na próxima seção do mundo).

Vai demorar um pouco para acertar, mas escrever simulações automatizadas definitivamente tornará isso muito mais fácil do que apenas adivinhar e jogar manualmente.

bobobobo
fonte
5

Acho que você cometeu o erro de querer criar uma fórmula sem ter um design adequado em mente.

Primeiro comece com um design, depois comece a pensar em representar o design em fórmulas. Quanto mais claro seu design, mais fácil será encontrar fórmulas simples e / ou precisas.

Tente implementar "tipos" de inimigos, por exemplo "blindado" => um ataque de jogador se for do tipo físico reduzido em 50%. Não faça uma batalha fluir para abstrair, pense sobre o que é relevante e o que não é.

Se seu design diz que "inimigos blindados" são fracos contra magia, mas fortes contra dano físico, represente isso no código. Mas lembre-se de que você fez muitos testes, porque os valores não funcionarão magicamente na primeira vez que você escrever o código. Tente criar um design, coloque a lógica no código, sempre verifique se esta é a representação técnica do que você tinha em mente e se não muda os valores até que seja.

daemonfire300
fonte
Eu já estava englobando esse tipo de coisa - classificação armadura escalas para baixo dano de ataque físico a menos que o ataque é sinalizado como perfurante ou usa uma fórmula dano baseado%
user127817
5

Embora meu design não tenha saído da fase de planilha, cheguei a uma conclusão sobre o design de matemática para RPG:

Mantenha-os o mais simples possível. No design em que estou trabalhando, usei fórmulas muito simplistas, adequadas ao sistema sem classe. Ou seja. Feitiço Bola de Fogo tem dano de 30. O forumal é:

BaseSpellDamage * Attribute (5 * 6)

Também podemos adicionar modificadores como este:

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

Portanto, o resultado final seria 45 de dano. Descobri que o uso de multiplicadores precentage é uma solução muito fácil e muito escalável para trabalhar. Em vez de vir com alguns números ímpares com matemática complexa para descobrir o resultado que queremos.

Agora podemos calcular a resistência do dano, que apenas calcula a defesa contra o tipo de dano definido. Existem duas abordagens e, sinceramente, ainda não decidi qual seria a melhor opção, mas ambas são simples e viáveis:

DamageResult = Resistance * Damage ( 50% * 45)

Portanto, o resultado final será de 22 danos (apenas cortei o resultado parcial).

Outra fórmula:

DamageResult = Damage - Resistnace (45 - 22).

Então o resultado final será 23. Se acontecer que a resistência é maior que o dano recebido, o personagem simplesmente não recebe nenhum dano. É claro que cabe a você garantir que essa situação não tenha lugar, exceto quando você desejar.

Embora eu deva admitir que o dimensionamento do precentage é um pouco mais fácil de equilibrar e dimensionar. Mas isso também depende dos números de base. A escala de precedência funcionará melhor se você começar de 100 em diante. Se você estiver operando com números pequenos (qualquer coisa abaixo de 100, para ser honesto), pode ficar estranho, pois você começará a obter resultados de ponto flutuante, que será difícil de equilibrar e fará algo interessante com eles.

Provavelmente, a solução ideal nesse caso é usar as duas abordagens quando entenderem. Ou se você é fã de grandes números, comece a partir de 1000.

E nas extremidades finais. Não cheguei a essas conclusões completamente sozinho. Na verdade, passo bastante tempo lendo vários manuais de RPG (Hero, DnD). Especialmente, o DnD foi útil, pois opera com princípios semelhantes, mas, em vez de atributos que estão usando níveis para suas fórmulas, eles podem ser um pouco mais complexos. Do que o que apresentei aqui.

De qualquer forma, o melhor conselho é: tente mantê-los o mais simples possível. Não use matemática avançada ou equações longas, pois elas são propensas a erros, difíceis de detectar, quando você precisar lidar com 87234 outras coisas ao mesmo tempo.

Łukasz Baran
fonte
3

Como outros já mencionaram, a fórmula Final Fantasy X é bastante complexa. Geralmente para essa série, quanto mais tarde o jogo, mais complicada é a fórmula. Provavelmente é mais fácil basear sua fórmula de dano em outro jogo completamente. Mas, em geral, acho que vale a pena discutir, de um nível muito geral, que tipo de fórmulas de dano você pode encontrar no mundo e como você pode criar um jogo baseado nelas. A primeira coisa que você precisa decidir é quanto dano você deseja causar no final do jogo e que tipo de estatísticas você deseja que o jogador possa ter? Depois disso, você pode escolher um sistema de fórmula e otimizar os valores da fórmula e da arma para refletir esses intervalos ao longo do tempo.

Puramente baseado em Stat

É uma boa idéia se você quer que seus personagens sejam flexíveis em termos de quais níveis de inimigos eles podem desafiar. Uma fórmula como essa dependerá apenas das estatísticas do jogador, de seus equipamentos e das estatísticas dos inimigos. Essas fórmulas geralmente são bastante simples. Final Fantasy Legend II (veja http://www.shenafu.com/ffl2/weapon.php, por exemplo, tem armas que causam danos com base na fórmula simples:

(Stat+StatBonus)*WeaponStrength - Defense*4

Uma fórmula como essa é boa se você deseja um método muito simples de estimar dano ou um ponto de partida rápido para modificar o dano com base em outros fatores, como habilidades e fraquezas elementares.

Para mostrar quão amplo esse tipo de fórmula pode realmente ser, considere a fórmula de dano para o RPG de inflação, um jogo para Android e IOS (consulte http://inflation-rpg.wikia.com/wiki/Calculations ). A fórmula depende fortemente do status e do equipamento. Cada peça de equipamento possui duas estatísticas - um bônus para a estatística ATK e um valor multiplicador. Algumas peças de equipamento possuem multiplicadores baixos, mas altos bônus, outras possuem bônus baixos, mas altos multiplicadores. Para um personagem com apenas 10 ATK, o Machado de Batalha com seu bônus de 5000 ATK, mas com um baixo multiplicador de 145%, é uma ótima opção. O dano total é (10+5000)*1.45 = 7264, mas o Estoc, com 0 bônus e um multiplicador de 300%, é uma má escolha - o dano é (10+0)*3 = 30. Mais tarde no jogo, um personagem com 5.000 ataques preferiria trocar de arma.

Baseado em estatísticas e níveis:

Um bom exemplo disso é Final Fantasy V, VI e Final Fantasy XII (consulte http://www.gamefaqs.com/ps2/459841-final-fantasy-xii/faqs/45900 , por exemplo). A fórmula para espadas em FFXII é:

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

e a fórmula de dano para pautas é:

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

Eles são muito parecidos, mas observe que a fórmula da espada depende apenas da força e do nível, enquanto a fórmula do bastão depende da força, da magia e do nível. A vantagem desse tipo de fórmula é que ela permite ao jogador duas vias de crescimento - construindo suas estatísticas ou construindo seus níveis. A desvantagem é que também penaliza os personagens nos dois sentidos. O que isso realmente acaba fazendo é permitir que o jogador suba de nível para aumentar sua produção de dano (para FFXII isso significa aumentar sua produção de dano em ~ 4% por nível em torno do nível 50 quando você leva em consideração os ganhos estatísticos) para ajudar a personalizar a dificuldade de seu dano. nível de conforto.

Dano fixo:

As fórmulas de dano fixo não dependem das estatísticas ou do nível do personagem, elas dependem apenas da fórmula de dano interno da própria arma. Eles ainda podem variar ao longo de um intervalo, mas causam o mesmo dano, independentemente do usuário (exceto quaisquer outros efeitos especiais ou traços de caráter). Eles são mais usados ​​se a arma causar dano fixo e a capacidade de equipar a arma depende de estatísticas e / ou nível. Diablo 2, por exemplo, faz isso, assim como muitos roguelikes que possuem armas que dependem de jogadas de dados. Dito isto, 'dano fixo' não implica "não aleatório" - e, de fato, geralmente há algum elemento aleatório no dano causado.

Essa é uma boa metodologia se você deseja ter armas fáceis de transferir entre os personagens ou controlar cuidadosamente a saída de dano que os personagens em determinados pontos do jogo podem fazer se souber a que equipamento eles têm acesso (através de mesas de jogo, baús e roubar tabelas).

Outro lugar que você encontrará é com certos tipos de equipamentos ou itens no Final Fantasy. 1000 agulhas, por exemplo, sempre causam 1000 de dano. Em Final Fantasy Legend II, as artes marciais causam dano com base na fórmula:

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

Final Fantasy XII também corrigiu um pouco os danos das armas, causando dano de acordo com a fórmula:

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

Embora o dano seja um tanto aleatório, ele varia apenas 26,5% no intervalo total, então você garante um certo nível de dano em média ao longo do tempo. Esses tipos de ataques são úteis para personagens que possuem estatísticas baixas e níveis baixos em jogos que normalmente respondem por esses fatores ao causar dano. Além disso, eles ignoram a defesa do alvo (embora a fórmula possa ser facilmente reformulada para caber na defesa, se você desejar).

Foo Barrigno
fonte
2

todos os jogos da série final fantasy tiveram um limite estatístico de 255 por causa do problema que você está enfrentando. no nível 100, as estatísticas seriam 255.

você diz sobre o aumento de estatísticas com habilidades e equipamentos e eu lembro de ter visto isso nos jogos, mas a maneira como isso é feito está na fórmula. há uma etapa extra que verifica se há modificadores de capacidade e equipamento e os aplica depois que as estatísticas foram usadas.

no seu caso, seria a etapa 21: aplicar modificadores de capacidade etapa 22: aplicar modificadores de equipamento etapa 23: dano final.

se você estiver interessado no google para obter fórmulas de final fantasy, elas estão disponíveis. Eu tenho cópias das mecânicas de batalha reais, incluindo IA para final fantasy 4, 6, 7 e 9. as pessoas os quebraram dos jogos originais quando estavam criando roms para emuladores. Não é tão difícil de encontrar se você olhar bastante o suficiente.

a maior coisa para criar fórmulas é testar. configure um script para executar sua batalha ai em ambos os lados e executar várias centenas de batalhas. varie os monstros e as estatísticas e veja se funciona ou se o lv 40 mata tudo, é perfeitamente possível que um chefe seja realmente impossível de matar lol. uma dica seria desativar todas as animações, pois é impressionante a rapidez com que as IA podem combater quando ninguém está assistindo.

Skeith
fonte
2

Fiquei me perguntando como as pessoas realmente desenvolvem fórmulas de danos adequadas que escalam corretamente?

As duas primeiras coisas são:

  • decida o que você quer dizer com 'corretamente' - qual é a sua ideia de 'dano correto'?
  • decida o que você quer dizer com 'escala' - que valores mudarão e que efeito você deseja que essas mudanças tenham?

Depois que você souber disso, terá informações suficientes para usar as fórmulas matemáticas mencionadas pela BlueRaja em sua resposta . Lembre-se de que não existe uma fórmula de dano 'adequada' - apenas uma que corresponda ao seu design para o tipo de experiência que você deseja que seus jogadores tenham.

Kylotan
fonte
Este é um comentário extremamente inútil. Resume "eu não sei" e por isso é um desperdício de tempo de todos. Sinalização para exclusão.
Krythic
1

alternativamente, se você estiver procurando por uma fórmula muito simples, faça o seguinte:

(Observe que essa é minha ideia para uma fórmula)

Primeiro, para uma fórmula simples de ataque, você precisará apenas de algumas estatísticas. Estatística de Ataque do jogador (pode ser Força ou Magia, dependendo do tipo de movimento).

Em seguida, crie uma variável chamada MovePower. Isso dependerá da movimentação, e movimentos melhores teriam um MovePower melhor. Para as minhas fórmulas, os comandos gerais de "Ataque" têm um MovePower de 5.

Em seguida, torne a defesa uma estatística baseada em porcentagem (e, é claro, torne impossível obter 100% de defesa contra danos)

Então, durante a fase de ataque, simplesmente multiplique o status do ataque pelo poder de movimento e remova o dano com base na defesa dos inimigos! simples!

Você também pode optar por ter outros modificadores, como se o movimento for atingido (Precisão), se o movimento tiver outro efeito adicional (Biografia, infligindo veneno) e optar por que ele atinja (Precisão novamente), com dano / atualização / desatualização movimentos que mudam as estatísticas, etc. Divirta-se com isso!

AzelfDestin
fonte
Outra opção que evita a armadura como um problema de percentil (permitindo que seus valores pareçam iguais) é calcular o dano contra a armadura como uma comparação que se torna um multiplicador. Algo como o Ln (atk / def) como base. Isso permite que as estatísticas de armadura defensiva aumentem conforme o tempo passa da mesma maneira. Descubra como obter seu alcance básico de dano desejado para quando as estatísticas de dano e armadura forem as mesmas e extrapolar a partir daí. Isso faz com que os ataques de "evasão de armaduras" exijam um truque para criar, mas isso faz parte do objetivo da criatividade.
Aviose 10/07/2015
1

Em essência, você precisa descobrir duas coisas.

  1. Como pré-formar corretamente a computação com números grandes.
  2. Como você deseja e espera que os danos do ataque se comportem contra oponentes mais fracos e fortes.

1

Você pode usar um usuário doubleou uma grande biblioteca de números. Fazer cálculos com grandes números (como em jogos de clicar / inativo geralmente depende de bibliotecas de números tão grandes). No seu caso, os números são relativamente pequenos, portanto, o uso do ponto flutuante de 64 bits permitirá a flexibilidade necessária.

2

Como você quer que o jogo se comporte? alguns exemplos:

  • Uma abordagem é usar ATKpara decidir se você acerta ou não e rola um dado com uma taxa de dano conhecida, dependendo da arma: por exemplo, espada longa 1d8, espada de duas mãos 1d10, punhal 1d4. Isso não será incrivelmente bem se o hp puder crescer continuamente. Se você usa ATKpara determinar se os personagens acertam ou erram, você pode fazer outro arremesso após um golpe bem-sucedido com ATK* 80% para determinar os crits.
  • Se você quiser usar uma fórmula de dano, a fórmula de dano pode ser tão simples quanto (ATK - DEF) +/- 20%no World End (um jogo de estratégia de RPG). Isso significa que ataques contra um oponente com força DEFnão podem causar nenhum dano. Para instace ATK = 10, ENEMY DEF = 12, (ATK - DEF) = -2e isso também significa que a alta ataque vs ligeiramente inferior def, pouco podia fazer dano, o que poderia tornar as batalhas mais com o aumento da HP. Por exemplo ATK = 1010, com , ENEMY DEF = 1005o dano seria 5. O dano também aumentará dramaticamente agora se o ATKaumento for de uma pequena porcentagem. Por exemplo ATK = 1055, causará 900% a mais de dano, com apenas um aumento de 5% no ATKvalor.
  • Para evitar isso, você pode fazer algo como ATK / DEF * WEAPON_DAMAGEIsso irá dimensionar de forma mais gradual quando ATKou DEFsão aumentados e permitir que um atacante fraco para danificar uma criatura com forte DEF.

Você precisa tratar seus números com responsabilidade e descobrir como deseja que o jogo se comporte em diferentes situações. Algumas perguntas a serem feitas:

  1. Quantos ataques (turnos) devem ser necessários para derrotar aquele chefe / lacaio?
  2. Como diferentes habilidades, buffs, debuffs afetam a xbatalha? Deveria ser impossível, ganhar deve ser y%menos / mais provável?
wolfdawn
fonte