¿Cómo gestionar diferentes velocidades de acción en los juegos RogueLike?

14

¿Cómo gestionar diferentes velocidades de acción en los juegos RogueLike?

Lo que quiero decir es que los juegos por turnos pueden tener actores que actúan a una "velocidad" diferente, dependiendo de la acción y algunas otras características. Los actores realizan efectivamente más acciones / turnos que otros si tienen mayor velocidad o no.

¿Cómo determinar cuándo un actor debe ser capaz de actuar (programación de turnos)?

Parece que hay diferentes formas de hacerlo? ¿Puedes explicar algunos con algoritmos?

Klaim
fuente
77
Tengo la sensación de que si describe en detalle las características que desea, un algoritmo se volverá obvio.
Tetrad
Como dijo Tetrad, ¿qué quieres decir con "velocidad de las acciones"? Los Roguelikes suelen estar basados ​​en turnos, así que no puedo ver cómo esto podría aplicarse a ellos.
Laurent Couvidou
2
Incluso en juegos basados ​​en turnos, algunas entidades se moverán más rápido o más lento que otras, teniendo más o menos turnos en comparación con las otras. Arregle la pregunta.
Klaim
3
@Patrick Hughes Nethack, uno de los roguelikes más antiguos y populares, tiene un atributo de velocidad muy importante. nethackwiki.com/wiki/Speed
Harry Stern
1
@HarryStern ¿He estado jugando mal todo este tiempo? Eso podría explicar algunas cosas ... =)
Patrick Hughes

Respuestas:

12

En mi juego roguelike Tyrant utilicé un sistema de puntos de acción y clasificaciones de velocidad.

Básicamente:

  • La mayoría de las acciones tuvieron un costo AP de 100
  • La mayoría de las criaturas tienen una velocidad de 100

Entonces el ciclo del juego sería como sigue.

  • Hero realiza una acción.
  • El tiempo transcurrido se calcula como hero action AP cost * 100 / hero speed
  • Todas las criaturas reciben AP iguales a creature speed * elapsed time / 100
  • Las criaturas toman acciones y restan AP hasta que sus AP sean <= 0
  • Repetir

Este sistema funcionó muy bien en general, por ejemplo, buenas características:

  • Si tienes un héroe muy rápido (tal vez debido a una bonificación de velocidad mágica), puedes obtener varios movimientos antes de que una criatura individual pueda moverse (sus AP serían negativos durante unos pocos turnos porque el tiempo transcurrido sería pequeño)
  • Puede hacer que algunas acciones sean más o menos costosas variando el costo AP
  • Puedes retrasar a las criaturas restando AP, o darles un impulso repentino añadiendo AP
mikera
fuente
Tratando de entender esto. Si tienes 1 jugador y 4 jugadores. Esto no hace que el último jugador apile el tiempo transcurrido cada vez más. ¿Permitirle tomar tal vez 4 acciones y la segunda vez alrededor de 8 seguidas?
Dr.Denis McCracleJizz
4

Puntos de acción. Dele a cada entidad una "velocidad" para que los actores más rápidos obtengan más puntos en cada turno. Haz que cada acción tome un número específico de puntos para completar, y resta ese número de los puntos del jugador para ese turno cuando realiza una acción. Si una acción toma más puntos de los que le quedan al jugador, márquela como "parcialmente completada" y deje que termine el próximo turno.

Wackidev
fuente
2

¿Te refieres a que las acciones tomen múltiples turnos (es decir, dormir 50 turnos seguidos)?

Lo que haría es mantener un objeto, player.currentAction. currentAction puede contener cuántos turnos requeriría la acción, cuál es la resolución de la acción y una lista de estados que cancelan la acción (en peligro, siendo atacado, demasiado caliente, etc.). Cada turno, antes de verificar la entrada del jugador, verificamos si el jugador estaba actualmente en el medio de una acción, luego hacemos 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;
}
Algún chico
fuente
2

Puedes ir con puntos de acción pero sin giros per se sino ticks, que son mucho más pequeños. Supongamos que cada actor tiene una velocidad de acumulación de puntos de acción (por ejemplo, 2 AP por tic). Comienza una acción que vale, digamos, 10 AP. El juego avanza 5 ticks hacia adelante (porque esto es lo que le toma al actor pagar el precio AP de la acción).

Cuando hay varios actores. El juego avanza tick por tick hasta que alguien haya pagado el precio AP en el momento en que se ejecuta esta acción.

El enfoque es similar al de @ mikera, solo que no hay AP negativos.

zzandy
fuente
Esto es mucho más complicado, ya que necesitas almacenar la acción "prevista" de la criatura. Algunas acciones dependen del estado que puede cambiar antes de que la mafia haya acumulado suficientes puntos.
Warwick Allison
Tal vez no sea perfecto, pero refleja la vida real, cuando decides golpear, primero balanceas y luego golpeas, por lo que es la decisión-preparación-acción, que es lo que permite este sistema. Además, esto permite elegir la acción de bloqueo en función de la situación real.
zzandy
Prefiero ir en la otra dirección: la mafia elige una acción con el costo de n-ticks y luego no puede elegir una nueva acción hasta que transcurran n-ticks. Se puede implementar como un valor único que se reduce en cada marca.
kitsu.eb
-1

Tiempo de alta resolución

Si el golpe toma 400 vueltas, y la patada toma 1000 vueltas, puedo golpearte al menos dos veces antes de que me patees, y puedo golpearte 5 veces para cuando me patees dos veces.

Al hacer que las cosas tomen muchas vueltas, tienes mucho control sobre cuánto tiempo tardan las cosas.

Cabra Willy
fuente