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.
Respostas:
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):
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.
fonte
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.
fonte