Recursos de arquitetura do sistema de batalha JRPG baseados em turnos

9

Nos últimos meses, estive ocupado programando um JRPG 2D (RPG de estilo japonês) em C ++ usando a biblioteca SDL. O modo de exploração está mais ou menos concluído. Agora estou enfrentando o modo de batalha.

Não consegui encontrar recursos sobre como está estruturado um sistema clássico de batalha JRPG baseado em turnos. Tudo o que encontro são discussões sobre a fórmula de danos. Tentei pesquisar no Google, pesquisar no quadro de mensagens de gamedev.net e pesquisar nas questões relacionadas ao C ++ aqui no Stack Exchange. Eu também tentei ler o código fonte dos RPGs de código aberto existentes, mas sem um guia de algum tipo é como tentar encontrar uma agulha no palheiro.

Não estou procurando um conjunto de regras como D&D ou algo semelhante. Estou falando puramente sobre design de estrutura de código e objeto. Um sistema de batalha pede que o jogador insira usando menus. Em seguida, o turno da batalha é executado conforme os heróis e os inimigos executam suas ações.

Alguém pode me apontar na direção certa? Desde já, obrigado.

BenoitRen
fonte
4
não há regras comuns definidas. Todos os jogos têm seu próprio caminho, a menos que falemos de conjuntos de regras derivadas de masmorras e dragões. Devo dizer que não tenho muita certeza se é isso que você quis dizer. Elaborar.
Toni
O que você quer dizer com JRPG exatamente?
Ashes999
2
Por que você não define primeiro o que deseja que o player experimente e depois escreve uma especificação de implementação com base nisso?
Tetrad
11
@ ashes999 O exemplo clássico mais influente é provavelmente a série Ultima. Outros exemplos mais recentes e populares: a série Baldur's Gate (BG2 é freqüentemente considerada o melhor CRPG de todos os tempos) ou a série The Elder Scrolls (Morrowind, Oblivion, Skyrim, em particular por sua fama).
David Gouveia
11
"Um sistema de batalha pede ao jogador a entrada usando menus. Em seguida, o turno da batalha é executado quando os heróis e os inimigos executam suas ações." Você parece ter uma alça no algoritmo. Então ... o que exatamente você está procurando? Conselhos sobre como estruturar seu código? Além disso, o que é um " sistema de batalha JRPG clássico baseado em turnos "? Você sabe, existem mais de um JRPG clássico e muitos deles têm sistemas de batalha muito diferentes. Então, o que exatamente você está tentando realizar?
Nicol Bolas

Respostas:

9

Também nunca vi muitos recursos sobre esse assunto, mas o melhor que encontrei é provavelmente o:

Ele fornece informações sobre a IA do inimigo, como esta:

AI: Setup
{
   TempVar:TurnsUntilGrenade = 3
   TempVar:GrenadeAmmo = 4
}
AI: Main
{
   If (Stage == 0) Then
   {
      If (TempVar:TurnsUntilGrenade == 0) Then
      {
         If (TempVar:GrenadeAmmo > 0) Then
         {
            Choose Random Opponent with Lowest HP
            Use Hand Grenade on Target
            TempVar:GrenadeAmmo = TempVar:GrenadeAmmo - 1
            TempVar:TurnsUntilGrenade = 3
         } Else {
            Choose Random Opponent with Lowest HP
            Use <Machine Gun> on Target
         }
      } Else {
         Choose Random Opponent
         Use <Machine Gun> on Target
         TempVar:TurnsUntilGrenade = TempVar:TurnsUntilGrenade - 1
      }
   } Else {
      If (TempVar:GrenadeAmmo > 0) Then
      {
         Choose Random Opponent with Lowest HP
         Use Hand Grenade on Target
         TempVar:GrenadeAmmo = TempVar:GrenadeAmmo - 1
      } Else {
         Choose Random Opponent
         Use <Machine Gun> on Target
      }
   }
}
AI: Counter - General
{
   If (Grenade Combatant's HP <= 3 * [Grenade Combatant's Max HP / 4]) Then
   {
      Stage = 1
   } Else {
      Stage = 0
   }
}

Com isso, você pode ver que seus inimigos provavelmente precisarão de uma máquina de estado para gerenciar os diferentes estados em que estão, e cada estado terá seu próprio comportamento para executar cada turno, codificado no inimigo ou orientado a dados por um script língua.

Existe muita variação mesmo entre JRPGs baseados em turnos, portanto, não há um conjunto de regras para todos eles. Por exemplo, você pode emitir todos os comandos de terceiros antes que algum deles ocorra ou eles podem ocorrer imediatamente após a escolha. A ordem de ataque pode ser aleatória ou, mais frequentemente, determinada pela estatística Speed.

Mas, por exemplo, digamos que você tenha um sistema de batalha puramente baseado em turnos, onde você emite todos os comandos do grupo primeiro e, em seguida, toda a ação acontece no final do turno. Você pode abordá-lo como:

  • Armazene todas as entidades (jogadores + inimigos) que participam da batalha em uma lista.
  • Para cada jogador da lista, insira e armazene.
  • Classifique a lista de entidades pelo atributo Velocidade.
  • Para cada entidade da lista, se for um jogador, execute a ação armazenada, caso contrário, execute o script AI para o estado atual.
  • Avance a curva e repita.

As Perguntas frequentes sobre mecânica de batalha também contêm muitas informações úteis, principalmente sobre gerenciamento de tempo nas batalhas. Infelizmente, esse sistema (também conhecido como ATB ou Active Time Battle) é patenteado, portanto você não pode fazer nada parecido.

EDIT Também encontrei recentemente este site, que fornece muitas informações técnicas sobre a implementação do FF7. Infelizmente, as seções do módulo de batalha ainda não parecem completamente escritas.

David Gouveia
fonte