Critical hits são comuns em muitos jogos. Hoje vou discutir o processo de pensamento e matemática por trás do cálculo de acertos críticos no próximo atirador Super Monday Night Combat.
Precedentes seguintes
O que são os “critical hits”? Como eles funcionam? Normalmente há alguma chance de um crit causar um ataque para tratar de algumas porcentagens extras de danos. Valores comuns têm entre 1% e 30% de chance de fazer um crit e entre 35% e 300% de chances de dano extra. Em um RPG, isso funciona como o esperado. Para cada balanço da espada, você rola os dados mágicos geradores de números aleatórios e verifique se há crit1¹.
O Team Fortress 2 tem um sistema crítico2 interessante. As armas têm cerca de 2% de chances de fazer um crit – e essas chances aumentam de acordo com os danos com os quais o jogador for lidando. Armas de disparo lento (shotgun) buscam por um crit com cada tiro semelhante a uma espada de RPG. Armas de disparo rápido (uzi) verificam uma vez por segundo e realizam o crit em duas explosões secundárias.
Lembre-se de suas unidades
O sistema crit TF2 Rapid Fire é interessante. Os crits estão quase causando dano de ruptura. Uma mini arma dispara 10% de suas balas com crits uniformemente distribuídos, o que significa menor explosão e muito mais ganho de DPS. Uma janela crit de dois segundos é perfeita para causar um dano de ruptura. No entanto, possui um ligeiro problema: rajadas que têm 10% de chances de realizar um crit realmente importam. Quantas balas são disparadas criticamente? É 50% ou algum outro número? Vamos pensar sobre isso!
Suponha um tempo de crit de dois segundos, uma chance de 50% de realizar um crit e um intervalo de um segundo para fazer a checagem do crit. Em média, o jogador vai falhar na primeira jogada de dados, quando eles começarem a atirar, e passarão para a segunda jogada depois de um segundo. O dado não é jogado durante um tiroteio crítico. Depois de dois segundos do tiroteio crítico jogamos o dado³. Um segundo depois, em média, há outro tiroteio crítico. Com 50% de chance, o padrão é um segundo para o regular, dois segundos para realizar o crit, um segundo, regular, dois segundos para realizar o crit. Esses 50% magicamente se tornam 66%!
O número de balas críticas não é exatamente igual à chance listada de realizar um crítico e varia de acordo com a duração do crit. Até mesmo a taxa de disparos da arma importa potencialmente, dependendo de quando os seus dados são jogados Uma arma slow-ish, que dispara a cada nove segundos pode disparar duas ou três vezes dentro de uma janela de dois segundos para realizar o crit. Isso não significa que TF2 seja errado. Significa apenas que o verdadeiro efeito da chance de realizar um crit é variável e ofuscado.
Algo mais simples
Para Super Monday Night Combat nós estabelecemos algumas metas. Em primeiro lugar, o percentual de crit deve representar o número de balas que causam dano críticos, não importando a arma. Em segundo lugar, os crits não devem ser prorrogados de maneira a não rolar os dados mid-crit. Em terceiro lugar, os crits podem ocorrer imediatamente um após o outro. Não há “tempo morto”. Finalmente, queremos um sistema para governá-los todos! Quanto mais fácil de entender, mais fácil de manter.
Em nosso exemplo anterior, a chance de realizar um crit era de 50% e teve aumentou para 66%. Isto significa que há um número misterioso que gera uma taxa efetiva de 50% de crit. Podemos achar esse número com a matemática!
CritChance = balance_number; // [0,1] percentage
FireRate = balance_number; // Bullets per sec
CritDuration = balance_number; // In seconds
critChancePerBullet = CritChance;
bulletsPerMinute = (FireRate * 60);
critBulletsPerMinute = (critChancePerBullet * bulletsPerMinute);
bulletsPerCrit = (1 + int(bulletsPerSecond * CritDuration));
critsPerMinute = (critBulletsPerMinute / bulletsPerCrit);
nonCritBulletsPerMinute = (bulletsPerMinute - (critsPerMinute*bulletsPerCrit));
critChecksPerMinute = nonCritBulletsPerMinutes;
realCritChancePerCheck = (critsPerMinute / critChecksPerMinute);
Uma parede de matemática, viva! Vamos repassar os números das linhas interessantes:
- 1-3: Os valores definidos por um designer que variam por arma;
- 6: Matemática é feita em um espeço de minuto, pois é mais fácil de visualizar duas verficações por minuto ao invés de .0333 verificações por segundo. O cancelamento é um um exercício para o leitor;
- 8: O termo 1 é porque, pelo menos, uma bala vai disparar um crit, mesmo com uma CritDuration de 0. O elenco int é para truncar, já que as balas fracionárias não existem;
- 10: Este é o lugar onde a magia acontece! Queremos verificar se há um crit para cada bala, exceto aqueles que já estão em estado crítico. Sabemos que tem muitas balas que queremos saber se são críticas, para que assim possamos calcular o número de balas não críticas – que também é o número de vezes que vamos verificar a existência do crit. Linha 11 é desnecessária, mas dá uma clareza maior ao artigo;
- 12: As peças estão no lugar e a chance de realizar um crit para cada jogada de dados pode ser facilmente calculada4.
Isto irá resultar em um realCritChancePerCheck que causa uma porcentagem de CritChance de balas para ser disparadas criticamente, não importa a chance de realizar o crit, a taxa de disparos, ou a duração do crit.
Conclusão
Este é um exemplo específico de um trabalho que fiz na semana passada. Ele corrigiu alguns bugs, simplificou um sistema, e produziu um resultado que é fácil de compreender o que leva a um melhor equilíbrio mais rapidamente. Diverti-me sentado com um pedaço de papel para resolver a equação e senti que era interessante o suficiente para compartilhar. Não é uma solução mágica para todos os jogos, mas funciona para o nosso.
Uma questão para os leitores: como você calcula os acertos críticos em seu jogo? Quais métodos você considerou úteis?
Notas de rodapé
- Como você rola os dados que é um post em si. Existem várias estratégias para evitar rupturas extremas que podem e vão acontecer. A proporção “uma em um milhão” não é tão rara em World of Warcraft, que tem 10 milhões de jogadores;
- http://wiki.teamfortress.com/wiki/Critical_hits
- Poderia haver um tempo mínimo após uma queima crítica para não gerar um crit, mas isso apenas complica ainda mais a equação;
- critChecksPerMinute será zero, ou negativo (o que é ruim) se o CritChance for >= 1.0.
***
Texto original disponível em: http://www.altdevblogaday.com/2011/11/12/calculating-crit-in-a-shooter/