Como gerenciar diferentes velocidades de ação nos jogos do RogueLike?

14

Como gerenciar diferentes velocidades de ação nos jogos do RogueLike?

O que quero dizer é que jogos baseados em turnos podem ter atores agindo em uma "velocidade" diferente, dependendo da ação e de algumas outras características. Os atores efetivamente realizam mais ações / turnos do que outros se tiverem maior velocidade ou não.

Como determinar quando um ator deve ser capaz de agir (agendar turnos?)?

Parece que existem diferentes maneiras de fazer isso? Você pode explicar alguns com algoritmos?

Klaim
fonte
7
Tenho a sensação de que, se você descreveu em detalhes os recursos que deseja, um algoritmo se tornará óbvio.
Tetrad
Como Tetrad disse, mais o que você quer dizer com "velocidade das ações"? Roguelikes são tipicamente baseados em turnos, então não consigo ver como isso poderia se aplicar a eles.
Laurent Couvidou
2
Mesmo em jogos baseados em turnos, algumas entidades se movem mais rápido ou mais devagar que outras, tendo mais ou menos turnos em comparação com as outras. Eu consertei a pergunta.
Klaim
3
@Patrick Hughes Nethack, um dos roguelikes mais antigos e populares, tem um atributo de velocidade muito importante. nethackwiki.com/wiki/Speed
Harry Stern
1
@HarryStern Estive jogando mal esse tempo todo? Isso pode explicar algumas coisas ... =)
Patrick Hughes

Respostas:

12

No meu jogo roguelike Tyrant , usei um sistema de pontos de ação e classificações de velocidade.

Basicamente:

  • A maioria das ações teve um custo de PA de 100
  • A maioria das criaturas tem uma velocidade de 100

Então o loop do jogo seria o seguinte.

  • O herói toma uma ação.
  • O tempo decorrido é calculado como hero action AP cost * 100 / hero speed
  • Todas as criaturas recebem APs iguais a creature speed * elapsed time / 100
  • As criaturas realizam ações e têm APs subtraídos até que os APs sejam <= 0
  • Repetir

Este sistema funcionou muito bem no geral, como bons recursos:

  • Se você tiver um herói muito rápido (talvez devido a um bônus de velocidade mágico), poderá fazer vários movimentos antes que uma criatura individual possa se mover (seus PAs seriam negativos por alguns turnos porque o tempo decorrido seria pequeno)
  • Você pode tornar algumas ações mais ou menos caras, variando o custo do ponto de acesso
  • Você pode atrasar as criaturas subtraindo APs ou dar um impulso repentino e único adicionando APs
Mikera
fonte
Tentando envolver minha cabeça em torno disso. Se você tem 1 e 4 jogadores. Isso não faz com que o último jogador passe cada vez mais. Permitindo que ele tome talvez 4 ações e a segunda vez por volta de 8 em uma fila ??
você precisa saber é o seguinte
4

Pontos de ação. Dê a cada entidade uma "velocidade" para que atores mais rápidos obtenham mais pontos a cada turno. Faça com que cada ação tome um número específico de pontos para completar e subtraia esse número dos pontos do jogador naquele turno quando ele executar uma ação. Se uma ação requer mais pontos do que o jogador deixou, marque-a como "parcialmente concluída" e deixe-a terminar no próximo turno.

Wackidev
fonte
2

Você quer dizer que as ações têm várias voltas (ou seja, dormir por 50 voltas seguidas)?

O que eu faria é manter um objeto, player.currentAction. currentAction pode conter quantas voltas a ação exigiria, qual é a resolução da ação e uma lista de estados que cancelam a ação (em perigo, sendo atacada, muito quente etc.). A cada turno, antes de verificarmos a entrada do jogador, verificamos se o jogador está atualmente no meio de uma ação e, em seguida, fazemos algo como algo como ...

if(!player.currentAction.interrupted())
{
 if(player.currentAction.complete() == true)
   {
    player.currentAction.doAction(); //Some actions, like casting a spell, would have something happen here. Others, like sleeping, may or may not, depending on how you coded it.
    player.currentAction = null;
   }
else player.currentAction.decreaseTimer(); //Decrease our timer by one.
}
else 
{
 player.currentAction.interrupt(); //Let the player know he's been interrupted. Bungle the spell, cancel sleep, etc.
 player.currentAction = null;
}
SomeGuy
fonte
2

Você pode ir com pontos de ação, mas sem turnos em si, mas ticks, que são muito menores. Suponha que todo ator tenha velocidade de acumulação de pontos de ação (por exemplo, 2 PA por tick). Inicia uma ação no valor de, digamos, 10 AP. O jogo avança 5 ticks para a frente (porque é o quanto é necessário para o ator pagar o preço de AP da ação).

Quando existem vários atores. O jogo avança tick a tick até que alguém pague o preço do PA no momento em que essa ação é executada.

A abordagem é semelhante à do @ mikera, apenas não há APs negativos.

zzandy
fonte
Isso é muito mais confuso, pois você precisa armazenar a ação "pretendida" da criatura. Algumas ações dependem do estado que pode mudar antes que a multidão tenha acumulado pontos suficientes.
Warwick Allison
Talvez não seja perfeito, mas reflete a vida real, quando você decide bater, primeiro balança e depois bate - então é a ação de preparação da decisão, que é o que esse sistema permite. Isso também permite escolher a ação do bloco com base na situação real.
Zzandy
Eu prefiro ir na outra direção: mob escolhe uma ação com custo de n-ticks e não pode escolher uma nova ação até que n-ticks transcorram. Ele pode ser implementado como um valor único decrementado em cada marca.
Kitsu.eb
-1

Tempo de alta resolução

Se o soco der 400 voltas e chutar der 1000 voltas, eu posso dar um soco em você pelo menos duas vezes antes de me chutar, e eu posso dar um soco em você cinco vezes quando você me chutar duas vezes.

Fazendo as coisas darem muitas voltas, você tem muito controle sobre quanto tempo as coisas demoram.

Willy Goat
fonte