Dicas para implementar a mecânica de missões do MMO?

14

Quais ferramentas, padrões ou práticas recomendadas você recomendaria para implementar as mecânicas de missões fornecidas abaixo dos requisitos listados?

Eu estou falando sobre arquitetura de software (quão genérico você deve ser) e opções para fiação de objetos, assinatura de eventos e representação de condições. A menção de ferramentas / bibliotecas que você usou com sucesso é bem-vinda. Editar: se você estiver usando scripts, que configuração você recomenda?

Requisitos:

  • mmo 2D simples (rpg)
  • todos os dados do jogo, incluindo missões, são armazenados em um banco de dados relacional
  • qualquer evento no jogo pode desencadear uma nova missão para os jogadores ou o avanço das missões existentes
  • uma missão pode ter um número arbitrário de condições que devem ser atendidas antes que a missão esteja disponível para os jogadores
  • uma missão pode consistir em um número arbitrário de sub-missões / etapas com condições arbitrárias
  • missões variam de simples:

    fale com A - mate 5 B - fale com A - aumente permanentemente a saúde

  • bastante envolvido:

    use o item na área X - vá para a área Y - um bot irá aparecer - mate o bot sem sofrer mais de 10% de dano - item de drop de bot - pegue o item - desbloqueia o portal - entregue o item para J atrás do portal - receba ouro e experiência - permitir a passagem do portal mais uma vez - bloqueie o portal para este player

  • instâncias de nível são uma possibilidade (os jogadores podem concluir determinadas missões em equipes ou isolamento, o que gerará a localização do nível apenas para esses participantes)

  • As missões devem, de preferência, ser gerenciáveis ​​usando um editor mundial sem conhecimento de scripts ou programação ( Edit: não se opõe a scripts em geral)
  • Eu assumo C ++ como a linguagem de implementação

Eu estava pensando que, se eu pudesse combinar qualquer cadeia de eventos e condições, poderíamos modelar missões mais complexas e, portanto, possivelmente mais envolventes. Eu experimentei rolar meu próprio mecanismo ECA (Events-Conditions-Actions), mas isso pode ser um exagero. Tem sido particularmente difícil modelar condições genéricas sem usar nenhum tipo de script.

jmp97
fonte
Existe algum motivo específico para você optar por pular algum script? (como lua / gamemonkey etc).
Simon
Principalmente devido à falta de experiência e devido a (possivelmente doentias) suposições de como isso pode afetar negativamente o desempenho. Também queria manter a edição mundial o mais simples possível. No entanto, estou aberto para usar scripts.
precisa saber é o seguinte
1
Concordo que, sem o suporte a scripts, será difícil adicionar variedade às missões sem envolver os programadores do mecanismo.
drxzcl
1
As linguagens de script tendem a ser rápidas o suficiente para que não sejam um problema. Eu recomendo fortemente usá-los. Dito isto, grande parte dos scripts do WoW se baseia em disparar feitiços e eventos. "Falar com A", nos bastidores, faria com que A "lançasse um feitiço" no jogador, e a missão seria realmente codificada "isso ocorre quando o feitiço # 55728 é lançado no jogador". Então você só precisa de um pouco de código de IA para fazer as criaturas lançarem feitiços no jogador e pronto.
precisa saber é o seguinte
1
As linguagens de script modernas (como o Lua Vm) provavelmente são rápidas o suficiente para você. Eles são fáceis de usar, fáceis de implementar, você pode recarregar os scripts em tempo de execução, depurar e executar os scripts em tempo de execução e iterar MUITO mais rápido ao criar conteúdo. Eu sugiro fortemente que procure um mecanismo de script (exemplos: lua e gamemonkey) para fazer scripts de missões.
10138 Simon

Respostas:

6

Primeiro um aviso, depois alguns conselhos.

Na última vez em que precisei implementar um sistema como esse, não estava usando um mecanismo originalmente destinado a aplicativos semelhantes a MMO. O sistema de missões que ele acompanhava era voltado para empreendimentos para um jogador e não podia ser usado.

Acabei tendo que encher scripts de todos os objetos envolvidos nas missões mais ou menos à mão, como este (pseudocódigo):

Lever004_on_activate() {
    if isOnQuest(player, QUEST_0012) do_something();
    if isOnQuest(player, QUEST_0015) do_something_else();
}

Este é um pesadelo completo. Não há como descobrir como a missão funciona sem passar por todo o jogo. Não faça isso.

Eu recomendaria a criação de um sistema em que toda a busca (linha) seja representada como uma máquina de estados finitos, com eventos para verificar se há transições e scripts para reagir à referida transição. Isso facilita o rastreamento de onde você está em uma determinada missão (linha) e mantém todo o estado da missão bem encapsulado.

Se desejar, você pode criar uma biblioteca de scripts / modelos de script em seu editor mundial para ocorrências comuns (o jogador conversa com o NPC, o jogador mata a multidão etc.)

Eu não me preocuparia muito com o desempenho do script, desde que você não inicie seus scripts de eventos com muita frequência. Como regra geral, os scripts devem disparar pelo menos uma ordem de magnitude menor que a lógica do jogo "principal" (animação, física etc.). Eles devem reagir a eventos, em vez de disparar periodicamente para verificar se uma condição foi atendida.

drxzcl
fonte
3
Entretanto, esteja avisado: as máquinas de estado tendem a ser muito complicadas muito rapidamente se você deseja que os caminhos das missões sejam influenciados por fatores externos ou se suas missões são relativamente complexas. Além disso, várias máquinas de estado de missão (se várias missões podem estar ativas) podem ser um pesadelo. No entanto, como em essência todo programa é uma máquina de estado, isso pode ser feito. Mas problemas complexos permanecem complexos, não importa como você os encapsule. Um bom exemplo (imo) é o Oblivion, onde alguns mods impedem que outros funcionem - suas pré e pós-condições para os estados devem ser bastante sólidas ou extremamente tolerantes / tolerantes a erros.
Kaj
Sim, kaj está certo. Basta ir até os fóruns do WoW agora e ler sobre pessoas reclamando de missões inacabáveis. Isso acontece o tempo todo, mesmo na liga principal. É realmente difícil fazer tudo certo.
Drxzcl
3

Nosso sistema basicamente envolve a execução de uma expressão (linguagem de mini script personalizada, mas tcl / lua / python funcionaria da mesma forma ou criaria algo a si mesmo) cada quadro de servidor para cada etapa da missão. Isto é para "missões pessoais" que estão vinculadas a um jogador específico. Cada subetapa faz parte de um FSM (máquina de estado finito) para a própria missão (que pode ser apenas uma subetapa de outra missão). Também existem "missões de mapas" que possuem um único FSM e estão vinculadas ao mapa em vez de um jogador (pense nas missões públicas do WAR), mas as subetapas funcionam basicamente da mesma forma.

O que essas expressões realmente analisam são eventos transmitidos pelo sistema como "NPC morreu" ou "interação concluída". Isso significa que você pode desacoplar as várias partes, os sistemas de jogabilidade enviam eventos conforme necessário, que os scripts da missão apenas escutam os eventos e não se preocupam com a origem deles. Se você também incluir isso, poderá fazer com que os FSMs da missão interajam com o estado mundial (apenas mostre esse contato quando estiver no estado X da missão), você poderá obter muita energia do sistema.

coderanger
fonte